Skip to content

Instantly share code, notes, and snippets.

scala> EmailClient.sendEmail(from = EmailAddress("[email protected]"), to = EmailAddress("[email protected]"))(
"""
Hello,
Hope you're doing well!
Best,
Luis
"""
)
scala> EmailAddress("@example.com")
res0: EmailAddress = EmailAddress(@example.com)
object EmailAddress {
// Regex that captures the "official" format standard (RFC 5322) that email addresses must adhere to
private val EmailRegex = """(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])""".r
private def isValidAddress(emailAddress: String): Boolean = {
EmailRegex.findAllMatchIn(emailAddress).length == 1
}
def apply(emailAddress: String): EmailAddress = {
scala> EmailAddress("@example.com")
java.lang.IllegalArgumentException: requirement failed: Invalid email address
at scala.Predef$.require(Predef.scala:277)
at EmailAddress$.apply(<pastie>:23)
... 36 elided
def apply(emailAddress: String): Either[String, EmailAddress] = {
if (isValidAddress(emailAddress)) {
Right(new EmailAddress(emailAddress))
} else {
Left("Invalid email address")
}
}
scala> EmailAddress("@example.com")
res0: Either[String,EmailAddress] = Left(Invalid email address)
scala> val emailAddress = EmailAddress("[email protected]")
emailAddress: Either[String,EmailAddress] = Right(EmailAddress([email protected]))
scala> emailAddress.map(_.copy(emailAddress = "@example.com"))
res0: scala.util.Either[String,EmailAddress] = Right(EmailAddress(@example.com))
case class EmailAddress(emailAddress: String) {
def copy(emailAddress: String = emailAddress): Either[String, EmailAddress] = {
EmailAddress(emailAddress)
}
}
scala> EmailAddress("[email protected]").map(_.copy(emailAddress = "@example.com"))
res0: scala.util.Either[String,Either[String,EmailAddress]] = Right(Left(Invalid email address))
scala> for {
| e1 <- EmailAddress("[email protected]")
| e2 <- e1.copy(emailAddress = "@example.com")
| } yield e2
res1: scala.util.Either[String,EmailAddress] = Left(Invalid email address)