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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 07:37:40