JavaMailのラッパを書いてみた。
ひとまず
object Mail { import java.util._ import java.io._ import javax.mail._ import javax.mail.internet._ import javax.activation._ def body(text:String) = new MimeBodyPart { setText(text , "iso-2022-jp") } def attachFile(filename:String) = new MimeBodyPart { val fds = new FileDataSource(filename) setDataHandler(new DataHandler(fds)) setFileName(MimeUtility.encodeWord(fds.getName())) } class Session(val host:String) { System.getProperties.put("mail.smtp.host",host) val message = new MimeMessage(Session.getDefaultInstance(System.getProperties, null)) def from(addr:String, name:String) = message.setFrom(new InternetAddress(addr,name,"iso-2022-jp")) def to(addr:String) = message.setRecipients(Message.RecipientType.TO, addr) def to(addrs:Array[String]) = { val newaddrs:Array[Address] = addrs.map {adr => new InternetAddress(adr) } message.setRecipients(Message.RecipientType.TO, newaddrs) } def subject(text:String) = message.setSubject(text , "iso-2022-jp") def content(parts:Array[MimeBodyPart]) = { val content = new MimeMultipart parts.foreach {part => content.addBodyPart(part)} message.setContent(content) } def sentDate(date:Date) = message.setSentDate(date) def send = Transport.send(message) } }
な、感じになった。
使い方はこう
new Mail.Session("mail.tbs.co.jp") { from("hoge@piyo.com","HOGE Piyo") to(Array("piyo@hoge.com","foo@bar.net")) subject("Test Mail") content(Array(Mail.body("Mail body....."), Mail.attachFile("report.csv"))) sentDate(new java.util.Date) send }
備忘録
- クラスの初期化コードがクラス定義直下に書ける
- コンストラクタはブロックを受け取れて、その中でも初期化コード(の続き)がかける
心残り
def to(addrs:Array[String]) = { val newaddrs:Array[Address] = addrs.map {adr => new InternetAddress(adr) } message.setRecipients(Message.RecipientType.TO, newaddrs) }
を
def to(addrs:Array[String]) = message.setRecipients(Message.RecipientType.TO, addrs.map {adr => new InternetAddress(adr) })
とすると、コンパイラにおこられる。
(fragment of sendmail.scala):31: error: overloaded method value setRecipients with alternatives (javax.mail.Message.RecipientType,java.lang.String)Unit <and> (javax.mail.Message.RecipientType,Array[javax.mail.Address])Unit cannot be applied to (javax.mail.Message.RecipientType,Array[javax.mail.internet.InternetAddress]) message.setRecipients(Message.RecipientType.TO, addrs.map {adr => new InternetAddress(adr) }) ^ one error found !!!
でも、今日のところは、眠いのでここまで。
追記
上記は、コメントでkmizushimaさんに教えていただいた方法
def to(addrs:Array[String]) = message.setRecipients(Message.RecipientType.TO, addrs.map[Address] {adr => new InternetAddress(adr) })
で、ばっちり!(^^