play-mailer 를 사용하는 동안 scala Play framework 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="[email protected]"
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 <[email protected]>",
Seq("Miss TO <[email protected]>"),
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
어떤 아이디어?
다른 답변이 제안했듯이 런타임 종속성 주입을 사용할 수 있습니다. 그러나 현재의 접근 방식을 따르고 싶다면 계속 읽어보십시오.
문제는 3.x 브랜치MailerComponents
에 트레이 트가 존재하지 않는다는 것 입니다. 마스터 브랜치 에는 존재하는 것 같지만 다음 브랜치 에는없는 것 같습니다 . 나는 그들이 그곳에서 무엇을하고 있는지 잘 모르겠습니다.
예제를 계속하려면 약간의 조작을하고 컴파일하는 방법을 알아 내야합니다. 예를 들어. 조금 둘러 보면서 다음을 생각해 냈습니다.
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에 문제를 제기해야한다고 생각합니다. 그리고 아마도 당신은해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다