Python发送邮件报SMTP实例无send_message属性错误
问题根因
该报错和Gmail 2FA配置、应用密码授权没有关联,核心原因是运行脚本的Python版本过低:smtplib.SMTP类的send_message()方法是Python 3.2版本才新增的API,Python 2全系列、Python 3.0/3.1版本均未实现该方法,调用时就会触发属性不存在的错误。
修复方法
不需要升级Python环境,直接将send_message()调用替换为全版本兼容的sendmail()写法即可,同时修复原代码里两处会导致邮件显示异常的问题:
- 正文部分
\Your Management的反斜杠为无效转义符,会导致正文排版错乱 - 附件的
Content-Disposition头末尾缺少闭合双引号,部分邮件客户端无法正常识别附件
修复后的完整代码
MY_ADDRESS = "****@gmail.com" # 发件人Gmail地址 MY_PASSWORD = "****Password****" # Gmail 2FA生成的应用专用密码 RECIPIENT_ADDRESS = ['****@gmail.com', '****@gmail.com'] # 收件人地址列表 HOST_ADDRESS = 'smtp.gmail.com' HOST_PORT = 587 import smtplib from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication from email.mime.text import MIMEText # 与Gmail SMTP服务器建立连接 server = smtplib.SMTP(host=HOST_ADDRESS, port=HOST_PORT) server.starttls() server.login(MY_ADDRESS, MY_PASSWORD) # 初始化多段邮件对象 message = MIMEMultipart() # 配置邮件基础头信息 message['From'] = MY_ADDRESS message['To'] = ", ".join(RECIPIENT_ADDRESS) message['Subject'] = "Test Email - July" # 构造纯文本正文 textPart = MIMEText("Hello **** & ****,\n\nAttached below is your test bill for the month of July 2022. \n\nBest,\nYour Management", 'plain') # 构造PDF附件 filename = "Test Bill - Billy.pdf" filePart = MIMEApplication(open(filename,"rb").read(),Name=filename) filePart["Content-Disposition"] = 'attachment; filename="%s"' % filename # 挂载正文和附件 message.attach(textPart) message.attach(filePart) # 兼容全版本Python的发信逻辑 server.sendmail( from_addr=MY_ADDRESS, to_addrs=RECIPIENT_ADDRESS, msg=message.as_string() ) # 关闭SMTP连接 server.quit()
可选替代方案
如果不想修改代码,可直接将运行环境的Python版本升级到3.2及以上的稳定版,原代码的send_message()逻辑即可正常运行,但仍建议修复上述提到的正文转义、附件头格式问题,避免出现邮件显示异常。
内容的提问来源于stack exchange,提问作者ohmygodimpregnant
相关产品推荐
相关产品推荐

