-
-
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.