カスタム検索

2009年5月12日火曜日

Grailsで添付ファイル付きメールを送る

Grailsには公式でMailPluginというのがあり、こいつを使うとDSL形式で簡単にメールが送れます。

ですが、こいつは添付ファイルに対応していません。
ここですでに解決が出ているのですが、公式のバージョンではまだ実装されていないので、自分で拡張してしまいましょう。

grails install-plugin mail
でpluginをインストールし、その中の MailService.groovy ファイルを開きます。

このファイルの中に MailMessageBuilder Class の定義がされているのですが、こいつがDSLを処理している部分になります。
(void to とか void title とかその辺りです。)
ここに attachBytes という添付ファイル名、コンテントタイプ、バイト配列を受け取ってメールに添付する処理を追加してやります。


void attachBytes(String fileName, String contentType, byte[] bytes) {
getMessage().mimeMessageHelper.addAttachment(fileName, new ByteArrayResource(bytes), contentType) }
}


このままだと getMessage した時に、以下の部分が呼ばれます


message = new MimeMailMessage(mailSender.createMimeMessage() )


添付ファイルを送る時は Multipart にしないといけないので、以下のように書き換えてやります

message = new MimeMailMessage(new MimeMessageHelper(mailSender.createMimeMessage(), true ))


あとはメール送信時に attachBytes を呼び出してやればOKです。

def file=new File("test.dat")
// ファイル名に日本語が含まれる場合は文字列をエンコードする必要があります
// 日本のメール環境では iso-2022-jp がまだまだ主流なので、iso-2022-jp を使いましょう
//def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "utf-8", "B")
def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "iso-2022-jp", "B")

// コンテントタイプはファイルや用途に合わせて変更して下さい
def contentType="application/octet-stream"

mailService.sendMail {
to "test@test.jp"
from "test@test.jp"
subject "添付テスト"
body "添付ファイルを送ります"
attachBytes title, contentType , file.readBytes()
}


と、思ったらMail from Grailsなんてページがあったり、この方法でもファイル添付出来るみたいですね。
↑プロポーザル的に書かれているだけで、実装されているわけではないらしいです

2009/5/13 追記
メールタイトルの文字コードと、Mail from Grailsのページについて、mottsniteの中の人から指摘があったので修正

0 件のコメント: