ScalaでEmail送りたいと思ってググったらCommons Email - Homeってのを
使うのがいいみたい。内部的にはJavaMailAPIってのを使ってるみたいですね。
Apache Commons Emailでメールを送信する
exception周りとか書いてないけどこんな感じで送信できます。
import org.apache.commons.mail.SimpleEmail case class SendMailInfo(to: String, from: String, subject: String, msg: String) class MyMailSender(sendHostName: String, charSet: String = "UTF-8") { def sendMail(mailInfo: SendMailInfo) { new SimpleEmail { setCharset(charSet) setHostName(sendHostName) setFrom(mailInfo.from) addTo(mailInfo.to) setSubject(mailInfo.subject) setMsg(mailInfo.msg) }.send } }
テストの書き方
ユニットテストするときにはhttp://java.net/projects/mock-javamailを使うとモックを使ったテストが書けるみたい。*1
Commons EmailはJavaMail APIを使ってるのでこのライブラリ使えばmockを使ったテストが可能です。
今回は送信をチェックしたいのでこれでテストします。
import org.scalatest.FunSuite import org.scalatest.BeforeAndAfter import org.jvnet.mock_javamail.Mailbox class MyMailSenderTest extends FunSuite with BeforeAndAfter { val HOST_NAME = "mail.example.com" var mailSender: MyMailSender = null before { mailSender = new MyMailSender(HOST_NAME) //clear Mock JavaMail box Mailbox.clearAll() } test("testSendInMockWay") { val subject = "Test2" val body = "Test Message2" mailSender.sendMail(SendMailInfo("to@example.com", "from@example.com", subject, body)) // check JavaMail box val inbox = Mailbox.get("to@example.com") assert(inbox.isEmpty === false) assert(inbox.size() === 1) assert(subject === inbox.get(0).getSubject) assert(body === inbox.get(0).getContent) } }
参考
対象バージョン
- Apache Commons Mail 1.2
- mock-javamail 1.9
sbt
libraryDependencies ++= Seq( "org.apache.commons" % "commons-email" % "1.2", // test "org.scalatest" %% "scalatest" % "1.8" % "test", "org.jvnet.mock-javamail" % "mock-javamail" % "1.9" % "test", )
*1:このライブラリJenkins作者のkohsukeさんが書いてるんですなぁ