メール送信フォームの作成
続いて、メールを送信するフォームを作成しましょう。これは、HTMLで作成してもよいのですが、これだと1つ問題があります。Gmailによるメール送信は、当然ですがGmailのアカウントがなければいけません。要するに、認証を使い、ログインされていないと使えないのです。この点を考えると、フォームページにアクセスした際、認証チェックを行うようにしておきたいものです。
HTMLだけではこの処理が実装できないので、他の方法を考える必要があるでしょう。ここでは、Groovletとして作成することにしましょう。「war」内に「mail.groovy」というファイルを作成し、次のように記述をします。
import com.google.appengine.api.users.*
service = UserServiceFactory.getUserService()
if (!service.isUserLoggedIn()){
String url = service.createLoginURL("/mail.groovy")
response.sendRedirect(url)
}
html.doubleQuotes = true
html.html {
head {
title "Mail"
}
body {
h3 "Send Mail"
form(action:'mail', method:'post'){
table(){
tr(){
td "TITLE:"
td(){
input(type:'text', name:'title')
}
}
tr(){
td "CONTENT:"
td(){
textarea(name:'content', cols:30, rows:5, "")
}
}
tr(){
td ""
td(){
input(type:'submit', value:'SEND')
}
}
}
}
}
}

これで、メールのフォームができました。最後に、メール送信後に表示するThanksページを用意しておきます。これは「result.html」というファイル名で用意しておきます。これはただメッセージを表示するだけですので、それぞれで内容は自由に変更してかまいません。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Send Mail</title>
</head>
<body>
<h1>※送信しました。</h1>
<p>ありがとうございました。</p>
<p><a href="mail.groovy">Go back</a></p>
</body>
</html>

これで、ひととおり完成しました。プロジェクトをGoogleサイトにデプロイし、mail.groovyにアクセスしてみましょう。送信のフォームが用意されます。適当にタイトルと内容を書いて送信すると、Gmailから指定されたメールアドレスにメールが送られます。
メールフォームの処理
では、ここで行っている処理についてざっと見てみましょう。まずは、メールのフォームであるmail.groovyからです。ここでは、フォームの表示を行う前に、認証のチェックを行っています。
service = UserServiceFactory.getUserService()
if (!service.isUserLoggedIn()){
String url = service.createLoginURL("/mail.groovy")
response.sendRedirect(url)
}
この部分です。getUserServiceでUserServiceを取得し、isUserLoggedInしていなければ、createLoginURLでログインページのURLを取得し、リダイレクトします。認証は既に説明したものですから改めて説明は不要でしょう。
続いて、Groovletです。こちらも、最初に認証処理をcheckLoginメソッドとして用意しておき、これを呼び出して認証されているかどうかチェックをしています。ログインが確認できたら、メールの送信処理に進みます。まず最初に、送信するメールのための値をひととおり準備します。
String from_s = usr.getEmail()
String title_s = request.getParameter("title")
String content_s = request.getParameter("content")
String to_s = "hoge@example.com"
送信元のアドレスは、UserのgetEmailで取得すればよいでしょう。またタイトルとメールのコンテンツは、POSTで送られてきた"title"、"content"パラメータのテキストをそのまま使います。送信先は、ここではStringで用意しておきました。
続いて、Sessionインスタンスを作成します。この場合のSessionは、サーブレットで用いられているそれではなく、javax.mailパッケージに用意されているSessionで、メール送信のためのセッションです。これは、送信するサーバ情報などをPropertiesインスタンスにまとめて引数に指定するのですが、GAE/Jの場合、送信するメールサーバはGmailのサーバと決まっていますから、この種の情報は必要ありません。ただ単に空のPropertiesインスタンスを渡すだけでOKです。
Properties ps = new Properties() Session ses = Session.getDefaultInstance(ps, null)
続いて、送信するメッセージを作成します。これは「MimeMessage」クラスのインスタンスとして用意します。Sessionインスタンスを引数に渡してインスタンスを作成します。そして、送信するメッセージに関する設定を行います。
MimeMessage msg = new MimeMessage(ses)
「setFrom」は送信元、「addRecipient」は宛先をそれぞれ設定するものです。これらは、InternetAddressインスタンスを使ってアドレスを指定します。addRecipientは、この他に追加するアドレスのタイプの指定が必要で、ここではMessage.RecipientType.TOを指定し、「TO」で追加を行っています(同様に、タイプを設定することでCCやBCCのアドレス追加なども行えます)。
msg.setFrom(new InternetAddress(from_s))
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(to_s))
アドレス関係の次は、タイトルとコンテンツのテキスト設定です。これらは「setSubject」「setText」で設定できます。
msg.setSubject(title_s,"ISO-2022-JP") msg.setText(content_s)
注意したいのは、「タイトルはISO-2022JPでエンコードしておく」という点でしょう。これを忘れると、日本語のタイトルが文字化けしてしまいます。
これでひととおりの設定ができましたので、最後にメッセージを送信します。Transport.sendで引数にMimeMessageインスタンスを指定し、これを送信します。
Transport.send(msg)
これで作業は完了です。後は、sendRedirectでresult.htmlにリダイレクトするだけです。

