昨日書いたSimple Java Mailライブラリの続きです。
kikutaro777.hatenablog.com
昨日のサンプルではビルダーパターンを使いました。
Email email = new EmailBuilder()
.from("kikutaro_from", "kikutaro_from@example.com")
.to("kikutaro_to", "kikutaro_to@example.com")
.subject("サブジェクトだよ")
.text("マルチパートのテキストだよ")
.textHTML("<b>マルチパートのHTMLだよ</b>")
.build();
new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);
もちろん普通に書くこともできます。
Email email = new Email();
email.setFromAddress("kikutaro_from", "kikutaro_from@example.com");
email.addToRecipients("kikutaro_to", "kikutaro_to@example.com");
email.setSubject("サブジェクトだよ");
email.setText("マルチパートのテキストだよ");
email.setTextHTML("<b>マルチパートのHTMLだよ</b>");
new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);
その他、色々紹介していきます。
Recipient
上記のコード例では、宛先を表示名とメールアドレスで表現していますが、これをまとめてRecipientクラスで定義することが可能です。
RecipientTypeは(当たり前ですが)TOとCCとBCCの3つです。
Recipient maiyan = new Recipient("白石麻衣", "kikutaro526@yahoo.co.jp", Message.RecipientType.TO);
Recipient nachan = new Recipient("西野七瀬", "kikutaro526@yahoo.co.jp", Message.RecipientType.CC);
Recipient waka = new Recipient("若月佑美", "kikutaro526@yahoo.co.jp", Message.RecipientType.BCC);
引数は可変長のものがあるので、Recipientを一気に渡せます。
Email email = new Email();
email.addRecipients(maiyan,nachan,waka);
宛先をまとめて指定
宛先のメールアドレスをカンマ区切り並べた文字列をそのまま渡せます。
ccやbccでも同じように指定可能です。
String recipientNogizaka = "shiraishi_mai@example.com,nishino_nanase@example.com,wakatsuki_yumi@example.com";
Email email = new EmailBuilder()
.from("kikutaro", "kikutaro@example.com")
.to(recipientNogizaka)
Message-IDの指定
メールヘッダに含まれるMessage-IDを簡単に指定できます。
Message-IDの詳細(RFC 2822)はこちら→RFC 2822(対訳)インターネットメッセージの形式 - RFCの部屋
通常ユニークな値であるべきものなので、以下の例は良くないものですが、idメソッドで指定できます。
Email email = new EmailBuilder()
.id("thisismyownmessageid")
.from("kikutaro_from", "kikutaro_from@example.com")
実際に送ったメールで確認してみました。まずはMessage-IDを指定しなかった場合は次のとおり。
そして次にMessage-IDを上記コード例のように指定した場合です。
ちゃんと変わってます。
非同期送信
通常のメール送信は同期なのでSMTPの応答を待ちますが、非同期に送信するもできます。
送信するメールの数が多いとき、これは結構便利そうですね。エラーのハンドリングはどうやるのか、気になる所ですが。
Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.sendMail(email, true);
スレッドプール
スレッドプールの値はデフォルトが10とのことですが、変更できます。
Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.setThreadPoolSize(3);
mailer.sendMail(email, true);
ログだけ残して送信しないモード
デバッグログだけ出して実際のメール送信はしない、みたいなことができます。
誤送信しないようにしたり、テストコードとかで使えるのかな。
Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.setDebug(true);
mailer.setTransportModeLoggingOnly(true);
ログについては、Simple Java MailではSLF4jを利用しているのでlog4j2やlogbackなどが利用できるようです。
Spring対応
Springから簡単に利用できるようになっています。
以下はSpring Bootで書いた例ですが@Importを指定するだけです。
@Component
@Import(SimpleJavaMailSpringSupport.class)
public class MyMailService {
@Autowired
private Mailer mailer;
public void sendmail() {
Email email = new EmailBuilder()
.from("kikutaro_from", "kikutaro_from@example.com")
.to("kikutaro_to", "kikutaro_to@example.com")
.subject("Spring bootから")
.text("マルチパートのテキストだよ")
.textHTML("<b>マルチパートのHTMLだよ</b>")
.build();
mailer.sendMail(email);
}
}
application.propetiesでSMTPの設定を定義できます。
simplejavamail.smtp.host = smtp.sendgrid.net
simplejavamail.smtp.port = 587
simplejavamail.smtp.username = ********
simplejavamail.smtp.password = ********
その他
設定(Configure)はファイルでもConfigクラスでも可能です。プロキシなんかへの対応もあるようです。
カスタムヘッダ、添付ファイル、DKIM対応、Return-Receipt-To/Disposition-Notification-To、メールアドレスのバリデーション、MimeやEML,Outlook.msgなどなどあるので、別途書きたい。