我尝试在使用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
有什么想法吗?
答案 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) {