使用 Scala 接收和发送电子邮件

Posted

技术标签:

【中文标题】使用 Scala 接收和发送电子邮件【英文标题】:Receive and send email with Scala 【发布时间】:2014-04-12 12:10:38 【问题描述】:

我计划使用 Scala 和 Akka 构建一个将严重依赖电子邮件的服务。事实上,与我的服务的大部分沟通都是通过向它发送信件并获得回复来完成的。我想这意味着我需要一个可靠的电子邮件服务器以及通过 Scala 与之通信的方法。

问题是,这样做的最佳做法是什么?我应该选择哪个电子邮件服务器以及有哪些 Scala 解决方案来完成这项任务?

【问题讨论】:

【参考方案1】:

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

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【参考方案2】:

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

【讨论】:

我已经在使用 JavaMail 但还是谢谢。为什么不在 Future 中封装发送方法使其不阻塞? 这不会使它成为非阻塞的,只有异步的。见***.com/questions/2625493/… 或doc.akka.io/docs/akka/snapshot/general/terminology.html 从这个角度来看,courier 是异步的。 我真的很好奇——人们为什么需要 Fluent API?他们令人困惑,恕我直言。严肃的问题,你能告诉我一个好处吗? @user247077,我这里用的“fluent”这个词和fluent界面模式无关,纯属巧合。

以上是关于使用 Scala 接收和发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

python 使用Python发送和接收电子邮件

使用户能够通过 AWS SES 发送和接收电子邮件

你会推荐哪个 Perl 模块来发送和接收电子邮件?

Outlook邮件接收和发送服务器设置

邮件发送和接收限制

Outlook邮件接收和发送服务器设置