- 
      
 - 
        
Save mariussoutier/3436111 to your computer and use it in GitHub Desktop.  
| 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 = ("[email protected]", "John Smith"), | |
| to = "[email protected]", | |
| cc = "[email protected]", | |
| subject = "Import stuff", | |
| message = "Dear Boss..." | |
| ) | |
| send a new Mail ( | |
| from = "[email protected]" -> "John Smith", | |
| to = Seq("[email protected]", "[email protected]"), | |
| 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 = "[email protected]" -> "John Smith", | |
| to = "[email protected]" :: "[email protected]" :: 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") | |
| ) | |
| } | 
Thanks man, really appreciate
Thank you for sharing this
Hi, thanks for sharing. What's the license on this code? Can it be used in commercial projects?
Can you add a license header?
Thank you for sharing this
Hi, I'm posting html, but get html content like attachments. What is the problem?
val html = """<html>Thanks for Joining!
               |You’re going to love Gifty.uz
               |
               |To complete your registration for ***, please <a href="http://mydomain.com/somepath">confirm</a> your email.
               |
               |Need help? Have feedback? Feel free to contact us</html>""".stripMargin
send a new Mail(
  from = [email protected] -> "noreplay",
  to = Seq("[email protected]"),
  subject = "Some subject",
  message = "Some plain content",
  richMessage = html
)
Thanks, Aziz
This is awesome
Thank you for sharing this
this is so fluent. thanks @mariussoutier
Beautifully written. Thanks. 👍
Thanks a lot
Thanks for sharing!
Hi mariussoutier, I am getting below error
Exception in thread "main" org.apache.commons.mail.EmailException: Cannot find valid hostname for mail session
at org.apache.commons.mail.Email.getMailSession(Email.java:639)
at org.apache.commons.mail.Email.buildMimeMessage(Email.java:1278)
at org.apache.commons.mail.Email.send(Email.java:1447)
at Mail.package$send$.a(mail.scala:59)
at Seal_Phy$.main(Seal_Phy.scala:173)
at Seal_Phy.main(Seal_Phy.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:738)
at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:187)
at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:212)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:126)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
You need to set email server hostname by commonsMail.setHostName("your email server host")
Tiny nit: The example should be attachment = Some(new java.io.File(...))
Thanks a lot man
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()
    }
  }
}Hi All,
Thanks, advance. Is there any possible ways to send Spark dataframe via mail, in normal or HTML using this Code?
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("[email protected]","password")
commonsMail.setSSLOnConnect(true)
commonsMail.setSmtpPort(465)
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
So is it safe?
Thank you for sharing this.