scala Play Framework 2.4:发送电子邮件

时间:2015-09-26 19:40:09

标签: scala email playframework playframework-2.4

我尝试在使用play-mailer时从scala Play框架2.4发送电子邮件,我已按照其示例页面中的说明进行操作但未成功。

我已将依赖项添加到build.sbt:

libraryDependencies ++= Seq(
  "com.typesafe.play" %% "play-mailer" % "3.0.1"
)

在application.conf中,我添加了以下内容:

play.mailer {
    host=smtp.gmail.com
    port=465 
    ssl=true
    tls=true
    user="testme@gmail.com"
    password=abracadabra
}

最后,邮寄类:

package controllers

import java.io.File
import javax.inject.Inject
import org.apache.commons.mail.EmailAttachment
import play.api.Configuration
import play.api.Play.current
import play.api.libs.mailer._

class Mail(mailer: MailerClient) {
  def send = {
    val cid = "1234"
    val email = Email(
      "Simple email",
      "Mister FROM <from@email.com>",
      Seq("Miss TO <to@email.com>"),
      bodyText = Some("A text message"),
      bodyHtml = Some("some data....")
    )
    mailer.send(email)
  }
}

到目前为止没有编译错误,但是我不明白如何初始化这个类..我应该如何获得“MailerClient”实例?

在文档中写入“然后在路由器定义中,使用特征MailerComponents”,使用以下代码示例:

import play.api._
import play.api.ApplicationLoader.Context
import router.Routes
import play.api.libs.mailer._

class MyApplicationLoader extends ApplicationLoader {
  def load(context: Context) = {
    new ApplicationComponents(context).application
  }
}

class ApplicationComponents(context: Context) extends BuiltInComponentsFromContext(context) with MailerComponents {
  lazy val myComponent = new MyComponent(mailerClient)
  // create your controllers here ...
  lazy val router = new Routes(...) // inject your controllers here
}

(我在application.conf中添加了“play.application.loader = SimpleApplicationLoader”)

但是我收到以下编译错误:

D:\myApp\app\SimpleApplicationLoader.scala:12: not found: type MailerComponents

[error] class ApplicationComponents(context: Context) extends BuiltInComponentsFromContext(context) with MailerComponents {
[error]                                                                                                  ^
[error] D:\myApp\app\SimpleApplicationLoader.scala:13: not found: value mailerClient
[error]   lazy val applicationController = new controllers.Mail(mailerClient)
[error]                                                         ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

你可以使用运行时依赖注入,正如另一个答案所暗示的那样。但如果您想采用当前的方法,请继续阅读......

问题是,3.x branch中不存在MailerComponents特征。它确实存在于master branch中,但不存在于next branch中。我不确定他们在那里做什么。

如果你想继续这个例子,你需要做一些摆弄并弄清楚如何编译。对于前者看了一下,我想出了以下内容。

import play.api._
import play.api.ApplicationLoader.Context
import router.Routes
import play.api.libs.mailer._

class SimpleApplicationLoader extends ApplicationLoader {
  def load(context: Context) = {
    new ApplicationComponents(context).application
  }
}

class ApplicationComponents(context: Context) extends BuiltInComponentsFromContext(context) {
  val mailerClient = new CommonsMailer(configuration)
  lazy val applicationController = new controllers.ApplicationScala(mailerClient)
  lazy val assets = new controllers.Assets(httpErrorHandler)
  lazy val router = new Routes(httpErrorHandler, applicationController)
}

基本上,我没有依赖不存在的MailerComponent为我创建mailerClient,而是自己做了。

如果controllers.ApplicationScala

中有以下行
val id = mailer.configure(Configuration.from(Map("host" -> "typesafe.org", "port" -> 1234))).send(email)

将其替换为:

val id = mailer.send(email)

它会编译。同时,我想我应该在github上提出一个问题。也许你应该。

答案 1 :(得分:0)

我相信你可以简单地让play框架注入邮件客户端。设置配置并使用@Inject()注释构造函数应该可行。 您的Mail控制器声明如下:

class Mail @Inject() (mailer: MailerClient) {