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

Python发送程序输出邮件正文为空、MIMEText传参报错求助

问题根因
  • 你定义的mail_content是存储了多个print()函数返回值的列表,并非可作为邮件正文的字符串。print()的作用是把内容输出到控制台,返回值固定为None,根本不会保存你想要的正文内容。
  • 附加正文时报错是因为MIMEText构造要求传入字符串类型参数,你传入了列表,自然触发'list' object has no attribute 'encode'错误。
  • 最初发送空邮件是因为你没有把任何正文内容挂载到MIME消息对象上,就直接将仅包含邮件头的内容转成字符串发送,正文必然为空。
修正步骤
  1. 不要用print()拼接正文,直接把需要展示的内容拼接成完整字符串,用\n实现换行。
  2. 必须在调用message.as_string()方法之前,把构造好的正文挂载到MIME消息对象上,顺序错误会导致新增内容不会被写入最终发送的邮件内容。
  3. 初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:15:43