Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

Simple Java Mailの主な機能について

昨日書いたSimple Java Mailライブラリの続きです。

kikutaro777.hatenablog.com
f:id:kikutaro777:20170829233253p:plain

昨日のサンプルではビルダーパターンを使いました。

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を指定しなかった場合は次のとおり。
f:id:kikutaro777:20170829233023p:plain

そして次にMessage-IDを上記コード例のように指定した場合です。
f:id:kikutaro777:20170829232909p:plain
ちゃんと変わってます。

非同期送信

通常のメール送信は同期なのでSMTPの応答を待ちますが、非同期に送信するもできます。
送信するメールの数が多いとき、これは結構便利そうですね。エラーのハンドリングはどうやるのか、気になる所ですが。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.sendMail(email, true); //第二引数でasyncを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などなどあるので、別途書きたい。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村