
告别中文乱码Envelopes发送中文正文与中文文件名附件的字符集实战攻略【免费下载链接】envelopesMailing for human beings项目地址: https://gitcode.com/gh_mirrors/en/envelopes还在为 Python 发送邮件出现中文乱码而烦恼吗Envelopes是一个专为人类设计的 Python 邮件发送库Mailing for human beings它把 Python 原生的email和smtplib模块封装得简单易用。本文是一份面向新手的字符集实战攻略只需一个charset参数就能让你的中文正文、中文主题、中文文件名附件全部正确送达彻底告别文件式的乱码灾难。一、为什么 Python 发邮件中文容易乱码先花 1 分钟搞清楚乱码的根源后面才不迷路 ️SMTP 协议只认 ASCII邮件主题、发件人等头部字段只能是英文和数字中文必须按 RFC 2047 标准编码成?utf-8?B?...?这种形式收件方再解码还原。正文需要声明字符集正文会以 MIME 分片形式发送并标明charsetutf-8收件方按此解码。附件文件名同理Content-Disposition里的文件名如果含中文也要用字符集编码。乱码的本质就是编码和声明不匹配——比如用 latin-1 声明却塞进 UTF-8 字节。手工操作email模块时这一步全靠你自己保证稍有不慎就翻车。二、Envelopes 的字符集设计一个参数管全场打开核心文件envelopes/envelope.py可以看到Envelope类构造函数的默认值就是charsetutf-8def __init__(self, to_addrNone, from_addrNone, subjectNone, html_bodyNone, text_bodyNone, cc_addrNone, bcc_addrNone, headersNone, charsetutf-8):这意味着创建信封时什么都不用配中文字符串就能正确发送。一个charset参数统一作用于以下五个地方使用位置编码方式源码位置发件人/收件人姓名RFC 2047 编码字envelopes/envelope.py的_header方法邮件主题 SubjectRFC 2047 编码字envelopes/envelope.py的to_mime_message方法纯文本/HTML 正文MIMEText 声明 charsetenvelopes/envelope.py的to_mime_message方法自定义头部如 X-MailerRFC 2047 编码字envelopes/envelope.py的_header方法附件文件名按 charset 编码envelopes/envelope.py的add_attachment方法配套的字节转换逻辑写在envelopes/compat.py的encoded函数里Python 2 下把 unicode 字符串按指定编码转成字节串Python 3 下直接原样返回——你不用关心版本差异。三、发送中文正文最简实战步骤1. 安装 Envelopesgit clone https://gitcode.com/gh_mirrors/en/envelopes cd envelopes pip install .2. 构建中文邮件下面是官方示例的中文化版本参考README.rstfrom envelopes import Envelope envelope Envelope( from_addr(ufromexample.com, u张三), to_addr(utoexample.com, u李四), subjectu这是一封中文邮件, text_bodyu你好这是一封来自 Envelopes 的中文正文 u不会乱码哦 ) envelope.add_attachment(u/path/to/2024年报价单.pdf) envelope.send(smtp.example.com, loginfromexample.com, passwordpassword, tlsTrue)就这些收件人看到的是漂亮的张三、李四和中文主题而不是?utf-8?B?...?这串天书。3. 为什么 Python 2 用户千万别漏了u前缀这是新手乱码第一大坑文件开头必须声明# -*- coding: utf-8 -*-Envelopes 所有源码文件都以身作则见envelopes/__init__.py第一行中文字符串务必加u前缀如u中文主题否则 Python 2 会按本地编码处理与信封声明的 utf-8 不一致乱码必然发生。项目测试用例tests/test_envelope.py中的test_to_mime_message_unicode用了一整封波兰语全字符邮件ęóąśłżźćń比中文还刁钻验证主题、收发件人、正文的编码正确性——中文的可靠性自然更不用担心。四、中文文件名附件自动编码不头疼附件是乱码重灾区。add_attachment方法的巧妙之处在于envelopes/envelope.py内容无论什么文件读取后一律做Base64 编码二进制数据原封不动传输MIME 类型自动根据扩展名猜测如.pdf→application/pdf猜不到就用application/octet-stream兜底也可手动指定文件名调用encoded(file_path, self._charset)按信封字符集编码后再写入Content-Disposition头2024年报价单.pdf这样的中文文件名可以安全传输。对应测试见tests/test_envelope.py的test_add_attachment它甚至给临时文件起了ęóąśłżźćń这样的名字来验证中文文件名通过只是基本操作。五、什么时候需要修改 charset默认 utf-8 能覆盖 99% 的场景但有两种情况需要切换对接老系统某些遗留邮箱或网关只认 GB2312、Big5 或 latin2 等编码创建信封时指定即可envelope Envelope(..., charsetlatin2)运行中切换charset是一个可读写属性赋值后内部地址格式模板会自动重新编码见envelopes/envelope.py的charsetsetter。⚠️ 注意charset必须与你字符串实际的编码一致。给一个已经是 GB2312 字节串的变量声明 utf-8等于自找乱码。六、发送通道别忘了 TLS 与登录正文编码再完美传输通道有问题也会功亏一篑。连接封装在envelopes/conn.py中通用SMTP类支持host、port、login、password、tls、timeout六个参数建议开启tlsTrue保护登录凭证常用服务商有预配置子类比如GMailSMTP自动设置主机和 TLS、SendGridSMTP587 端口拿来即用开发调试可用MailcatcherSMTP连本地 Mailcatcher 收件服务不用真发邮件。想批量复用连接项目还提供了envelopes/connstack.py的 SMTP 连接池API 文档见docs/api/conn.rst和docs/api/connstack.rst。七、乱码排查清单建议收藏 ✅遇到乱码按顺序自查源文件编码声明了吗Python 2 文件头部是否有# -*- coding: utf-8 -*-字符串是 unicode 吗Python 2 中文字符串是否都加了u前缀charset 声明对吗默认 utf-8手动改过的话确认与实际编码一致附件路径含中文时确认传入的是 unicode 路径Windows 上尤其重要看原始报文用envelope.to_mime_message()生成 MIME 对象后打印msg.as_string()检查Content-Type: text/plain; charsetutf-8和编码字是否正确收件端检查用能显示原始头的邮件客户端确认解码过程。八、快速总结需求做法中文主题/正文直接传中文字符串默认 utf-8 自动处理中文姓名/地址用(uemail, u姓名)元组格式传入中文文件名附件add_attachment(u.../中文文件名.pdf)自动编码特殊编码环境构造时指定charsetgb2312等发送失败/凭证安全开启tlsTrue服务商用预配置类Envelopes 的核心价值就在于把字符集这件烦心事收敛成一个默认正确的参数让你把精力放在业务逻辑上而不是和乱码斗智斗勇。更多 API 细节可查阅docs/api/envelope.rst实际项目集成案例参考examples/example_flask.py和examples/example_celery.py。祝你从此发邮件收发皆中文件件无乱码✉️【免费下载链接】envelopesMailing for human beings项目地址: https://gitcode.com/gh_mirrors/en/envelopes创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考