使用NewsAPI发送带主题邮件时遇SMTPDataError问题求助
解决SMTP邮件主题重复拦截或不显示的问题
问题根源分析
- 第一个错误(多个Subject头):循环代码中每遍历一篇文章就会重新拼接一次
Subject: Today's news,最终生成的邮件内容包含20个重复的Subject头,违反RFC 5322邮件格式规范,被Gmail判定为违规内容拦截。 - 第二个问题(主题不显示):修改后的代码里,
From和Subject之间未换行,且邮件头与正文之间缺少必填的空行,导致邮件客户端无法正确识别主题头。
正确实现方式
要符合RFC 5322规范,需满足以下要求:
- 邮件头(From、Subject等)仅定义一次,放在内容最顶部
- 每个邮件头单独占一行
- 邮件头与正文之间必须用一个空行分隔
修改后的完整代码:
import requests from send_email import send_email topic = "tesla" api_key = "-" url = ("https://newsapi.org/v2/everything?" f"q={topic}&" "from=2023-09-05&" "sortBy=publishedAt&" "apiKey=-&" "language=en") request = requests.get(url) content = request.json() # 初始化邮件头(仅定义一次,末尾空行分隔头与正文) email_headers = """From: email@email.com Subject: Today's news """ # 拼接正文内容 body_content = "" for article in content["articles"][:20]: if article["title"] is not None: body_content += f"{article['title']}\n{article['description']}\n{article['url']}\n\n" # 组合邮件头与正文 full_message = email_headers + body_content # 编码后发送 send_email(message=full_message.encode("utf-8"))
额外说明
- 如果你的
send_email函数内部已自动添加From等邮件头,无需手动在email_headers中重复添加,避免出现新的重复头合规问题。 - 所有邮件头字段必须单独成行,头与正文的空行不可省略,这是邮件客户端正确解析内容的核心要求。
内容的提问来源于stack exchange,提问作者Jozko
相关产品推荐
相关产品推荐

