deliver electronic mail with scala from the future
Via the copy and paste method
libraryDependencies += "com.github.daddykotex" %% "courier" % "4.0.0-RC1"3.2.0+ supports scala 2.11 to 3.1
Note: Scala3 (or Dotty) is supported.
3.0.0-RC1for dotty:0.27.0-RC13.0.0-M1for dotty:3.0.0-M13.0.0-M2for dotty:3.0.0-M23.0.1scala 3:3.0.13.1.9scala 3:3.1.0
deliver electronic mail via gmail
import courier._, Defaults._
import scala.util._
val mailer = Mailer("smtp.gmail.com", 587)
.auth(true)
.as("[email protected]", "p@$$w3rd")
.startTls(true)()
mailer(Envelope.from("you" `@` "gmail.com")
.to("mom" `@` "gmail.com")
.cc("dad" `@` "gmail.com")
.subject("miss you")
.content(Text("hi mom"))).onComplete {
case Success(_) => println("message delivered")
case Failure(_) => println("delivery failed")
}
mailer(Envelope.from("you" `@` "work.com")
.to("boss" `@` "work.com")
.subject("tps report")
.content(Multipart()
.attach(new java.io.File("tps.xls"))
.html("<html><body><h1>IT'S IMPORTANT</h1></body></html>")))
.onComplete {
case Success(_) => println("delivered report")
case Failure(_) => println("delivery failed")
}If using SSL/TLS instead of STARTTLS, substitute .startTls(true) with .ssl(true) when setting up the Mailer.
Courier supports sending S/MIME signed email through its optional dependencies on the Bouncycastle cryptography libraries. It does not yet support sending encrypted email.
Make sure the Mailer is instantiated with a signer, and then wrap your message in a Signed() object.
import courier._
import java.security.cert.X509Certificate
import java.security.PrivateKey
val certificate: X509Certificate = ???
val privateKey: PrivateKey = ???
val trustChain: Set[X509Certificate] = ???
val signer = Signer(privateKey, certificate, trustChain)
val mailer = Mailer("smtp.gmail.com", 587)
.auth(true)
.as("[email protected]", "p@$$w3rd")
.withSigner(signer)
.startTtls(true)()
val envelope = Envelope
.from("mr_pink" `@` "gmail.com")
.to("mr_white" `@` "gmail.com")
.subject("the jewelry store")
.content(Signed(Text("For all I know, you're the rat.")))
mailer(envelope)Since courier is based on JavaMail, you can use Mock JavaMail to execute your tests. Simply add the following to your build.sbt:
libraryDependencies += "org.jvnet.mock-javamail" % "mock-javamail" % "1.9" % "test"With this library, you should, given a little bit of boilerplate, be able to set a test against a mocked Mailbox. This repo contains an example.
4.0.0-RC1
- includes a breaking change in the Mailer#apply function. It now returns a
Future[String]as opposed to aFuture[Unit].
(C) Doug Tangren (softprops) and others, 2013-2018