Python发送程序输出邮件正文为空、MIMEText传参报错求助
问题根因
- 你定义的
mail_content是存储了多个print()函数返回值的列表,并非可作为邮件正文的字符串。print()的作用是把内容输出到控制台,返回值固定为None,根本不会保存你想要的正文内容。 - 附加正文时报错是因为
MIMEText构造要求传入字符串类型参数,你传入了列表,自然触发'list' object has no attribute 'encode'错误。 - 最初发送空邮件是因为你没有把任何正文内容挂载到MIME消息对象上,就直接将仅包含邮件头的内容转成字符串发送,正文必然为空。
修正步骤
- 不要用
print()拼接正文,直接把需要展示的内容拼接成完整字符串,用\n实现换行。 - 必须在调用
message.as_string()方法之前,把构造好的正文挂载到MIME消息对象上,顺序错误会导致新增内容不会被写入最终发送的邮件内容。 - 初始化
MIMEText时建议指定utf-8编码,避免特殊字符、中文出现乱码。
修正后完整代码
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # 提前定义代码中用到的变量x,此处为测试示例值 x = "test_value" # 拼接邮件正文为字符串类型 mail_content = "" mail_content += "------------------------------------------------\n" mail_content += "this is a test2\n" mail_content += f"Name={x}\n" # 邮箱配置 sender_address = 'my internal server' receiver_address = 'example@example.com' message = MIMEMultipart() message['From'] = sender_address message['To'] = receiver_address message['Subject'] = 'A test mail sent by Python.' # 挂载正文,必须在as_string调用前执行 message.attach(MIMEText(mail_content, 'plain', 'utf-8')) # 建立SMTP会话发送邮件 session = smtplib.SMTP('my internal server', 255) session.starttls() text = message.as_string() session.sendmail(sender_address, receiver_address, text) session.quit() print('Mail Sent')
常见踩坑提醒
- 所有需要随邮件发送的内容(正文、附件、自定义头)都必须在
message.as_string()调用前添加完成,否则不会被包含在发出的邮件中。 - 如果需要把控制台打印的程序输出直接作为邮件内容,可以先将标准输出重定向到内存对象捕获内容,不要直接把
print()调用写在列表里。
内容的提问来源于stack exchange,提问作者user9771132
相关产品推荐
相关产品推荐

