Получайте и отправляйте электронную почту с помощью Scala

Я планирую создать службу с помощью Scala и Akka, которая будет сильно зависеть от электронной почты. Фактически, большая часть общения с моей службой будет выполняться путем отправки ей писем и получения ответов. Я предполагаю, что это означает, что мне нужен надежный сервер электронной почты и способы связи с ним из Scala.

Вопрос: каковы наилучшие методы для этого? Какой сервер электронной почты я должен выбрать и какие решения Scala существуют для выполнения этой задачи?

Ответы

Ответ 1

Обычно используется API JavaMail. В своем проекте вы можете обернуть его в свою собственную библиотеку Scala или использовать существующую. Ниже приведен пример использования существующего API Mailer в платформе Lift:

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.")
      }
    }
  }
}

Многие веб-фреймворки будут внедрять методы conviece для вас, чтобы иметь дело с типами mime, вложениями и т.д.

Разумеется, отправка электронной почты никогда не будет на 100% надежной. Это больше похоже на огонь и забыть операцию. По умолчанию в почтовых протоколах нет подтверждения или распространения ошибок, что обычно принято как обычно.

Если вы используете отправителя SMTP-почты, вы можете подключить его к любому почтовому серверу независимо от того, является ли он внешним, например gmail или локально установленным постфикс.

Ответ 2

Вы можете попробовать courier, который является слоем Scala поверх Java Mail, который дает более свободный API. К сожалению, на данный момент нет неблокирующего решения для отправки электронной почты на JVM (исправьте меня, если я ошибаюсь).