ScalaとAkkaを使用してサービスを構築する予定です。これは電子メールに大きく依存します。実際、私のサービスとの通信のほとんどは、それに手紙を送ることによって行われますこれは、信頼できるメールサーバーと、Scalaからそれと通信する方法が必要であることを意味していると思います。
質問は、これを行うためのベストプラクティスは何ですか?どのメールサーバーを選択する必要がありますか。また、このタスクを実行するためのScalaソリューションは何ですか?
通常 JavaMail API が使用されます。プロジェクトでは、独自のScalaライブラリにラップするか、既存のライブラリを使用できます。以下に、リフトフレームワークで既存の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でも、任意のメールサーバーに接続できます。
Scalaレイヤーの上にJavaより滑らかなAPIを提供するメール)である courier を試すことができます。残念ながら、現時点ではJVMでの電子メール送信用の非ブロッキングソリューションはありません(私が間違っている場合は修正してください)。