SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Google App Engine for Javaを使ってみよう!

Google App Engine for Javaを使ってみよう!
(6)Mail Java API

Google App Engine for Javaを使ってみよう! (6)

  • X ポスト
  • このエントリーをはてなブックマークに追加

メールを送信する

プロジェクトの作成

 以下の設定でGWTプロジェクトを作成して下さい(GWTプロジェクトの作成手順については、第1回の解説を参照)。今回は日本語(2バイトコード)を扱いたいので、言語設定は[UTF-8]を設定します。

プロジェクトの設定(言語設定はUTF-8に)
Project name Mail
Package com.daisukeyamashita.test.mail

プログラムの作成

  プログラムは、「メールアドレス」の入力を受けて、「そのアドレスへメールを送信」「そのアドレスへBccとしてメールを送信」「そのアドレスへ添付ファイル付きのメールを送信」の3つの機能を実行するボタンを実装します。

com.daisukeyamashita.test.mail.client.GreetingService クラス
package com.daisukeyamashita.test.mail.client;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("greet")
public interface GreetingService extends RemoteService {

    enum COMMAND {
        NORMAL, BCC, ATTACHE
    };

    void sendMail(String mailAddress, String name, COMMAND command);

}

 GWTのリモート呼び出しでプログラムを実装しますが、3つの機能はsendMail()の引数COMMANDによって切り替えます。

com.daisukeyamashita.test.mail.client.GreetingServiceAsync クラス
package com.daisukeyamashita.test.mail.client;

import com.daisukeyamashita.test.mail.client.GreetingService.COMMAND;
import com.google.gwt.user.client.rpc.AsyncCallback;

public interface GreetingServiceAsync {

    void sendMail(String mailAddress, String name, COMMAND command, AsyncCallback callback);

}

 続いて、メインクラスを実装します。

com.daisukeyamashita.test.mail.client.Mail クラス
package com.daisukeyamashita.test.mail.client;

import com.daisukeyamashita.test.mail.client.GreetingService.COMMAND;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;

public class Mail implements EntryPoint {

    private final GreetingServiceAsync greetingService = GWT.create(GreetingService.class);

    Button btnSendMail;
    Button btnSendAsBcc;
    Button btnSendWithAttach;

    public void onModuleLoad() {

        final VerticalPanel panelMain = new VerticalPanel();

        final Label lblName = new Label("表示名");
        final TextBox tbName = new TextBox();
        tbName.setText("サンプル太郎");
        panelMain.add(lblName);
        panelMain.add(tbName);

        final Label lblMail = new Label("メールアドレス");
        final TextBox tbMail = new TextBox();
        tbMail.setText("test@example.com");
        panelMain.add(lblMail);
        panelMain.add(tbMail);

        btnSendMail = new Button("メールを送信");
        btnSendAsBcc = new Button("Bccとしてメールを送信");
        btnSendWithAttach = new Button("添付ファイル付きのメールを送信");

        panelMain.add(btnSendMail);
        panelMain.add(btnSendAsBcc);
        panelMain.add(btnSendWithAttach);

        RootPanel.get("mainContainer").add(panelMain);

        final DialogBox dialogBox = new DialogBox();
        dialogBox.setText("Remote Procedure Call");
        dialogBox.setAnimationEnabled(true);

        final Button closeButton = new Button("Close");
        closeButton.getElement().setId("closeButton");

        final Label serverResponseLabel = new Label();
        VerticalPanel dialogVPanel = new VerticalPanel();
        dialogVPanel.addStyleName("dialogVPanel");
        dialogVPanel.add(serverResponseLabel);
        dialogVPanel.setHorizontalAlignment(VerticalPanel.ALIGN_RIGHT);
        dialogVPanel.add(closeButton);
        dialogBox.setWidget(dialogVPanel);

        closeButton.addClickHandler(new ClickHandler() {
            public void onClick(ClickEvent event) {
                dialogBox.hide();
                changeButtonState(true);
            }

        });

        final AsyncCallback callback = new AsyncCallback() {

            public void onSuccess(Object result) {
                dialogBox.center();
                closeButton.setFocus(true);
            }

            public void onFailure(Throwable caught) {
                caught.printStackTrace();
            }
        };

        btnSendMail.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                greetingService.sendMail(tbMail.getText(), tbName.getText(), COMMAND.NORMAL,
                        callback);
                changeButtonState(false);
            }
        });

        btnSendAsBcc.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                greetingService.sendMail(tbMail.getText(), tbName.getText(), COMMAND.BCC, callback);
                changeButtonState(false);
            }
        });

        btnSendWithAttach.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                greetingService.sendMail(tbMail.getText(), tbName.getText(), COMMAND.ATTACHE,
                        callback);
                changeButtonState(false);
            }
        });

    }

    private void changeButtonState(boolean state) {
        btnSendMail.setEnabled(state);
        btnSendMail.setFocus(state);
        btnSendAsBcc.setEnabled(state);
        btnSendAsBcc.setFocus(state);
        btnSendWithAttach.setEnabled(state);
        btnSendWithAttach.setFocus(state);
    }

}

 最後にサーバ部分を実装します。ここで送信するメールの本文や添付ファイルの構築を行っています。

com.daisukeyamashita.test.mail.server.GreetingServiceImpl クラス
package com.daisukeyamashita.test.mail.server;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.daisukeyamashita.test.mail.client.GreetingService;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements GreetingService {

    public void sendMail(String mailAddress, String name, COMMAND command) {

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

        try {
            InternetAddress address = new InternetAddress(mailAddress, name, "iso-2022-jp");

            Message message = null;
            switch (command) {
            case NORMAL:
                message = createMessage(session, address);
                break;
            case BCC:
                message = createMessageAsBcc(session, address);
                break;
            case ATTACHE:
                message = createMessageWithAttache(session, address);
                break;
            default:
                //error
            }
            Transport.send(message);
        } catch (UnsupportedEncodingException e) {
            //error
            e.printStackTrace();
        } catch (MessagingException e) {
            //error
            e.printStackTrace();
        }
    }

    private Message createMessage(Session session, InternetAddress address)
            throws MessagingException {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(address); // 送信元アドレス
        message.addRecipient(Message.RecipientType.TO, address); // あて先アドレス

        message.setSubject("Google App Engineからのメールです", "ISO-2022-JP"); // タイトル
        message.setText("連載記事「Google App Engine for Javaを使ってみよう!」をよろしく!"); // メール本文
        return message;
    }

    private Message createMessageAsBcc(Session session, InternetAddress address)
            throws MessagingException {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(address); // 送信元アドレス
        message.addRecipient(Message.RecipientType.BCC, address); // あて先アドレス

        message.setSubject("Google App Engineからのメールです", "ISO-2022-JP"); // タイトル
        message.setText("連載記事「Google App Engine for Javaを使ってみよう!」をよろしく!"); // メール本文
        return message;
    }

    private Message createMessageWithAttache(Session session, InternetAddress address)
            throws MessagingException {
        MimeMessage message = new MimeMessage(session);
        message.setFrom(address); // 送信元アドレス
        message.addRecipient(Message.RecipientType.TO, address); // あて先アドレス

        message.setSubject("Google App Engineからのメールです", "ISO-2022-JP"); // タイトル

        MimeBodyPart body = new MimeBodyPart();
        body.setText("連載記事「Google App Engine for Javaを使ってみよう!」をよろしく!"); // メール本文

        Multipart mp = new MimeMultipart();
        mp.addBodyPart(body);

        MimeBodyPart attache = new MimeBodyPart();
        attache.setDataHandler(new DataHandler(new AttachementDataSource()));
        attache.setFileName("sample.txt"); // 添付ファイル名
        mp.addBodyPart(attache);
        message.setContent(mp); // 添付ファイルデータ

        return message;
    }

    /**
     * 文字化け回避用クラス
     * @author daisuke
     */
    private class AttachementDataSource implements DataSource {

        public String getContentType() {
            return "text/plain; charset=UTF-8"; // mimeタイプ
        }

        public InputStream getInputStream() throws IOException {
            String body = "添付ファイルの中身です。"; // 添付ファイル本文
            String encoding = "UTF-8"; // body のエンコード名
            ByteArrayInputStream in = new ByteArrayInputStream(body.getBytes(encoding));
            return in;
        }

        public String getName() {
            return "";
        }

        public OutputStream getOutputStream() throws IOException {
            return null;
        }

    }
}
war/Mail.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link type="text/css" rel="stylesheet" href="Mail.css">
    <title>Web Application Starter Project</title>
    <script type="text/javascript" language="javascript" src="mail/mail.nocache.js"></script>
  </head>

  <body>
    <iframe src="javascript:''" id="__gwt_historyFrame" tabIndex='-1' style="position:absolute;width:0;height:0;border:0"></iframe>
    <h1>Web Application Starter Project</h1>
    <table align="center">
      <tr>
        <td id="mainContainer"></td>
      </tr>
    </table>
  </body>
</html>
添付ファイルの文字コード

 添付ファイルの本文を日本語にする場合、setText()を使って設定すると、文字コードにUS-ASCIIが設定されてしまい、2バイトコードは文字化けしてしまいます。文字コードをUTF-8にするために、DataSourceインターフェイスを実装しています。

次のページ
実行する

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Google App Engine for Javaを使ってみよう!連載記事一覧

もっと読む

この記事の著者

山下 大介(ヤマシタ ダイスケ)

  京都大学を中心とした、産官学共同プロジェクトのSOBAプロジェクトに参加後、同プロジェクトで開発したP2P配信によるVoIP技術を2005年に商業化。オープンソース、VoIP、P2P、クラウドコンピューティングに精通。趣味はGoogleの追っかけ。現在は、株式会社SOBAプロジェクト取締役。ブログ:『~ ミネルヴァの梟は黄昏とともに飛び始める ~』所属:株式会社SOBAプロジェクトGoogle Developer Day 2008サポーター, 2009サポーターGoogle App Engine API Expert

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3917 2009/06/03 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング