2012-05-08 11 views

risposta

29

Playframework 2.x richiede un plug-in per Mail per funzionare. Non è stato aggiunto al core perché gli sviluppatori hanno ritenuto che fosse banale far funzionare l'email, quindi ha deciso che era meglio creare un plug-in. Tuttavia, la rapida raffica di messaggi su gruppi di google ha suggerito che si sbagliavano ... la gente si aspettava la stessa funzionalità di Play 1.x.

Come ci si aspetta dalla comunità, è stato rapidamente creato un plug-in. Vedi https://github.com/playframework/play-mailer.

Ci saranno altri plugin da tenere d'occhio, ma questo è il tipo supportato da uno sviluppatore principale, quindi mi aspetto che sia il migliore.

+2

Questa lista di plugin per 2.0 è stata utile - si noti che dovrebbe essere temporanea: https://github.com/playframework/Play20/wiki/Modules –

+0

@Codemwnci: sto guardando questo modulo per supporto per gli allegati, ma sembra essere nascosto o inesistente. Suggerimenti? – Samo

+4

Il percorso non è corretto in readme: prova '" com.typesafe "%" play-plugins-mailer_2.9.1 "%" 2.0.4 "'. avviso '_2.9.1'. – Trick

2

Ho subito un plug-in compromesso con il supporto per gli allegati, perché finora quello menzionato @Codemwnci non ce l'ha. You can check it out.

14

La risposta accettata è che Play necessita di un plug-in per inviare e-mail. Questo è falso. Puoi facilmente adattare qualsiasi mailing list JVM per la tua app Play. Ecco un esempio utilizzando Apache Commons Email, adattato per semplicità da here e il nostro codice di produzione.

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(...)) 

Dato che l'invio di e-mail è così banalmente compiuto in gioco, sono i plugin sorpreso sono consigliati a tutti. A seconda di un plug-in può farti male se vuoi aggiornare le versioni di Play, e non ritengo che ne valga la pena qualcosa che richiede 30 LoC per realizzarlo. Il nostro codice ha funzionato l'aggiornamento non modificato da Play 2.0 a 2.1 a 2.2.

Problemi correlati