tsumurak @Wiki

JavaMailのセキュリティ認証方式について

最終更新:

匿名ユーザー

- view
だれでも歓迎! 編集

JavaMailのセキュリティ

それでは、JavaMailのセキュリティがどうなっているのかを確認していきたいと思います。"JavaMailはセキュリティ部分を実装していません"とJavaMailの付属のドキュメントやSUNのJavaMailのサイトに記述してあります。
ここで、JavaMailの構成を図-1に示します。

JavaMailフレームワークとプロバイダ
図-1 JavaMailフレームワークとプロバイダ

実は、"JavaMailはセキュリティに対応していません"と言う説明はJavaMailフレームワークの部分のことを示しています。従って、以下のことが言えます。

・ セキュリティの実装はプロバイダが行います
・ JavaMailに標準でついてくるSUNのプロバイダが実装していない認証方法でも、新たなプロバイダを作成することによって対応させることが可能です

では、JavaMail標準のSMTP,POP3,IMAPプロバイダはどのような認証方法に対応しているか説明します。各プロトコルの認証方法とJavaMail付属のプロバイダとの関係を表-1に示します。

表-1 各プロトコルの認証方法とJavaMail付属のプロバイダでの対応
プロトコル 対応している認証方法
SMTP AUTH LOGINに対応
SMTP before POP3は対応可能
POP3 通常のPOP3の認証方式のみ対応
IMAP LOGINコマンドのみ対応

表-1より、JavaMail付属のプロバイダは、パスワードが平文のものしかサポートされていないことがわかります。ただし、サードパーティー製のプロバイダでは、APOPなどをサポートしているものもあります。SUNのJavaMailのサイトにプロバイダを作成している企業、個人のページへのリンクがあります。その中にはAPOPのプロバイダはフリー(GPL)で配布されているものもあります。必要に応じて調べて下さい。

プログラミング

JavaMail付属のプロバイダは、セキュリティ保護された認証方式を確かにサポートしていませんが、SMTP AUTHはサポートしています。それではJavaMail付属のプロバイダを利用して、AUTH LOGINで認証を行うプログラムを書いてみましょう。

(注) 実際に認証を行うためにはメールサーバ側がAUTH LOGINに対応している必要があるので注意して下さい リスト-1は、SMTP AUTHを利用しない場合の例です。 リスト-1 認証なしのSMTPでの送信部分

                   <省略>
            1   Properties props = new Properties();
            2   props.put("mail.smtp.host","127.0.0.1"); //SMTPサーバのアドレス
            3   props.put("mail.debug",  "true");        //JavaMailのデバッグモード
            4
            5   Session session = Session.getDefaultInstance(props,null);

<省略>
6 //メール本文を作成 7 MimeMessage msg = new MimeMessage(session); 8 9 //送信先アドレス 10 InternetAddress[] to = { new InternetAddress("test@localhost") }; 11 msg.setRecipients(Message.RecipientType.TO,to); 12 13 //送信元アドレス 14 msg.setFrom(new InternetAddress("test@localhost")); 15 16 //サブジェクト 17 msg.setSubject("test"); 18 19 //本文 20 msg.setText("testmail"); 21 22 //送信 23 Transport.send(msg); <以下略>

リスト-2は、SMTP AUTHを利用した場合の例です。

リスト-2 AUTH LOGINを利用したSMTPでの送信部分
                   <省略>
            1   Properties props = new Properties();
            2   props.put("mail.smtp.host","127.0.0.1"); //SMTPサーバのアドレス
            3   props.put("mail.debug",  "true");        //JavaMailのデバッグモード
             4   props.put( "mail.smtp.auth", "true" );   //SMTP authを利用する
            5   Session session = Session.getDefaultInstance(props,null);

<省略>
6 //メール本文を作成 7 MimeMessage msg = new MimeMessage(session); 8 9 //送信先アドレス 10 InternetAddress[] to = { new InternetAddress("test@localhost") }; 11 msg.setRecipients(Message.RecipientType.TO,to); 12 13 //送信元アドレス 14 msg.setFrom(new InternetAddress("test@localhost")); 15 16 //サブジェクト 17 msg.setSubject("test"); 18 19 //本文 20 msg.setText("testmail"); 21 22 //送信 23 Transport tp = session.getTransport("smtp"); 24 tp.connect( "127.0.0.1", //SMTPサーバ 25 "userid", //ユーザID 26 "passwd" ); //パスワード 27 28 tp.sendMessage( msg, //メール本文 29 to ); //送信先リスト 30 <以下略>

4行目でSMTP AUTHを利用するようにプロパティを設定します。また、24行目から26行目でSMTPサーバへログイン処理を行い、28行目、29行目で送信を行います。
認証を利用する時の注意すべき点は、Transport#sendメソッドは利用できず、必ずTransportを取得し、メールを送信しなければならないことです。
JavaMailを使用したメール送信プログラムを作成する場合は、あらかじめTransport#sendMessageメソッドを利用することがプログラミング上の1つのテクニックと言えます。

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

記事メニュー
目安箱バナー