Rustで日本語を含むメールを送信する

Rustでメールを送信する。

lettre

lettreというメールクライアントも利用できるメーラーのクレートを利用して、日本語を含むメールを送信するときの注意点を書いておきたい。lettreについてはこちら(crates.io):

https://crates.io/crates/lettre

日本語送信での注意

上記リンクに書かれている下のような指定だとBodyに日本語を含めるとMessageBuilderによって自動でBASE64でエンコードされて送られる。

credentialsmailerについてはドキュメントのものと変わらないので省略している:

// 受信側で日本語が見えない例。
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アカウント アプリパスワードで検索してみればいい。アプリパスワードを作成したら、アカウントのパスワードの代わりに認証情報にはこのパスワードを使えばいい。

不要になったら消す必要はある。

以上です。

タイトルとURLをコピーしました