メールを送信する
プロジェクトの作成
以下の設定でGWTプロジェクトを作成して下さい(GWTプロジェクトの作成手順については、第1回の解説を参照)。今回は日本語(2バイトコード)を扱いたいので、言語設定は[UTF-8]を設定します。
Project name | |
Package | com.daisukeyamashita.test.mail |
プログラムの作成
プログラムは、「メールアドレス」の入力を受けて、「そのアドレスへメールを送信」「そのアドレスへBccとしてメールを送信」「そのアドレスへ添付ファイル付きのメールを送信」の3つの機能を実行するボタンを実装します。
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
によって切り替えます。
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); }
続いて、メインクラスを実装します。
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); } }
最後にサーバ部分を実装します。ここで送信するメールの本文や添付ファイルの構築を行っています。
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; } } }
<!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
インターフェイスを実装しています。