文章目录
场景描述
- QQ 邮箱使用 SMTP 发送邮件报错:
550 The From header is missing or invalid
:
失败原因:(550, b'The "From" header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol. https://service.mail.qq.com/detail/124/995.')
- 源码(
pthon 3.12
)
import smtplib
from email.header import Header
from email.mime.text import MIMEText
class Mail:
def __init__(self, mail_pass, sender, receivers):
# 第三方 SMTP 服务
self.mail_host = "smtp.qq.com" # 填写邮箱服务器:这个是qq邮箱服务器,直接使用smtp.qq.com
self.mail_pass = mail_pass # 填写在qq邮箱设置中获取的授权码
self.sender = sender # 填写邮箱地址
self.receivers = receivers # 填写收件人的邮箱,QQ邮箱或者其他邮箱,可多个,中间用,隔开
def send(self, subject, content):
message = MIMEText(content, 'plain', 'utf-8') # 邮件内容
message['From'] = Header(self.sender) # 邮件发送者姓名
# message['To'] = Header(self.receivers) # 邮件接收者姓名
message['Subject'] = Header(subject, 'utf-8') # 发送的主题
print(message)
try:
smtpObj = smtplib.SMTP_SSL(self.mail_host, 465) # 建立smtp连接,qq邮箱必须用ssl边接,因此边接465端口
smtpObj.login(self.sender, self.mail_pass) # 登陆
smtpObj.sendmail(self.sender, self.receivers, message.as_string()) # 发送
smtpObj.quit()
print(f"发送成功:sender:{self.sender} receivers:{self.receivers}")
except smtplib.SMTPException as e:
print(f"发送失败:sender:{self.sender} receivers:{self.receivers} ,失败原因:{e}")
if __name__ == '__main__':
mail = Mail("xxxx", "xxxx@qq.com", ["xxxx@gmail.com"])
mail.send("titel", "content")
问题排查
根据提示查看原因
- 看到
QQ 邮箱对 header 中的 from
有合法性校验,我们的字段格式符合要求,怀疑是字符编码问题。
查看封装的 message
- 通过打印封装的
message
查看我们的From
字段乱码,去掉utf-8
编码。
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
From: =?utf-8?q?XXX=40qq=2Ecom?=
Subject: =?utf-8?q?titel?=
Y29udGVudA==
- 再次测试,正常发送邮件。
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
From: XXXXXX@qq.com
Subject: =?utf-8?q?titel?=
Y29udGVudA==
发送成功:sender:XXXXX@qq.com receivers:['XXXXX@gmail.com']
个人简介
👋 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.
🚀 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。
🧠 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。
💡 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。
🌐 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。
📖 保持关注我的博客,让我们共同追求技术卓越。