メールを送信する
プロジェクトの作成
以下の設定で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インターフェイスを実装しています。
