QQ邮箱使用SMTPLIB 报错550,'The "From" header is missing or invalid.原因以及解决办法

2,027 阅读1分钟

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….

image-20230417094424885

该条款限制From Header格式为: 昵称+空格+<邮箱地址>形式:nickname <prefix@domain>

此时我们如果将From Header更改为:LogSender <217xxx@qq.com>,发现采用上述代码该报错仍然存在。因此怀疑是编码问题,打印邮箱发送体如下:

1

显然,该错误是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“,其报错依旧!