web-dev-qa-db-ja.com

Play Framework2.0でのメールの送信

Playframework 2.0では、Play 1.xの場合ほど簡単にメールを送信することはできません( Play FrameworkでSMTPサーバーとしてsendmailを使用する に関するコメントを参照)。すぐに使えるメーラー機能はありません...では、どうすればメールを送信できますか?

22
Codemwnci

Playframework 2.xを機能させるには、Mailのプラグインが必要です。開発者がEメールを機能させるのは簡単だと感じたため、コアに追加されなかったため、プラグインを作成する方がよいと判断しました。しかし、グーグルグループでのメッセージの急増は、彼らがそれを間違えたことを示唆しました...人々はPlay1.xと同じ機能を期待していました。

コミュニティから期待されるように、プラグインはすぐに作成されました。 https://github.com/playframework/play-mailer を参照してください。

注目すべきプラグインも増えるでしょうが、これはコア開発者によってサポートされているタイプセーフなので、最もよく維持されると思います。

29
Codemwnci

受け入れられた答えは、Playには電子メールを送信するためのプラグインが必要であるというものです。これは誤りです。 PlayアプリにJVMメーリングライブラリを簡単に適合させることができます。これは、Apache Commons Emailを使用した例であり、 here と独自の製品コードから単純化するように適合されています。

import org.Apache.commons.mail._
import scala.util.Try

private val emailHost = Play.configuration.getString("email.Host").get

/**
 *  Sends an email
 *  @return Whether sending the email was a success
 */
def sendMail(from: (String, String), // (email -> name)
             to: Seq[String],
             cc: Seq[String] = Seq.empty,
             bcc: Seq[String] = Seq.empty,
             subject: String,
             message: String,
             richMessage: Option[String] = None,
             attachment: Option[Java.io.File] = None) = {

  val commonsMail: Email = if(mail.attachment.isDefined) {
      val attachment = new EmailAttachment()
      attachment.setPath(mail.attachment.get.getAbsolutePath)
      attachment.setDisposition(EmailAttachment.ATTACHMENT)
      attachment.setName("screenshot.png")
      new MultiPartEmail().attach(attachment).setMsg(mail.message)
    } else if(mail.richMessage.isDefined) {
      new HtmlEmail().setHtmlMsg(mail.richMessage.get).setTextMsg(mail.message)
    } else {
      new SimpleEmail().setMsg(mail.message)
    }
  }

  commonsMail.setHostName(emailHost)

  to.foreach(commonsMail.addTo(_))
  cc.foreach(commonsMail.addCc(_))
  bcc.foreach(commonsMail.addBcc(_))

  val preparedMail = commonsMail.
    setFrom(mail.from._2, mail.from._1).
    setSubject(mail.subject)

  // Send the email and check for exceptions
  Try(preparedMail.send).isSuccess
}

def sendMailAsync(...) = Future(sendMail(...))

電子メールの送信がPlayで非常に簡単に実行されることを考えると、プラグインがまったく推奨されていることに驚いています。プラグインによっては、Playバージョンをアップグレードしたい場合に害を及ぼす可能性があり、自分で達成するのに30LoCかかるものは価値があるとは思いません。私たちのコードは、Play2.0から2.1から2.2への変更なしのアップグレードで機能しました。

15
DCKing

これまでのところ@Codemwnciに記載されているプラ​​グインにはないため、添付ファイルをサポートするプラグインをすばやくハッキングしました。 チェックアウトできます

2
mcveat