2012-05-08 15 views

Respuesta

29

Playframework 2.x requiere un complemento para que Mail funcione. No se agregó al núcleo porque los desarrolladores consideraron que era trivial hacer funcionar el correo electrónico, por lo que decidieron que era mejor crear un complemento. Sin embargo, la rápida ráfaga de mensajes en los grupos de google sugirió que se equivocaron ... las personas esperaban la misma funcionalidad que Play 1.x.

Sin embargo, como esperaba de la comunidad, se creó rápidamente un complemento. Ver https://github.com/playframework/play-mailer.

Habrá más complementos que tener en cuenta también, pero este es el compatible con dispositivos seguros por un desarrollador principal, por lo que espero que sea el mejor mantenido.

+2

Esta lista de complementos para 2.0 ha sido útil, tenga en cuenta que se supone que es temporal: https://github.com/playframework/Play20/wiki/Modules –

+0

@Codemwnci: Estoy mirando a través de este módulo para soporte de archivos adjuntos pero parece estar oculto o inexistente. ¿Consejos? – Samo

+4

La ruta está mal en el archivo léame - prueba '" com.typesafe "%" play-plugins-mailer_2.9.1 "%" 2.0.4 "'. aviso '_2.9.1'. – Trick

2

Rápidamente hackeé el complemento con soporte para archivos adjuntos, porque hasta ahora el mencionado @Codemwnci no lo tiene. You can check it out.

14

La respuesta aceptada es que Play necesita un complemento para enviar correos electrónicos. Esto es falso Puede adaptar fácilmente cualquier biblioteca de correo JVM para su aplicación Play. Aquí hay un ejemplo usando Apache Commons Email, adaptado para simplificar desde here y nuestro propio código de producción.

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

Teniendo en cuenta que el envío de correo electrónico se realiza tan trivialmente en Play, me sorprenden los complementos que se recomiendan en absoluto. Dependiendo de un complemento, puede perjudicarte si quieres actualizar las versiones de Play, y no creo que valga la pena llevar a cabo algo así como 30 LoC. Nuestro código ha trabajado en la actualización no modificada de Play 2.0 a 2.1 a 2.2.

Cuestiones relacionadas