はじめに
Rust の lettre クレートでさくらのメールボックスを用いて独自ドメインでのメールを送信する際の記録です。
前提としては、
xdomain にて独自ドメインを取得済み
Netlify DNS にネームサーバを設定してる
独自ドメインのメールアドレスでメールの送信がしたいが、ネームサーバは変更したくないというような状態です。
lettre
Rust のメーラライブラリで、
SMTP(Simple Mail Transfer Protocol)を用いてセキュアなメールの送信ができる
ファイルの送信
非同期サポート
ユニコードサポート
などなど欲しい機能が一通り揃っています。
GitHub へのリンク
さくらのメールボックスとは
かの有名なさくらインターネットさんが用意されているプランの一つで、
独自ドメインのメールが使える
月額 87円(安すぎでは?)
と主に月額にひかれて使い始めました。
やりたいこと
さくらのメールボックスの登録、独自ドメインの追加、メールアドレスの作成は済んでいるものとします。
Rust 内から lettre を使って独自ドメインからメールを送信しましょう。
まず、公式のサンプルを見てみます。
use lettre::transport::smtp::authentication::Credentials;
use lettre::{Message, SmtpTransport, Transport};
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("Be happy!"))
.unwrap();
let creds = Credentials::new("smtp_username".to_string(), "smtp_password".to_string());
// Open a remote connection to gmail
let mailer = SmtpTransport::relay("smtp.gmail.com")
.unwrap()
.credentials(creds)
.build();
// Send the email
match mailer.send(&email) {
Ok(_) => println!("Email sent successfully!"),
Err(e) => panic!("Could not send email: {:?}", e),
ここで必要になるものが
let creds = Credentials::new("smtp_username".to_string(), "smtp_password".to_string());
// Open a remote connection to gmail
let mailer = SmtpTransport::relay("smtp.gmail.com")
.unwrap()
.credentials(creds)
.build();
の部分です。
初めに smtp_username
, smtp_password
にそれぞれ独自ドメインを使用したメールアドレス、そのメールアドレス作成時のパスワードを設定します。
ここでは、例としてメールアドレスが、 dummy@exmaple_domain.com
でパスワードが、 dummy_password
であるものとします。
続いて、 mailer
の接続情報ですが、ここに初期ドメインを設定します。アカウント情報から見れます。
例として、 example.initial.domain.com
としておきます。
したがって、ソースコードは次のようになります。
let creds = Credentials::new("dummy@example_domain.com".to_string(), "dummy_password".to_string());
// Open a remote connection
let mailer = SmtpTransport::relay("example.initial.domain.com")
.unwrap()
.credentials(creds)
.build();
しかし、このままではさくらのメールボックスを使った送信はできません。
さくらのメールボックスではメールの暗号化通信に STARTTLS
を使用します。
したがって、mailer 部分を次のように改変します。
// Open a remote connection using STARTTLS
let mailer = SmtpTransport::starttls_relay("exmaple.initial.domain.com")
.unwrap()
.credentials(creds)
.build();
これにより lettre を経由して独自ドメインからメールの送信ができるようになりました。