Skip to content

dmurvihill/courier

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

courier

Maven Central

deliver electronic mail with scala from the future

courier

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