内网自建Postfix使用Python发送邮件

在内网自建的 Postfix 服务器上,使用 Python 发送邮件非常简单。核心思路是:Python 通过 smtplib****连接本机的 Postfix 服务( localhost:25**),然后将邮件交给它处理**。Postfix 会负责后续的投递工作

下面是一个最简可用的代码示例:

复制代码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# 1. 配置发件人、收件人和邮件内容
sender = "alert@your-domain.com"      # 发件人地址
receiver = "admin@example.com"        # 收件人地址
subject = "服务器告警"
body = "这是一封来自内网服务器的测试邮件。"

# 创建邮件对象
msg = MIMEMultipart()
msg["From"] = sender
msg["To"] = receiver
msg["Subject"] = subject
msg.attach(MIMEText(body, "plain", "utf-8"))

# 2. 连接本地 Postfix 并发送
try:
    # 关键:连接本机的 SMTP 端口 25,无需账号密码[citation:4][citation:8]
    with smtplib.SMTP("localhost", 25) as server:
        server.sendmail(sender, [receiver], msg.as_string())
    print("邮件已成功交给 Postfix 发送")
except Exception as e:
    print(f"发送失败: {e}")

🔍 关键点说明

  1. 无需认证 :连接 localhost:25 时,Postfix 默认信任本机连接,因此 smtplib.SMTP() 中不需要 login() 步骤。
  2. 端口选择 :内网自建 Postfix 通常监听 25 端口。如果需要 TLS 加密,可配置 587 端口并启用 starttls(),但在纯内网环境中通常没必要。
  3. 收件人域名:如果邮件需要发送到外网(如 QQ、Gmail),必须确保你的服务器域名有正确的 DNS(MX、SPF 等)配置,否则邮件可能被拒收或进入垃圾箱。仅内网收发则无需担心。

🚀 进阶:发送 HTML 邮件或添加附件

Postfix 本身不关心邮件内容格式,你可以在 Python 中自由构建。下面是一个支持 HTML 正文和附件的示例框架:

复制代码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# 创建支持附件的邮件对象
msg = MIMEMultipart()
msg["From"] = "sender@example.com"
msg["To"] = "receiver@example.com"
msg["Subject"] = "带附件的报告"

# HTML 正文
html = "<h1>报告</h1><p>这是本月的数据汇总。</p>"
msg.attach(MIMEText(html, "html", "utf-8"))

# 添加附件
filename = "report.pdf"
with open(filename, "rb") as f:
    part = MIMEBase("application", "octet-stream")
    part.set_payload(f.read())
    encoders.encode_base64(part)
    part.add_header("Content-Disposition", f"attachment; filename={filename}")
    msg.attach(part)

# 发送(同样连接 localhost:25)
with smtplib.SMTP("localhost", 25) as server:
    server.send_message(msg)

❗ 常见问题

  • 连接被拒绝 :检查 Postfix 是否运行,以及 main.cfinet_interfaces 是否包含 localhost127.0.0.1
  • 邮件发送成功但收不到 :查看 /var/log/mail.log,确认 Postfix 是否将邮件投递出去。如果是发往外部,检查 DNS 和反向 DNS 配置。
  • 被标记为垃圾邮件:内网邮件被外部邮箱拒收很常见,建议配置 SPF、DKIM 记录,或通过中继转发。

如果你打算将这个功能集成到 Django/Flask 等 Web 应用中,只需要把上面的 smtplib 代码放到对应的视图或后台任务里即可,核心逻辑完全一致。

相关推荐
码兄科技5 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
Drone_xjw7 小时前
从 GDB 到 CDB:C/C++ 程序调试的两把“手术刀”
c语言·开发语言·c++
SL-staff7 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
聪明的一休丶8 小时前
VLLM v0.24.0 版本深度解析:新引擎、新架构与大规模服务全家桶升级
python·架构·vllm
2zcode9 小时前
基于MATLAB图像处理的饮料瓶灌装液位检测系统设计与实现
开发语言·图像处理·matlab
万亿少女的梦1689 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
必须得开心呀10 小时前
QT解决中文乱码问题
开发语言·qt
闲猫10 小时前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
这不小天嘛11 小时前
JAVA八股——redis篇
java·开发语言·redis
逝水无殇12 小时前
C# 字符串(String)详解
开发语言·后端·c#