X

GAEでメールを送信する方法

GoogleAppEngin/javaでメールを送信する方法を紹介します。GAEはメールを送信するためにJavaMailをサポートしています。


(Original Update by Kinologik)

JavaMailはJava環境下でメールを送るための最もポピュラーなライブラリです。メールを送信するためにはSMTP(電子メールを転送するプロトコル)を利用しなければいけませんが、それら下位層をラッピングして非常にわかりやすいインターフェイスになっています。

さっそくサンプルコードを確認してみましょう。
以下はJavaMailを使い、GAEでメールを送信するコードです。JavaMailはjavax.mailパッケージとしてGAEのライブラリに含まれているため、そのまま利用可能です。

■src/MailServlet.java

@SuppressWarnings("serial")
public class MailServlet extends HttpServlet {
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws IOException {
		resp.setContentType("text/plain");
		resp.getWriter().println("Hello, world");

        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        try {
        	Message msg = new MimeMessage(session);

            //発信元情報:メールアドレス、名前
            msg.setFrom(new InternetAddress("mail@techbooster.org", "mhidaka"));

            //送信先情報
            msg.addRecipient(Message.RecipientType.TO,
                    new InternetAddress("info@techbooster.org", "相手の名前"));

            //タイトルと本文
            msg.setSubject("タイトル:これはテストメールです");
            msg.setText("メール本文");
            Transport.send(msg);

        } catch (AddressException e) {
            //アドレス不明時
        } catch (MessagingException e) {
            //接続失敗時の処理
        }
	}
}

解説は続きから。

12行目:MIME(マイム、電子メールのフォーマットです)タイプのメッセージを作成します。このとき、引数にsessionを指定していますが、
このセッションにはメールで必要な機能の情報が入っています(ここではデフォルト)。全ての機能をサポートしていないときなどにセッションの内容(props)を変えて調整できます。
15行目:発信元情報をMassageクラスのsetFromメソッドを使って設定します。
setFromメソッドの引数はInternetAddressインスタンスを使います。ここではメールアドレスに”mail@techbooster.org”,
差出人に”mhidaka”を設定しています。
18行目:15行目と同様にaddRecipientメソッドで受け取り人のメールアドレス、名前を設定します。
24行目:タイトル、本文を設定したあと、javax.mail.Transportクラスをつかって、メールを送信します。
送信に失敗したら、アドレス不明(宛先不明)、サーバー接続失敗など幾つかのエラーが返ります。try~catchでもれなく処理するようにしてください。

受信者を追加する

CC,BCCが必要な場合、msg.addRecipientの第1引数をCC,BCCに変更します。

            //CC
            msg.addRecipient(Message.RecipientType.CC,
                    new InternetAddress("info@techbooster.org", "相手の名前"));
            //BCC
            msg.addRecipient(Message.RecipientType.BCC,
                    new InternetAddress("info@techbooster.org", "相手の名前"));

とても簡単ですね。GAE上ではメールを送る処理はすぐに実行されます。
メール件数が多いなど、送信時間が長くなりそうな場合は、「時間のかかる処理をタスクキューで分割する」を参考に、タスクキューでの処理分割を試してみてください。

以上、おつかれさまでした。

mhidaka: Software Engineerだよ。DroidKaigi Organizer / Androidと組込とRe:VIEW。techbooster主宰。mhidaka's writings http://booklog.jp/users/mhidaka 技術書典! http://techbookfest.org