讲师中心 微信公众号
AI工具推荐 视频效率加速

Python邮件发送中缺失主题(Missing Subject)的完整解决方案

阿辰吖_1210

阿辰吖_1210

发布时间:2026-02-20 19:11:01

|

258人浏览过

|

来源于php中文网

原创

Python邮件发送中缺失主题(Missing Subject)的完整解决方案

使用email.message.EmailMessage构建邮件时,若仅设置msg['Subject']但未调用send_message()而是误用sendmail(),会导致主题丢失——根本原因是sendmail()仅发送原始字符串内容,不解析邮件头;而send_message()才真正序列化并传输完整的MIME消息对象。

使用`email.message.emailmessage`构建邮件时,若仅设置`msg['subject']`但未调用`send_message()`而是误用`sendmail()`,会导致主题丢失——根本原因是`sendmail()`仅发送原始字符串内容,不解析邮件头;而`send_message()`才真正序列化并传输完整的mime消息对象。

在Python中通过smtplib发送带格式(如主题、发件人、收件人)的电子邮件时,一个常见却极易被忽视的错误是:混淆了sendmail()与send_message()两个方法的语义与使用前提。问题代码中虽然正确创建了EmailMessage对象并设置了msg['Subject'],但在发送阶段却调用了server.sendmail(sender_email, receiver_email, file_content, msg)——这不仅参数顺序错误(sendmail()不接受msg作为第四个参数),更关键的是:sendmail()期望接收已完全序列化的RFC 5322格式字符串(含所有头部),而它不会自动从EmailMessage对象中提取或渲染头部信息。

相比之下,send_message()是专为EmailMessage(或MIMEMultipart等MIME对象)设计的高层接口:它会自动调用msg.as_bytes()完成完整邮件的序列化(包括Subject、From、To、Date及正文),确保所有元数据准确嵌入最终传输的数据流中。

✅ 正确做法是:将所有邮件元数据(主题、发件人、收件人)统一设在EmailMessage实例上,并使用send_message()发送该实例。以下是修正后的第二脚本(关键修改已高亮):

from data import extract_data
import smtplib
import os
from email.message import EmailMessage
from dotenv import load_dotenv

load_dotenv()  # 推荐直接调用,无需赋值给变量

extract_data()

email_address = os.environ.get("gmail_username")
email_password = os.environ.get("gmail_password")
sender_email = email_address
receiver_email = "recipient@example.com"  # 注意:请替换为真实邮箱,勿保留HTML转义邮箱链接

# 读取天气报告文本
with open("weather.txt", "r", encoding="utf-8") as my_file:
    file_content = my_file.read()

# ✅ 步骤1:构建完整邮件对象(设置全部头部 + 内容)
msg = EmailMessage()
msg["Subject"] = "Daily Weather Report"
msg["From"] = sender_email
msg["To"] = receiver_email
msg.set_content(file_content)  # 纯文本内容(自动设置Content-Type: text/plain)

# ✅ 步骤2:使用 send_message() 发送完整消息对象
server = smtplib.SMTP("smtp.gmail.com", 587)  # 端口作为独立参数更清晰
server.starttls()
server.login(sender_email, email_password)
server.send_message(msg)  # 关键!传入 EmailMessage 实例
server.quit()

⚠️ 重要注意事项:

Python Pep Authoring
Python Pep Authoring

依据官方 python/peps仓库规则起草、审阅、编辑或准备 Python 改进提案(PEP),用于处理 PEP 文本和元数据头部。

下载

立即学习“Python免费学习笔记(深入)”;

  • 不要混用 sendmail() 和 EmailMessage:sendmail() 的签名是 sendmail(from_addr, to_addrs, msg),其中 msg 必须是已序列化的字节串或字符串(例如 msg.as_string()),而非EmailMessage对象本身。强行传入会导致静默失败或头部丢失。
  • 显式设置 From/To 头部:Gmail等现代SMTP服务强制校验发件人一致性,仅靠sendmail()参数无法替代邮件头中的From/To字段。
  • 编码安全:读取weather.txt时建议指定encoding="utf-8",避免特殊字符(如中文、度符号°)解码异常。
  • 环境变量安全:确保.env文件未提交至版本控制,并使用强密码或应用专用密码(App Password)替代Gmail账户密码。

? 进阶提示:若需支持HTML格式邮件或附件,可改用msg.add_alternative(html_content, subtype='html')添加多部分内容,或通过msg.add_attachment()嵌入文件——这些功能均依赖send_message()的完整MIME处理能力。

遵循以上规范,即可彻底解决“Missing email subject”问题,确保邮件标题、发件人、正文等所有要素准确送达收件方。

热门AI工具

更多
立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1878

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3044

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6304

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6329

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7894

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

12074

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

6239

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

6967

2025.08.07

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn