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

Python SMTP库发送Outlook邮件正文始终为空如何解决

问题根因

smtplib的SMTP.sendmail()方法对传入的消息参数有强格式约束:必须传入符合RFC 2822规范的完整邮件报文字符串,结构要求为「合法邮件头字段 + 空行分隔 + 邮件正文」。
你代码中传入的str(list)、裸字符串、原生list对象都不符合这个规范:

  • 原生list不是字符串/字节类型,本身不符合参数类型要求
  • 转成字符串的列表、普通裸字符串没有携带合法的From/To/Subject/Content-Type等必填邮件头,Outlook SMTP服务会把这部分无格式的内容全部识别为非法头字段直接丢弃,最终投递的邮件就只剩空正文。
    另外你代码中用关键字形式传msg=str(list)属于不必要的写法,不会改变参数解析逻辑,也无法解决内容格式错误的问题。
修复方案

不要手动拼接邮件报文,直接用Python标准库自带的email模块构造合规邮件对象,从根源避免格式错误,修复后的可运行代码如下:

import smtplib
from email.mime.text import MIMEText
from email.header import Header

def mail():
    # 构造邮件正文,第二个参数指定为plain表示纯文本,第三个参数指定编码避免乱码
    # 如果需要发送列表内容,可以自行做字符串格式化,比如把列表转成换行分隔的字符串
    msg = MIMEText("此处填写邮件正文,支持传入格式化后的列表字符串", "plain", "utf-8")
    # 填充必填邮件头
    msg["From"] = env
    msg["To"] = rec
    msg["Subject"] = Header("此处填写邮件主题", "utf-8")

    server = smtplib.SMTP("smtp-mail.outlook.com", 587)
    server.starttls()
    server.login(env, password)
    # 将构造好的合规邮件对象转为标准格式字符串传入sendmail
    server.sendmail(env, rec, msg.as_string())
    print("Login no servidor efetuado com Sucesso")
    print("Email enviado para " + rec)
    server.quit()

注意事项

  • 禁止直接给sendmail传入裸字符串、列表等非规范内容,只要缺失邮件头和正文之间的分隔空行、头字段格式不合法,Outlook就会丢弃正文内容
  • 会话结束优先使用server.quit()代替server.close(),前者会向SMTP服务器发送正常的退出指令,避免连接异常
  • 如果需要发送HTML格式邮件、附件,只需要替换对应的MIME对象即可,不需要修改SMTP发送逻辑

如果你坚持手动拼接邮件报文(不推荐,极易出现格式兼容问题),必须严格遵循格式要求,示例如下:

# 注意头和正文之间必须有连续的\r\n空行
raw_msg = f"From: {env}\r\nTo: {rec}\r\nSubject: 测试邮件\r\nContent-Type: text/plain; charset=utf-8\r\n\r\n这里是手动拼接的邮件正文"
server.sendmail(env, rec, raw_msg)

内容的提问来源于stack exchange,提问作者Andre Martins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 11:03:28