You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:10:54