連載
» 2005年02月08日 10時00分 公開

JavaTips 〜Javaアプリケーション編:JavaMailでメール送信アプリを作る

[山田祥寛,@IT]

 さまざまなWebアプリケーションを構築していると、メールと連携した仕掛けが欲しいというケースが出てくると思います。例えば、ECアプリケーションであれば、注文処理を行ったタイミングで商品提供者には注文があった旨を通知することで、定期的にサイトやデータベースを確認しなくても済むようになります。顧客には受注確認通知を送信すれば、注文時にいちいちWebの画面をコピーする必要もなくなります。はたまた、新規商品が追加されたタイミングで、新着情報を希望者にニュース配信するというようなケースもあるかもしれません。

 いわゆる「プル型(自分で情報を収集する)」であるブラウザ・アプリケーションと、「プッシュ型(情報提供者が積極的に情報を配信する)」であるメール・アプリケーションとをうまく連携させることで、よりユーザ・フレンドリーであり、サイト管理者にとっても有益な仕組みを提供することができるのです。

 本稿では、このようなメール・アプリケーションを簡単に構築するためのライブラリ――JavaMailを紹介します。JavaMailを利用することで、SMTP(Simple Mail Transfer Protocol)のような低レベルな通信の手続きをまったく意識することなく、ただ必要なパラメータを与えるだけで、メール送信を実現することができます。

 ここでは、まず固定的なテキストをメール送信してみますが、もちろん、パラメータを編集すれば、ユーザーが入力した内容やデータベースから取得したデータを基に、動的に送信先や本文を編集するようなこともできるでしょう。

 それでは早速、具体的なコードを眺めてみることにしましょう。

解説

(1)JavaMailライブラリをインストールする

 JavaMailライブラリを利用するには、JavaMailそのものに加えて、JAF(Java Activation Framework)をインストールする必要があります。JavaMail/JAFは、以下のサイトからダウンロードすることが可能です。

 ダウンロードしたjavamail-X.X.zip、jafX_X_X.zip(X.X、X_X_Xはバージョン番号)を解凍し、展開されたフォルダ内にあるmail.jar、activation.jarに対してクラスパスを設定します。

(2)Javaアプリケーションを作成する

 環境の準備が整ったところで、メールを送信するためのJavaアプリケーションを定義してみましょう。

MailTransfer.java
  package to.msn.wings.javatips;

import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 

public class MailTransfer {
  public static void main(String[] args) {
    Properties objPrp=new Properties();
    objPrp.put("mail.smtp.host","smtp.xxxxx.ne.jp"); // SMTPサーバ名
    objPrp.put("mail.host","smtp.xxxxx.ne.jp"); // 接続するホスト名
    // メールセッションを確立
    Session session=Session.getDefaultInstance(objPrp,null);
    // 送信メッセージを生成
    MimeMessage objMsg=new MimeMessage(session);
    try {
    // 送信先(TOのほか、CCやBCCも設定可能)
      objMsg.setRecipients(Message.RecipientType.TO,"webmaster@wings.msn.to");
    // Fromヘッダ
      InternetAddress objFrm=new InternetAddress("CQW15204@nifty.com","Y.Yamada");

      objMsg.setFrom(objFrm);
    // 件名
objMsg.setSubject("メールテスト","ISO-2022-JP");
       
    // 本文
      objMsg.setText("こんにちは","ISO-2022-JP");
      
    // メール送信
      Transport.send(objMsg); 
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (MessagingException e) {
      e.printStackTrace();
    } 
  }
}


 本サンプルを実行することで、webmaster@wings.msn.toあてに「メールテスト」という件名のメールが送信されるはずです。実際にサンプルコードを動作するに際しては、環境に応じて、該当するヘッダ情報や本文(赤字部分)を変更するようにしてください。また、本TIPSでは、本文、件名などをハードコーディングしていますが、もちろん、ユーザーによる入力やテンプレートなどを利用して、これらを動的に生成することも可能でしょう。

JavaMailを利用する場合の注意点

 最後にJavaMailでメール送信を行う場合の注意点をいくつか挙げておきます。

(1)日本語はISO-2022-JP(JIS)にエンコード

 メール本文やサブジェクトなどに日本語を含む可能性がある場合には、あらかじめISO-2022-JP(JIS)にエンコードする必要があります。さもないと、受信したメーラ側で文字化けの原因となります。

(2)mail.smtp.host、mail.hostプロパティは双方指定

 mail.smtp.hostプロパティはmail.hostプロパティに優先して認識されるため、2つの値が同一ならば、mail.smtp.hostプロパティを設定するだけでもメール送信は可能です。しかし、mail.hostプロパティは内部的にMessage-IDヘッダを生成するのに利用されます。mail.hostプロパティを明示的に指定していない場合、Message-IDヘッダが正しく生成できない可能性があります。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。