如何确保用Django EmailMessage类发送的邮件不进入垃圾邮件箱?
如何避免Django发送的带PDF附件邮件被归入垃圾邮件
很高兴帮你解决这个问题!结合你给出的Django邮件配置和发送代码,我整理了几个关键的优化方向,帮你提升邮件的投递信誉:
1. 统一发件人信息并配置域名邮件认证(核心!)
邮件服务商最看重的就是邮件来源的可信度,这一步是避免进垃圾邮件的基础:
- 对齐发件人和SMTP认证邮箱:你代码里的
from_email用了user@domain.com,但settings.py里的EMAIL_HOST_USER是me@domain.com,这两个必须保持一致!不一致的发件人会被系统判定为可疑。修改代码里的发件人:email.from_email = 'Full Name <me@domain.com>' - 配置SPF记录:在你的域名
domain.com的DNS中添加一条TXT类型的SPF记录,声明允许mail.domain.com发送该域名的邮件。示例内容:
(具体规则请参考你的邮件服务商文档,比如如果是第三方邮件服务,要替换成他们指定的SPF值)v=spf1 include:mail.domain.com ~all - 配置DKIM签名:DKIM会给邮件添加数字签名,让收件方验证邮件未被篡改。联系你的邮件服务商获取DKIM密钥,然后在域名DNS中添加对应的TXT记录。
- 配置DMARC规则:DMARC会告诉收件方如何处理SPF/DKIM验证失败的邮件,示例记录:
这个规则会把验证失败的邮件放入隔离区,同时把报告发送到指定邮箱,帮助你监控邮件投递情况。v=DMARC1; p=quarantine; rua=mailto:dmarc@domain.com
2. 优化邮件内容格式
邮件内容的合理性也是判断是否为垃圾邮件的重要依据:
- 添加HTML版本内容:纯文本邮件更容易被标记为垃圾邮件,建议同时提供HTML格式的正文。用
attach_alternative方法添加:plain_body = self.request.GET.get('email_body', '') html_body = f"<p>{plain_body}</p>" email.body = plain_body email.attach_alternative(html_body, "text/html") - 谨慎设置主题和正文:主题避免使用“免费”“紧急”“限时”这类垃圾邮件高频词汇,也不要全大写;正文里如果有用户输入的内容(比如你的
email_body),要做敏感词过滤,防止用户输入可疑内容。 - 明确提及附件:在正文里说明“请查收附件中的PDF文档”,让系统知道附件是预期内容,减少被判定为恶意附件的概率。
3. 优化PDF附件的细节
带附件的邮件更容易触发垃圾邮件规则,注意这些细节:
- 控制附件大小:尽量把PDF控制在10MB以内(不同邮箱服务商限制不同),过大的附件会被直接拦截。
- 使用有意义的文件名:不要用
document.pdf这类通用名称,改成和邮件内容相关的名字,比如demo_contract_2024.pdf。 - 确保PDF内容合规:避免PDF里包含大量广告、可疑链接或敏感内容,这些都会连累邮件被标记。
4. 测试与监控
- 本地测试邮件结构:在开发环境中使用
django.core.mail.backends.console.EmailBackend查看邮件的完整内容,确保发件人、收件人、附件等字段都正确。 - 用测试工具评分:发送测试邮件到专业的邮件测试工具,它会给出详细的信誉评分和改进建议,帮你排查SPF/DKIM配置问题或内容中的垃圾邮件特征。
- 控制发送频率:如果是批量发送邮件,不要短时间内发送大量邮件,建议用Celery等异步任务队列来控制发送速率,避免触发邮箱服务商的频率限制。
内容的提问来源于stack exchange,提问作者MiniGunnR
相关产品推荐
相关产品推荐

