Rust
でメールを送信する。
lettre
lettre
というメールクライアントも利用できるメーラーのクレートを利用して、日本語を含むメールを送信するときの注意点を書いておきたい。lettre
についてはこちら(crates.io
):
https://crates.io/crates/lettre
日本語送信での注意
上記リンクに書かれている下のような指定だとBody
に日本語を含めるとMessageBuilder
によって自動でBASE64
でエンコードされて送られる。
credentials
やmailer
についてはドキュメントのものと変わらないので省略している:
// 受信側で日本語が見えない例。
use lettre::{Message /*省略*/};
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse().unwrap())
.reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
.to("Hei <hei@domain.tld>".parse().unwrap())
.subject("Happy new year")
.body(String::from("ビーハッピー!"))
.unwrap();
これだけ聞くと親切だが、受信ボックスから見ると44OT44O844OP44OD44OU44O877yB
などと表示されてしまう。この原因はContent-Type
が設定されていないためのものだと思われる。件名(Subject
)の方はエンコードのときにutf-8
を使っているというような指定が埋め込まれているようで問題はない。
日本語を送るならばこのような感じになる:
// 日本語も受信側で読める例。
use lettre::{message::header, Message /*省略*/};
let email = Message::builder()
.from("NoBody <nobody@domain.tld>".parse().unwrap())
.reply_to("Yuin <yuin@domain.tld>".parse().unwrap())
.to("Hei <hei@domain.tld>".parse().unwrap())
.header(header::ContentType::TEXT_PLAIN) // これが必要。
.subject("Happy new year")
.body(String::from("ビーハッピー!"))
.unwrap();
ドキュメントによれば、ContentType::TEXT_HTML
もあるのでHTMLメールの送信でも安心:
ContentType in lettre::message::header - Rust
`Content-Type` of the body
gmailのsmtpの利用について
余り本筋とは関係がないが、このような方法でのgmailの送信は、Googleの二段階認証のプロセスに対応していないので、smtpの認証情報(credentials)には、アプリパスワードを利用する必要がある。
これはgoogleアカウント アプリパスワード
で検索してみればいい。アプリパスワードを作成したら、アカウントのパスワードの代わりに認証情報にはこのパスワードを使えばいい。
不要になったら消す必要はある。
以上です。