ようへい

2012年7月6日金曜日

[GAE/J] 文字化けさせずにメールを送信する方法

Google App Engineでメールを送りたいというケースがあると思います。
今回は、メール送信でちょっとハマったので、メール送信方法について書きたいと思います。

失敗したケース

以下のクラスをインポートしてメールを送ろうとしました。
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
メール送信処理はこんな感じ。
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
Message msg = new MimeMessage(session);
try {
    msg.setFrom(new InternetAddress("hoge@example.com"));
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress("hoge@example.com"));
    msg.setSubject("テスト");
    msg.setText("テストメールです");
    Transport.send(msg);
} catch (AddressException e) {
    e.printStackTrace();
} catch (MessagingException e) {
    e.printStackTrace();
}
これを実行してみると・・・
メール本文はちゃんとMIMEエンコードが行われている。
しかし、Subjectがエンコードされておらず、文字化けして見えてしまう。

う~ん。

調査

GAEでメールを送る場合、オーナー(もしくは、オーナーとして招待したユーザ)のメールアドレスから送る必要がある。
今回Fromに指定したアドレスはオーナーのアドレスであることはGAEの管理画面からも確認できている。
となると何が原因なのか。

GAEのメール送信について調べてみよう。
MailService (Google App Engine Java API)
https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/mail/MailService あ、そもそもメール送信に使うクラスが違っていたみたい。

リトライ

という事で、以下のクラスをインポート。
import com.google.appengine.api.mail.MailService.Message;
import com.google.appengine.api.mail.MailServiceFactory;
メール送信処理は以下のように変更
Message message = new Message();
message.setSender("hoge@example.com");
message.setTo("hoge@example.com");
message.setSubject(subject);
message.setTextBody(body);
try {
    MailServiceFactory.getMailService().send(message);
} catch (IOException e) {
    e.printStackTrace();
}
無事文字化けも無くメール送信が完了しました。
関連記事

0 件のコメント:

コメントを投稿