SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Groovy+GrailsでRailsなWeb開発

GroovyとGoogle App Engineでアプリ開発(番外編)
~GAEで利用できるさまざまなサービス

Groovy+GrailsでRailsなWeb開発 第8回


  • X ポスト
  • このエントリーをはてなブックマークに追加

メール送信フォームの作成

 続いて、メールを送信するフォームを作成しましょう。これは、HTMLで作成してもよいのですが、これだと1つ問題があります。Gmailによるメール送信は、当然ですがGmailのアカウントがなければいけません。要するに、認証を使い、ログインされていないと使えないのです。この点を考えると、フォームページにアクセスした際、認証チェックを行うようにしておきたいものです。

 HTMLだけではこの処理が実装できないので、他の方法を考える必要があるでしょう。ここでは、Groovletとして作成することにしましょう。「war」内に「mail.groovy」というファイルを作成し、次のように記述をします。

「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')
                    }
                }
            }
        }
    }
}
作成したmail.groovyにアクセスすると、このような送信フォームが表示される
作成したmail.groovyにアクセスすると、このような送信フォームが表示される

 これで、メールのフォームができました。最後に、メール送信後に表示するThanksページを用意しておきます。これは「result.html」というファイル名で用意しておきます。これはただメッセージを表示するだけですので、それぞれで内容は自由に変更してかまいません。

「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から指定されたメールアドレスにメールが送られます。

送信されたメールをGmailで確認する。フォームから送ったメールがちゃんと届いていればOK
送信されたメールをGmailで確認する。フォームから送ったメールがちゃんと届いていればOK

メールフォームの処理

 では、ここで行っている処理についてざっと見てみましょう。まずは、メールのフォームであるmail.groovyからです。ここでは、フォームの表示を行う前に、認証のチェックを行っています。

認証チェックの部分
service = UserServiceFactory.getUserService()
if (!service.isUserLoggedIn()){
    String url = service.createLoginURL("/mail.groovy")
    response.sendRedirect(url)
}

 この部分です。getUserServiceUserServiceを取得し、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です。

「Session」インスタンスを作成
Properties ps = new Properties()
Session ses = Session.getDefaultInstance(ps, null)

 続いて、送信するメッセージを作成します。これは「MimeMessage」クラスのインスタンスとして用意します。Sessionインスタンスを引数に渡してインスタンスを作成します。そして、送信するメッセージに関する設定を行います。

「MimeMessage」クラスのインスタンスを作成
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にリダイレクトするだけです。

次のページ
イメージ処理

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Groovy+GrailsでRailsなWeb開発連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4400 2009/10/09 20:27

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング