rust 通过lettre发送的电子邮件中的编码/字符错误

kqlmhetl  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(180)

我在用一个生 rust 的程序发邮件。
电子邮件文本在编码为UTF8的Postgresql数据库中。我通过postgres crate查询数据库:https://crates.io/crates/postgres
我在Windows上工作。如果我打印的消息似乎是正确的:

但当我在Thunderbird上收到它时,它显示:“Questo =C3=A8 il”
如果我从Gmail网页界面读到它似乎是正确的,但当我检查“显示原始邮件”时,它又错了。
我读到这样一条带有查询的消息:

let query = "SELECT * FROM myschema.retrieve_messages($1, $2, $3, $4);";
for row in &db_client.query(query, &[&pg_working_date, &max_messages_per_run, &_force_retry, &run_id]).unwrap()

然后我循环结果,并将它们放入Vec中。我检索body:

mail_body: row.get("mail_body")

如果我打印消息的正文:

println!("Body is: {}", m.mail_body);

看起来还行。
然后我使用lettre crate发送电子邮件https://crates.io/crates/lettre
我这样连接:

let mailer = SmtpTransport::relay(&smtp_server)
    .unwrap()
    .credentials(smpt_credentials)
    .build();

我用这个代码发送消息:

let shipping_message = Message::builder()
        .from("Hello <shippingaddress@shippngdomain.something>".parse().unwrap())
        .to(m.email_address.parse().unwrap())
        .subject(m.mail_subject)
        .body(m.mail_body)
        .unwrap();

然后发货:

match mailer.send(&shipping_message) {some other irrelevant code}

代码有问题吗?我可以检查什么?

hmae6n7t

hmae6n7t1#

当你调用MessageBuilder::body时,你的body被编码为:
基于最有效和有效的body编码,自动使用7bitquoted-printablebase64Content-Transfer-Encoding进行编码。
如果不需要这种行为,可以使用带有SinglePartMIME主体。
我想这应该对你有帮助:

let shipping_message = Message::builder()
        .from("Hello <shippingaddress@shippngdomain.something>".parse().unwrap())
        .to(m.email_address.parse().unwrap())
        .subject(m.mail_subject)
        .singlepart(SinglePart::plain(m.mail_body)) // plain UTF-8 encoding
        .unwrap();

相关问题