2012-05-08 31 views

Trả lời

29

Playframework 2.x yêu cầu plugin để Mail hoạt động. Nó không được thêm vào lõi bởi vì các nhà phát triển cảm thấy nó là tầm thường để có được Email làm việc, vì vậy quyết định nó là tốt hơn để tạo ra một plugin. Tuy nhiên, sự nhanh chóng của các tin nhắn trên các nhóm google cho thấy họ đã sai nó ... mọi người mong đợi các chức năng tương tự như chơi 1.x.

Như bạn mong đợi từ cộng đồng, plugin được xây dựng nhanh chóng. Xem https://github.com/playframework/play-mailer.

Sẽ có nhiều plugin để tìm kiếm, nhưng đây là trình cắm được hỗ trợ an toàn bởi một nhà phát triển cốt lõi, vì vậy tôi hy vọng nó sẽ được duy trì tốt nhất.

+2

Danh sách plugin này dành cho 2.0 là tiện dụng - lưu ý rằng nó được cho là tạm thời: https://github.com/playframework/Play20/wiki/Modules –

+0

@Codemwnci: Tôi đang xem qua mô-đun này cho hỗ trợ tệp đính kèm nhưng dường như là ẩn hoặc không tồn tại. Lời khuyên? – Samo

+4

Đường dẫn sai trong readme - thử "" com.typesafe "%" play-plugins-mailer_2.9.1 "%" 2.0.4 "'. chú ý '_2.9.1'. – Trick

2

Tôi đã nhanh chóng tấn công plugin với hỗ trợ cho tệp đính kèm, bởi vì cho đến nay đề cập đến @Codemwnci không có. You can check it out.

14

Câu trả lời được chấp nhận là Play cần plugin để gửi e-mail. Điều này là sai. Bạn có thể dễ dàng điều chỉnh bất kỳ thư viện gửi thư JVM nào cho ứng dụng Play của mình. Dưới đây là một ví dụ sử dụng Apache Commons Email, thích nghi cho sự đơn giản từ here và mã sản xuất riêng của chúng tôi.

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

Vì việc gửi e-mail được thực hiện một cách đáng kể trong Play, tôi rất ngạc nhiên khi bạn sử dụng plugin. Tùy thuộc vào một plugin có thể làm tổn thương bạn nếu bạn muốn nâng cấp các phiên bản Play, và tôi không cảm thấy một cái gì đó mà mất 30 LoC để hoàn thành chính mình là giá trị nó. Mã của chúng tôi đã nâng cấp chưa sửa đổi từ Play 2.0 lên 2.1 lên 2.2.