22

在 Playframework 2.0 中,发送电子邮件似乎不像在 Play 1.x中那样简单(参见在 Play Framework 中使用 sendmail 作为 SMTP 服务器的评论)。没有开箱即用的邮件功能......那么,我如何发送电子邮件?

4

3 回答 3

29

Playframework 2.x 需要一个插件才能使 Mail 工作。它没有被添加到核心,因为开发人员觉得让电子邮件工作很简单,所以决定最好创建一个插件。然而,谷歌群组上的一连串消息表明他们弄错了......人们期望与 Play 1.x 具有相同的功能。

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

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

于 2012-05-08T05:12:06.733 回答
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(...))

鉴于在 Play 中发送电子邮件是如此简单,我很惊讶插件竟然被推荐了。如果您想升级 Play 版本,依赖插件可能会对您造成伤害,而且我不觉得需要 30 LoC 来完成自己的事情是值得的。我们的代码在从 Play 2.0 到 2.1 到 2.2 的未经修改的情况下工作。

于 2014-03-18T14:08:05.430 回答
2

我很快就破解了支持附件的插件,因为到目前为止提到的@Codemwnci 没有它。你可以检查一下

于 2012-11-16T14:19:02.690 回答