能否仅通过Python包实现DKIM或SPF邮件认证?
解决方案:纯Python实现DKIM签名及SPF适配
DKIM签名(纯Python实现)
可以用dkimpy这个纯Python包完成DKIM签名,不需要依赖外部MTA,仅需提前在你的发件域名DNS中配置好DKIM公钥(这是DKIM认证的必要前提,收件方会通过DNS查询公钥验证签名)。
操作步骤:
- 安装
dkimpy:
pip install dkimpy
- 在代码中对已构建的
EmailMessage对象进行签名:
import dkim # 假设已创建好邮件对象email_msg = EmailMessage() # 加载DKIM私钥(建议用文件存储,打包时需将私钥文件一同分发) with open("dkim_private_key.pem", "rb") as f: private_key = f.read() # 配置DKIM参数 dkim_config = { "privkey": private_key, "domain": "your-sender-domain.com", # 发件邮箱对应的域名 "selector": "your-dkim-selector", # 域名DNS配置时使用的DKIM选择器 "headers": ["From", "To", "Subject", "Date"], # 需要签名的邮件头字段 } # 生成签名并添加到邮件头 dkim_signature = dkim.sign(email_msg.as_bytes(), **dkim_config) email_msg["DKIM-Signature"] = dkim_signature.decode().strip()
- 完成签名后,再通过
smtplib.SMTP发送邮件即可。
SPF相关说明
SPF并非通过Python代码实现,它是域名DNS中的一条TXT记录,用于声明哪些IP地址被授权发送该域名的邮件。你当前直接从客户端IP发件,若该IP不在发件域名的SPF记录中,Gmail等服务商就会判定SPF认证失败。
适配方案:
- 若用户使用固定IP:在发件域名的DNS中添加SPF记录,包含这些固定IP(例如
v=spf1 ip4:192.168.1.100 -all)。 - 若用户使用动态IP:这种场景下直接发件很难通过SPF认证,建议优先通过DKIM签名提升邮件可信度,或者权衡是否引入第三方SMTP服务(但这会增加外部依赖)。
打包注意事项
用PyInstaller打包时,dkimpy作为纯Python包可被直接打包,需注意将DKIM私钥文件作为资源一同分发,代码中通过相对路径或打包后的资源路径读取私钥。
内容的提问来源于stack exchange,提问作者Manngo
相关产品推荐
相关产品推荐

