2012-05-08 123 views

回答

29

Playframework 2.x需要一個用於Mail工作的插件。它並沒有被添加到核心,因爲開發人員認爲讓電子郵件工作變得微不足道,所以決定創建一個插件更好。然而,谷歌羣組上的短消息表明他們錯了......人們期望Play 1.x具有相同的功能。

正如你從社區期待的那樣,一個插件很快就建成了。見https://github.com/playframework/play-mailer

還會有更多的插件需要注意,但這是由核心開發人員提供的類型安全支持,所以我期望它能得到最好的維護。

+2

2.0這個插件列表很方便 - 注意它應該是臨時的:https://github.com/playframework/Play20/wiki/Modules –

+0

@Codemwnci:我正在瀏覽這個模塊依戀支持,但似乎是隱藏或不存在。提示? – Samo

+4

路徑在自述文件中出錯 - 嘗試'「com.typesafe」%「play-plugins-mailer_2.9.1」%「2.0.4」'。注意'_2.9.1'。 – Trick

14

接受的答案是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版本,取決於插件會傷害你,而我不覺得需要30 LoC來完成自己的事情是值得的。我們的代碼從Play 2.0升級到2.1到2.2,未經修改升級。