JavaMailのセキュリティ
それでは、JavaMailのセキュリティがどうなっているのかを確認していきたいと思います。"JavaMailはセキュリティ部分を実装していません"とJavaMailの付属のドキュメントやSUNのJavaMailのサイトに記述してあります。
ここで、JavaMailの構成を図-1に示します。
図-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); |
リスト-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); |
4行目でSMTP
AUTHを利用するようにプロパティを設定します。また、24行目から26行目でSMTPサーバへログイン処理を行い、28行目、29行目で送信を行います。
認証を利用する時の注意すべき点は、Transport#sendメソッドは利用できず、必ずTransportを取得し、メールを送信しなければならないことです。
JavaMailを使用したメール送信プログラムを作成する場合は、あらかじめTransport#sendMessageメソッドを利用することがプログラミング上の1つのテクニックと言えます。