QQ邮箱使用SMTPLIB 报错550,'The "From" header is missing or invalid.原因以及解决办法
问题描述
最近在项目里遇到的邮箱邮件发送失败错误代码为550的问题,具体报错为:
(550, b'The "From" header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol. 帮助系统 ')
问题探索
报错函数体如下:
def send_email(self):
try:
email = MIMEText(self.message, self.send_email_type, "utf-8")
email["From"] = Header(self.header_from, "utf-8")
email["To"] = Header(self.header_to, "utf-8")
email["Subject"] = Header(self.subject, "utf-8")
self.sever.sendmail(self.sender, self.receivers, email.as_string())
self.sever_logout()
except Exception as e:
raise EmailSendError(f"邮件发送失败, Err: {e}")
在正式环境中,我们使用的From Header是对于发件人的描述,比如“LogSender”。经过替换邮箱类型测试,发现除了QQ邮箱,其他邮箱使用该header类型均可成功发送。此报错应为,QQ邮箱政策更新导致。
查看QQ邮箱帮助:help.mail.qq.com/detail/0/99….

该条款限制From Header格式为: 昵称+空格+<邮箱地址>形式:nickname <prefix@domain>
此时我们如果将From Header更改为:LogSender <217xxx@qq.com>,发现采用上述代码该报错仍然存在。因此怀疑是编码问题,打印邮箱发送体如下:
显然,该错误是From Header被base64加密了”utf-8“字符串,导致From Header识别不正确。
解决办法
删除From Header中的”utf-8“字符串,或者不声明From Header为utf-8格式即可。
如下:
def send_email(self):
try:
email = MIMEText(self.message, self.send_email_type, "utf-8")
email["From"] = Header(self.header_from)
email["To"] = Header(self.header_to, "utf-8")
email["Subject"] = Header(self.subject, "utf-8")
self.sever.sendmail(self.sender, self.receivers, email.as_string())
self.sever_logout()
except Exception as e:
raise EmailSendError(f"邮件发送失败, Err: {e}")
但是必须注意:使用QQ邮箱的时候,请务必按照 昵称+空格+<邮箱地址>形式:nickname <prefix@domain>声明From Header。否则即使删除”utf-8“,其报错依旧!