【Java】 Java で、 Email を送るには... [4] ~ SMTP認証 / DIGEST-MD5 編 ~

■ はじめに

 * JavaMail を使って、SMTP-AUTH の方式「DIGEST-MD5」でメール送信する方法を考える

■ 用語

SASL(サスル)

 * SASL : Simple Authentication and Security Layer
 * 認証や暗号化などのセキュリティに関する処理を行う層

CRAM-MD5

 * CRAM : Challenge-Response Authentication Mechanism
 * MD5形式でハッシュ化した認証情報を送って認証を行う

DIGEST-MD5

 * CRAM-MD5の弱点をカバーしてセキュリティをさらに向上させた形式

具体的には...
 * CRAM-MD5の欠点である辞書攻撃や総当たり攻撃に対する対処
 * Realm(ログイン領域)やURLの指定(これらはHTTPなどへの応用を想定している)や
   HMAC(keyed-Hashing for Message Authentication Code)による暗号化をサポート

Realm (レルム)

 * 日本語で、「領域、範囲、部門」
 * SMTP認証のドメイン

参考文献

http://www.atmarkit.co.jp/ait/articles/0105/18/news002.html
http://www.wdic.org/w/WDIC/SASL
http://oxynotes.com/?p=4428

■ JavaMailのサポート範囲

DIGEST-MD5

 * DIGEST-MD5はサポート内
https://javamail.java.net/nonav/docs/api/com/sun/mail/smtp/package-summary.html
より抜粋

It can optionally use SMTP Authentication (RFC 2554)
 using the LOGIN, PLAIN, DIGEST-MD5, << ★ DIGEST-MD5はサポート ★
 and NTLM mechanisms (RFC 2595 and RFC 2831).

When using DIGEST-MD5 authentication, you'll also need to supply an appropriate realm;
 your mail server administrator can supply this information.
 You can set this
 using the mail.smtp.sasl.realm property, << ★ "mail.smtp.sasl.realm"を指定 ★
 or the setSASLRealm method on SMTPTransport. << ★ setSASLRealm()を指定 ★

CRAM-MD5

 * CRAM-MD5は???
 * 以下の参考文献の情報によると、GNU JavaMail(https://www.gnu.org/software/classpathx/javamail/javamail.html)
   はサポートしているらしい
http://it-mn-us.blogspot.jp/2009/02/javamail-mechanism.html
http://qa.atmarkit.co.jp/q/7147
http://frmmpgit.blog.fc2.com/blog-entry-129.html

■ ソース抜粋

http://blogs.yahoo.co.jp/dk521123/36491701.html
の「ポイント」の「SMTP認証あり」に追加する場合
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
Authenticator authenticator = new javax.mail.Authenticator() {
  protected PasswordAuthentication getPasswordAuthentication() {
     return new PasswordAuthentication("SMTP_USERNAME", "SMTP_PASSWORD");
  }
};
Session session = Session.getInstance(props, authenticator);
// ★ここ★(setSASLRealm()でもできるらしいが試していない)
props.put("mail.smtp.sasl.realm", "REALM_VALUE");

関連記事

Java で、 Email を送るには... [1] ~ JavaMail / テキストメール編 ~

http://blogs.yahoo.co.jp/dk521123/36230453.html

Postfix を設定する

http://blogs.yahoo.co.jp/dk521123/36557661.html