argius note

プログラミング関連

Play2.1,2.2のメール送信プラグインを使う(Scala) #Play2

Play Framework 2.1,2.2のScalaベースアプリでメール送信する時に使用するプラグインを試しました。
基本情報は全て参考URLのページから入手可能です。


概要

今回は、Typesafe Emailer プラグイン(Typesafe製)と、Scala mailer module for Play 2.x(Rhinofly製)を試しました。

どちらもJavaMailのラッパーのようです。JavaMailに慣れていればそのまま使うのもアリかも知れません。
とは言っても、インストール設定とかapplication.confから読み込む機能などを、わざわざ自分で用意する手間を考えると、プラグインを使った方が良いですね。


環境


そういえば、今回初めてPlay2.2を使ったのですが、エクスクラメーションマークが無くなってるんですね。ロゴも。


使用例

Play2.1の場合を示します。Play2.2でも試しています。
簡略版でない使用例は、各プラグインGitHubのREADMEに書かれています。

サンプルプログラムは、次のパラメーターを指定してメールを送信する処理とします。

val fromAddr = ... // 送信者
val toAddr = ...   // 受取人
val subject = ...  // 件名
val body = ...     // 本文(テキスト形式)

SMTPサーバーはGMailのものを使用しました。

Typesafe Emailer プラグイン の例

Scala、Playの本家であるTypesafe製のプラグインです。

// val appDependencies = Seq(
  "com.typesafe" %% "play-plugins-mailer" % "2.1.0"
// )
1500:com.typesafe.plugin.CommonsMailerPlugin

conf/play.pluginsファイルの記載を忘れて(?)しまい、「動かないんです」という方が結構いらっしゃるようなので、注意しましょう。(Stack Overflowなどでたくさん見つかります。)

  • 設定(conf/application.conf)
smtp.host=smtp.gmail.com
smtp.port=587
smtp.ssl=true
smtp.user="(sender account address)"
smtp.password="(sender account password)"
# smtp.mock=true

SMTPポートは、587番ポート(サブミッションポート)を使います。

また、コメントアウトしているsmtp.mock=trueを有効にすると、MockMailerを使うことができます。(⇒MailerPlugin.scala#L332



使い方です。README.mdの内容は古いみたいで、使用例のままでは使えません。

import play.api.Play.current
import com.typesafe.plugin._

val mail = use[MailerPlugin].email
mail.addFrom(fromAddr)
mail.addRecipient(toAddr)
mail.setSubject(subject)
mail.send(body)
Scala mailer module for Play 2.x の例

オランダの企業Rhinoflyが作ったプラグイン。(ついでにScalaプログラマーも募集しているようです。)


こちらのプラグインは、非同期送信も可能になっています。非同期送信にはAsyncMailerを使います。

// val appDependencies = Seq(
  "play.modules.mailer" %% "play-mailer" % "2.0.1"
// )

// val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
  resolvers += "Rhinofly Internal Release Repository" at "http://maven-repository.rhinofly.net:8081/artifactory/libs-release-local"
// )

masterリポジトリのREADMEには、"for Play 2.2.x"と書かれていますが、ブランチで切り替えれば古いバージョンの情報を見ることができます。
Play2の各バージョンに対応するプラグインのバージョンは以下の通り。

  • 2.0.x => "1.0.2"
  • 2.1.x => "2.0.1"
  • 2.2.x => "2.1.3"
  • SMTP設定(conf/application.conf)
mail.failTo="(sender address)"
mail.host=smtp.gmail.com
mail.port=465
mail.username="(sender account)"
mail.password="(sender account password)"

SMTPポートは、465番ポート(SMTP over SSL)を使います。(STARTTLSに対応していない?)

  • 簡略版サンプル(Scala mailer module for Play 2.x)
import play.modules.mailer._
import scala.util.{ Try, Success, Failure }

val email = Email(
  from = EmailAddress("sender name", fromAddr),
  recipients = List(Recipient(RecipientType.TO, EmailAddress("recipient name", toAddr))),
  subject = subject,
  text = body,
  htmlText = body)
val result: Try[Unit] = Mailer.sendEmail(email)
result match {
  case Success(_) =>
    {} // success
  case Failure(ex) =>
    throw ex // failure
}

こちらは、送信はできましたが、本文の改行が無視されてしまいました。(確認中)



以上です。