カスタム検索

2009年5月12日火曜日

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

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

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

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

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

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


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

  1. message = new MimeMailMessage(mailSender.createMimeMessage() )  


添付ファイルを送る時は Multipart にしないといけないので、以下のように書き換えてやります
  1. message = new MimeMailMessage(new MimeMessageHelper(mailSender.createMimeMessage(), true ))  


あとはメール送信時に attachBytes を呼び出してやればOKです。
  1. def file=new File("test.dat")  
  2. // ファイル名に日本語が含まれる場合は文字列をエンコードする必要があります  
  3. // 日本のメール環境では iso-2022-jp がまだまだ主流なので、iso-2022-jp を使いましょう  
  4. //def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat", "utf-8", "B")  
  5. def title=javax.mail.internet.MimeUtility.encodeWord("日本語ファイル名.dat""iso-2022-jp""B")  
  6.   
  7. // コンテントタイプはファイルや用途に合わせて変更して下さい  
  8. def contentType="application/octet-stream"      
  9.   
  10. mailService.sendMail {  
  11.   to "test@test.jp"  
  12.   from "test@test.jp"  
  13.   subject "添付テスト"  
  14.   body "添付ファイルを送ります"  
  15.   attachBytes title, contentType , file.readBytes()  
  16. }  


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

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

0 件のコメント: