Python3.9.6发送带zip附件邮件报TypeError:string payload expected错误求助
错误产生原因
- 根容器被错误覆盖:你首先初始化了
MIMEMultipart类型的msg作为承载邮件正文和附件的容器,后续执行msg = MIMEBase('application', 'octet-stream')直接将msg重写为单部分的MIMEBase对象。MIMEBase不支持挂载多个内容块,调用attach方法后会导致payload结构变为列表类型,和单部分消息要求payload为字符串,因此触发类型错误。 - 附件构造逻辑错误:
- 冗余调用
MIMEApplication和set_payload、encoders.encode_base64逻辑冲突,MIMEApplication本身已内置了二进制内容处理和编码逻辑,不需要手动重复设置 - 附件头字段拼写错误,正确字段名为
Content-Disposition,代码中写的Content-Decomposition为无效字段 set_payload第二个参数为文本编码,传入rb属于无效参数,二进制内容无需指定该参数- 代码缺失SMTP登录步骤,即使修复类型错误后也会出现发件权限错误
- 冗余调用
修复方案
直接替换附件构造相关的错误代码即可,完整可运行的修正后代码如下:
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication smtpServer = "(Servername)" smtpPort = (Portnumber) smtpUsername = "(SMTP Username)" smtpPassword = "(Password)" sender = "(Username)" reciever = "(Username)" subject = "(subject)" body = "Text" zipfilename = "你的压缩包路径.zip" # 替换为实际的zip文件路径 # 初始化根邮件容器 msg = MIMEMultipart() msg['Subject'] = subject msg['From'] = sender msg['To'] = reciever # 添加正文 text_part = MIMEText(body, 'plain') msg.attach(text_part) # 添加zip附件 with open(zipfilename, 'rb') as f: attach_part = MIMEApplication(f.read()) attach_part.add_header('Content-Disposition', 'attachment', filename=zipfilename) msg.attach(attach_part) # 发送邮件 smtpObj = smtplib.SMTP(smtpServer, smtpPort) smtpObj.set_debuglevel(1) smtpObj.starttls() smtpObj.login(smtpUsername, smtpPassword) # 补充SMTP登录步骤 smtpObj.sendmail(sender, reciever, msg.as_string()) smtpObj.quit()
内容的提问来源于stack exchange,提问作者Semper
相关产品推荐
相关产品推荐

