Fork of https://github.com/minosiants/pencil with added AWS SES support, various fixes, improved tests, various enhancements, and removal of the Apache Tika dependency.
PencilMail is a simple SMTP client. Its main goal is to send emails in the simplest possible way.
It is built on top of cats, cats-effect, fs2, and scodec.
PencilMail supports:
- Text emails (ASCII)
- MIME emails
- TLS
- Authentication
- RFC 5321 - Simple Mail Transfer Protocol
- Multipurpose Internet Mail Extensions
- RFC 2045 - Format of Internet Message Bodies
- RFC 2046 - Media Types
- RFC 2047 - Message Header Extensions for Non-ASCII Text
- RFC 2049 - Conformance Criteria and Examples
- RFC 4288 - Media Type Specifications and Registration Procedures
- RFC 1521 - Mechanisms for Specifying and Describing the Format of Internet Message Bodies
- RFC 1522 - Message Header Extensions for Non-ASCII Text
- RFC 4954 - SMTP Service Extension for Authentication
Add dependency to your build.sbt
libraryDependencies += "io.github.roman0x58" %% "pencilmail" % "3.0.5"
val email = Email.text(
from"user name <[email protected]>",
to"[email protected]",
subject"first email",
Body.Ascii("hello")
)
val email = Email.mime(
from"[email protected]",
to"[email protected]",
subject"привет",
Body.Utf8("hi there")
) + attachment"path/to/file"
val email = Email.mime(
from"[email protected]",
to"[email protected]",
subject"привет",
Body.Alternative(List(Body.Utf8("hi there3"), Body.Ascii("hi there2")))
)
object Main extends IOApp {
val logger = Slf4jLogger.getLogger[IO]
override def run(args: List[String]): IO[ExitCode] = {
val credentials = Credentials(
Username("[email protected]"),
Password("password")
)
val action = for {
tls <- Network[IO].tlsContext.system
client = Client[IO](
address = SocketAddress(host"localhost", port"25"),
mode = SmtpMode.Plain,
credentials = Some(credentials),
tlsContext = tls,
logger = logger)
response <- client.send(email)
} yield response
action.attempt.flatMap {
case Right(replies) =>
logger.debug(replies)
case Left(error) =>
error match {
case e: Error => logger.debug(e.toString)
case e: Throwable => logger.debug(e.getMessage)
}
}.unsafeRunSync()
}
}
keytool -import -trustcacerts -keystore test-truststore.jks -storepass changeit -alias mailpit -file certificate.crt
sbt -Daws.username=username -Daws.password=password -Daws.from=from -Daws.to=to
For testing purposes, Docker Mailserver can be used.