Skip to content

Instantly share code, notes, and snippets.

@mariussoutier
Created August 23, 2012 12:13
Show Gist options
  • Save mariussoutier/3436111 to your computer and use it in GitHub Desktop.
Save mariussoutier/3436111 to your computer and use it in GitHub Desktop.
Sending mails fluently in Scala
package object mail {
implicit def stringToSeq(single: String): Seq[String] = Seq(single)
implicit def liftToOption[T](t: T): Option[T] = Some(t)
sealed abstract class MailType
case object Plain extends MailType
case object Rich extends MailType
case object MultiPart extends MailType
case class Mail(
from: (String, String), // (email -> name)
to: Seq[String],
cc: Seq[String] = Seq.empty,
bcc: Seq[String] = Seq.empty,
subject: String,
message: String,
richMessage: Option[String] = None,
attachment: Option[(java.io.File)] = None
)
object send {
def a(mail: Mail) {
import org.apache.commons.mail._
val format =
if (mail.attachment.isDefined) MultiPart
else if (mail.richMessage.isDefined) Rich
else Plain
val commonsMail: Email = format match {
case Plain => new SimpleEmail().setMsg(mail.message)
case Rich => new HtmlEmail().setHtmlMsg(mail.richMessage.get).setTextMsg(mail.message)
case MultiPart => {
val attachment = new EmailAttachment()
attachment.setPath(mail.attachment.get.getAbsolutePath)
attachment.setDisposition(EmailAttachment.ATTACHMENT)
attachment.setName(mail.attachment.get.getName)
new MultiPartEmail().attach(attachment).setMsg(mail.message)
}
}
// TODO Set authentication from your configuration, sys properties or w/e
// Can't add these via fluent API because it produces exceptions
mail.to foreach (commonsMail.addTo(_))
mail.cc foreach (commonsMail.addCc(_))
mail.bcc foreach (commonsMail.addBcc(_))
commonsMail.
setFrom(mail.from._1, mail.from._2).
setSubject(mail.subject).
send()
}
}
}
package something
object Demo {
import mail._
send a new Mail (
from = ("john.smith@mycompany.com", "John Smith"),
to = "boss@mycompany.com",
cc = "hr@mycompany.com",
subject = "Import stuff",
message = "Dear Boss..."
)
send a new Mail (
from = "john.smith@mycompany.com" -> "John Smith",
to = Seq("dev@mycompany.com", "marketing@mycompany.com"),
subject = "Our New Strategy (tm)",
message = "Please find attach the latest strategy document.",
richMessage = "Here's the <blink>latest</blink> <strong>Strategy</strong>..."
)
send a new Mail (
from = "john.smith@mycompany.com" -> "John Smith",
to = "dev@mycompany.com" :: "marketing@mycompany.com" :: Nil,
subject = "Our 5-year plan",
message = "Here is the presentation with the stuff we're going to for the next five years.",
attachment = new java.io.File("/home/boss/important-presentation.ppt")
)
}
@yuvaraj-hubino
Copy link

Hi All,
I am getting the below, can anyone clarify the reason

Error during processing of request: 'Sending the email to the following server failed : smtp.gmail.com:465'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler.
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:465

Configuration

commonsMail.setHostName("smtp.gmail.com")
commonsMail.setAuthentication("test@gmail.com","password")
commonsMail.setSSLOnConnect(true)
commonsMail.setSmtpPort(465)

@yuvaraj-hubino
Copy link

sample for gmail and multi file support

package object Mail {

  implicit def stringToSeq(single: String): Seq[String] = Seq(single)
  implicit def liftToOption[T](t: T): Option[T] = Some(t)

  sealed abstract class MailType
  case object Plain extends MailType
  case object Rich extends MailType
  case object MultiPart extends MailType

  case class Mail(
                   from: (String, String), // (email -> name)
                   to: Seq[String],
                   cc: Seq[String] = Seq.empty,
                   bcc: Seq[String] = Seq.empty,
                   subject: String,
                   message: String,
                   richMessage: Option[String] = None,
                   attachments: Seq[(java.io.File)] = Seq.empty
                 )

  object send {
    def a(mail: Mail) {
      import org.apache.commons.mail._

      val format =
        if (mail.attachments.nonEmpty) MultiPart
        else if (mail.richMessage.isDefined) Rich
        else Plain

      val commonsMail: Email = format match {
        case Plain => new SimpleEmail().setMsg(mail.message)
        case Rich => new HtmlEmail().setHtmlMsg(mail.richMessage.get).setTextMsg(mail.message)
        case MultiPart => {
          val multipartEmail = new MultiPartEmail()
          mail.attachments.foreach { file =>
            val attachment = new EmailAttachment()
            attachment.setPath(file.getAbsolutePath)
            attachment.setDisposition(EmailAttachment.ATTACHMENT)
            attachment.setName(file.getName)
            multipartEmail.attach(attachment)
          }
          multipartEmail.setMsg(mail.message)
        }
      }

      // TODO Set authentication from your configuration, sys properties or w/e

      // Can't add these via fluent API because it produces exceptions
      mail.to foreach (commonsMail.addTo(_))
      mail.cc foreach (commonsMail.addCc(_))
      mail.bcc foreach (commonsMail.addBcc(_))

      // gmail config
      commonsMail.setHostName("smtp.googlemail.com")
      commonsMail.setAuthentication("email","pass")
      commonsMail.setSSLOnConnect(true)
      commonsMail.setSmtpPort(465)

      commonsMail.
        setFrom(mail.from._1, mail.from._2).
        setSubject(mail.subject).
        send()
    }
  }
}

I got the below error while using the given code snippet.

https://gist.github.com/mariussoutier/3436111#gistcomment-3242151

As well found the solution for the issue using the below link

https://stackoverflow.com/a/59760500/7199780

So is it safe?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment