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
相关产品推荐
相关产品推荐

