Python邮件发送代码独立运行正常,封装函数后触发RFC 5322合规错误
问题
我写了一段发送确认邮件的Python代码,独立运行时能正常发送,但封装成函数后出现投递失败。
独立运行代码
import smtplib import random verify_code=str(random.randint(1111,9999)) sent_from = 'code@r*****' password='*******' to = ['re******@gmail.com'] subject = 'verify code' body = ('your code is :'+str(code)) email_text = """\ From: %s To: %s Subject: %s %s """ % (sent_from, ", ".join(to), subject, body) smtp_server = smtplib.SMTP_SSL('mx2.ta*******.com', 465) smtp_server.ehlo() smtp_server.login(sent_from, password) smtp_server.sendmail(sent_from, to, email_text) smtp_server.close() print ("Email sent successfully!")
封装为函数后的代码
def mail(code): import smtplib import random code=str(random.randint(1111,9999)) sent_from = 'code@r****' password='*******' to = ['re*******@gmail.com'] subject = 'verify code' body = ('your code is :'+str(code)) email_text = """\ From: %s To: %s Subject: %s %s """ % (sent_from, ", ".join(to), subject, body) smtp_server = smtplib.SMTP_SSL('mx2.tal*****.com', 465) smtp_server.ehlo() smtp_server.login(sent_from, password) smtp_server.sendmail(sent_from, to, email_text) smtp_server.close() print ("Email sent successfully!")
错误信息
该邮件由邮件投递软件自动生成。
您发送的邮件无法投递至一个或多个收件人,此为永久错误。以下地址投递失败:
reza*****@gmail.com
主机 gmail-smtp-in.l.google.com [108.177.126.27]
数据传输结束后收到远程邮件服务器的SMTP错误:
550-5.7.1 [185.51..] 我们的系统检测到该邮件不符合RFC 5322规范:
550-5.7.1 'From'头部缺失。
550-5.7.1 为减少发送至Gmail的垃圾邮件,该邮件已被拦截。请查看RFC 5322规范以获取更多信息。
原因分析与解决办法
问题出在函数内的多行字符串缩进。封装成函数后,email_text的多行字符串每一行前面都添加了缩进空格,导致邮件的From:头部变成了 From:,Gmail服务器无法识别这个合法的邮件头部,因此判定邮件不符合RFC 5322规范并拦截。
修正方案一:移除多行字符串缩进
保持email_text的格式与独立运行代码一致,去掉缩进:
def mail(code): import smtplib import random code=str(random.randint(1111,9999)) sent_from = 'code@r****' password='*******' to = ['re*******@gmail.com'] subject = 'verify code' body = ('your code is :'+str(code)) email_text = """\ From: %s To: %s Subject: %s %s """ % (sent_from, ", ".join(to), subject, body) smtp_server = smtplib.SMTP_SSL('mx2.tal*****.com', 465) smtp_server.ehlo() smtp_server.login(sent_from, password) smtp_server.sendmail(sent_from, to, email_text) smtp_server.close() print ("Email sent successfully!")
修正方案二:使用textwrap.dedent去除缩进
如果想要保留代码缩进的可读性,可引入textwrap模块自动去除多行字符串的缩进:
import textwrap def mail(code): import smtplib import random code=str(random.randint(1111,9999)) sent_from = 'code@r****' password='*******' to = ['re*******@gmail.com'] subject = 'verify code' body = ('your code is :'+str(code)) email_text = textwrap.dedent("""\ From: %s To: %s Subject: %s %s """ % (sent_from, ", ".join(to), subject, body)) smtp_server = smtplib.SMTP_SSL('mx2.tal*****.com', 465) smtp_server.ehlo() smtp_server.login(sent_from, password) smtp_server.sendmail(sent_from, to, email_text) smtp_server.close() print ("Email sent successfully!")
另外,函数参数code被内部重新赋值,属于冗余代码。如果需要外部传入验证码,可删除函数内的code=str(random.randint(1111,9999))一行。
内容的提问来源于stack exchange,提问作者Reza Heidary
相关产品推荐
相关产品推荐

