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

Python发送Gmail邮件主题正常但正文为空的问题求助

兄弟,我瞅了下你的问题和没写完的代码,大概率是你没正确构造邮件正文的格式,或者代码里压根没把正文内容传递给发送方法~ 给你理清楚常见的坑和解决办法:

问题分析&解决方案

1. 邮件格式不规范(最常见原因)

Gmail对邮件格式有明确要求,直接传字符串正文很可能不被识别,得用Python自带的email模块来构造标准的邮件对象(比如MIMEText)。你的代码里完全没看到这部分逻辑,这应该是正文为空的核心原因。

修正后的完整可运行代码

# 注意:Python3里urllib2已升级为urllib.request,根据你的Python版本选对应导入
from urllib2 import urlopen  # Python2用这个
# from urllib.request import urlopen  # Python3用这个
import smtplib
from email.mime.text import MIMEText
from email.header import Header

# 连接并登录Gmail的SMTP服务器
s = smtplib.SMTP('smtp.gmail.com', 587)
s.starttls()  # 启用TLS加密
s.ehlo()

username = 'myEmail@gmail.com'
# 重点:Gmail现在要求启用两步验证后用「应用专用密码」登录,不能直接用原邮箱密码
password = '你的应用专用密码'
s.login(username, password)

# 构造邮件核心内容
replyto = 'myEmail@gmail.com'
sendto = ['myEmail@gmail.com']
subject = 'Mail automation test'
body = '这是测试邮件的正文内容,终于能正常显示啦!'  # 替换成你要发送的正文

# 创建标准邮件对象,指定utf-8编码避免中文乱码
msg = MIMEText(body, 'plain', 'utf-8')
msg['From'] = replyto
msg['To'] = ','.join(sendto)
msg['Subject'] = Header(subject, 'utf-8')

# 发送邮件并关闭连接
s.sendmail(replyto, sendto, msg.as_string())
s.quit()

2. Gmail权限设置的坑

如果格式没问题还是收不到正文,大概率是权限问题:

  • 必须启用两步验证,然后生成应用专用密码来登录(Gmail早就禁用了非安全应用直接用原密码登录)
  • 要是不想开两步验证,也可以临时开启「不太安全的应用访问」(但非常不推荐,风险很高)

3. 代码遗漏正文传递

如果你的原代码里有写正文,但没把它正确传给sendmail方法,比如直接传了主题字符串,也会导致正文为空。一定要传递msg.as_string()这个完整的邮件格式字符串。

4. 编码问题

如果正文包含中文,必须指定utf-8编码,不然Gmail可能解析失败,直接显示为空,上面的代码已经帮你处理了这个问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:52:36