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

で、ばっちり!(^^