使用Lettre发送邮件出现编码错误问题排查求助
邮件发送后编码异常问题排查与修复
问题根源
你遇到的=C3=A8这类字符是Quoted-Printable编码的结果,本质是邮件内容未正确声明UTF-8字符集,导致Thunderbird等客户端按默认ASCII编码解析,从而出现乱码;Gmail网页端因自动编码检测机制可以正常显示,但原始邮件的编码问题依然存在。
代码问题与修复方案
你的代码核心问题是构建邮件时未显式指定内容的字符编码,Lettre默认生成的邮件头缺少charset=utf-8声明,导致客户端解析错误。
修复代码(关键修改)
修改邮件构建逻辑,添加Content-Type头明确指定UTF-8编码:
use lettre::message::header::ContentType; // ... let shipping_message = Message::builder() .from("Hello <shippingaddress@shippngdomain.something>".parse().unwrap()) .to(m.email_address.parse().unwrap()) .subject(m.mail_subject) .header(ContentType::TEXT_PLAIN_UTF8) // 显式声明纯文本+UTF-8编码 .body(m.mail_body) .unwrap();
如果你的邮件是HTML内容,替换为ContentType::TEXT_HTML_UTF8即可。
需要检查的其他方面
- 数据库字符串类型确认:确保PostgreSQL中
mail_body字段类型为text或varchar(默认UTF-8编码),且postgres crate查询返回的是RustString类型(而非Vec<u8>)。你打印正常说明这一步大概率没问题,但可以通过显式类型指定确认:let mail_body: String = row.get("mail_body"); // 显式指定类型,避免隐式转换问题 - 邮件主题编码检查:如果主题包含非ASCII字符,Lettre会自动用RFC 2047编码处理,但需确保
m.mail_subject是合法的UTF-8字符串,避免出现编码截断。 - SMTP传输编码验证:发送后查看原始邮件头,确认存在以下两项:
Content-Type: text/plain; charset=utf-8
Content-Transfer-Encoding: quoted-printable
这表明Lettre已正确处理编码声明。
内容的提问来源于stack exchange,提问作者user_0
相关产品推荐
相关产品推荐

