在Playframework 2.0中发送电子邮件

Cod*_*nci 22 playframework playframework-2.0

在Playframework 2.0中,发送电子邮件似乎并不那么简单(请参阅Play 1.x中有关在Play Framework中使用sendmail作为SMTP服务器的评论).没有开箱即用的邮件程序功能......所以,我该如何发送电子邮件?

Cod*_*nci 29

Playframework 2.x需要一个Mail插件才能工作.它没有被添加到核心,因为开发人员觉得让电子邮件工作变得微不足道,所以决定创建一个插件更好.然而,谷歌群体上的快速消息表明他们弄错了......人们期望与Play 1.x具有相同的功能.

正如您对社区的期望,一个插件很快就建成了.请参阅https://github.com/playframework/play-mailer.

还有更多的插件需要注意,但这是核心开发人员支持的类型安全,所以我希望它是最好的维护.

  • 如果你正在使用Play!2.1,使用此依赖项:"com.typesafe"%%"play-plugins-mailer"%"2.1.0" (8认同)
  • 自述文件中的路径错误 - 请尝试"com.typesafe"%"play-plugins-mailer_2.9.1"%"2.0.4"`.注意`_2.9.1`. (4认同)
  • 这个2.0的插件列表非常方便 - 请注意它应该是临时的:https://github.com/playframework/Play20/wiki/Modules (2认同)

DCK*_*ing 15

接受的答案是Play需要一个插件来发送电子邮件.这是错误的.您可以轻松地为您的Play应用调整任何JVM邮件库.这是一个使用Apache Commons Email的示例,从这里开始简化我们自己的生产代码.

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(...))
Run Code Online (Sandbox Code Playgroud)

鉴于电子邮件发送在Play中非常简单,我很惊讶插件是值得推荐的.如果你想要升级Play版本,根据插件可能会伤害你,而且我觉得需要30 LoC来完成自己的事情是值得的.我们的代码已经从Play 2.0到2.1到2.2进行了未经修改的升级.