使用Scala收发电子邮件

17

我打算使用Scala和Akka构建一个服务,这将大量依赖电子邮件。实际上,我与服务之间的大部分通信都是通过发送邮件和收到回复来完成的。我猜这意味着我需要一个可靠的邮件服务器,并找到一种用Scala进行通信的方式。

问题是,怎样才能做到最佳实践?应该选择哪个邮件服务器,有哪些Scala解决方案可以完成这个任务?

2个回答

17

通常使用JavaMail API。在您的项目中,您可以将其包装在自己的Scala库中或使用现有的库。这是一个在Lift框架中使用现有Mailer API的示例

package code
package config

import javax.mail.{Authenticator, PasswordAuthentication}
import javax.mail.internet.MimeMessage

import net.liftweb._
import common._
import util._

/*
* A Mailer config object that uses Props and auto configures for gmail
* if detected.
*/
object SmtpMailer extends Loggable {
  def init(): Unit = {

    var isAuth = Props.get("mail.smtp.auth", "false").toBoolean

    Mailer.customProperties = Props.get("mail.smtp.host", "localhost") match {
      case "smtp.gmail.com" => // auto configure for gmail
        isAuth = true
        Map(
          "mail.smtp.host" -> "smtp.gmail.com",
          "mail.smtp.port" -> "587",
          "mail.smtp.auth" -> "true",
          "mail.smtp.starttls.enable" -> "true"
        )
      case h => Map(
        "mail.smtp.host" -> h,
        "mail.smtp.port" -> Props.get("mail.smtp.port", "25"),
        "mail.smtp.auth" -> isAuth.toString
      )
    }

    //Mailer.devModeSend.default.set((m : MimeMessage) => logger.info("Sending Mime Message: "+m))

    if (isAuth) {
      (Props.get("mail.smtp.user"), Props.get("mail.smtp.pass")) match {
        case (Full(username), Full(password)) =>
          logger.info("Smtp user: %s".format(username))
          logger.info("Smtp password length: %s".format(password.length))
          Mailer.authenticator = Full(new Authenticator() {
            override def getPasswordAuthentication = new
              PasswordAuthentication(username, password)
          })
          logger.info("SmtpMailer inited")
        case _ => logger.error("Username/password not supplied for Mailer.")
      }
    }
  }
}

许多Web框架都会为您实现方便的方法来处理MIME类型、附件等。

毋庸置疑,发送电子邮件永远不是100%可靠的。它更像是一种“发送即忘”的操作。默认情况下,在邮件协议中没有确认或错误传播,这通常被视为正常。

如果您使用SMTP邮件发送程序,可以将其连接到任何邮件服务器,无论是外部的如Gmail,还是本地安装的Postfix。


很好,先生 @alsksey lzmailov - Ivin Raj

7

您可以尝试使用courier,它是建立在Java Mail之上的Scala层,提供更加流畅的API。遗憾的是,目前在JVM上没有非阻塞的电子邮件发送解决方案(如果我错了,请纠正我)。


我已经在使用JavaMail了,不过还是谢谢。为什么不将发送方法包装在Future中,使其非阻塞呢? - src091
4
这将使它异步,但不会使其非阻塞。请参见https://dev59.com/13E85IYBdhLWcg3wwWWt或http://doc.akka.io/docs/akka/snapshot/general/terminology.html。从这个角度来看,Courier是异步的。 - Tvaroh
我真的很好奇- 为什么人们想要流畅的API?在我看来,它们很令人困惑。认真地问一下,你能告诉我一个好处吗? - 0fnt
1
@user247077,我在这里使用的“fluent”一词与流畅接口模式无关,这只是一个巧合。 - Tvaroh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接