courier
deliver electronic mail with scala from the future
install
Via the copy and paste method
libraryDependencies += "com.github.daddykotex" %% "courier" % "3.2.0"
3.2.0 supports scala 2.11 to 3.1
Note: Scala3 (or Dotty) is supported.
3.0.0-RC1
for dotty:0.27.0-RC1
3.0.0-M1
for dotty:3.0.0-M1
3.0.0-M2
for dotty:3.0.0-M2
3.0.1
scala 3:3.0.1
3.1.9
scala 3:3.1.0
usage
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
.
S/MIME
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)
testing
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.
(C) Doug Tangren (softprops) and others, 2013-2018