メール送信フォームの作成
続いて、メールを送信するフォームを作成しましょう。これは、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にリダイレクトするだけです。