ファイヤープロジェクト
SpringでのMIMEのサポート(Spring1.2.1)
2005-08-10T19:10+09:00   matsu
SpringはMIMEもサポートしているらしいので,試してみた.
Springでの,MIMEサポートは以下のような状況である.
  • MailSenderの実装クラスはJavaMailSender.
  • MIME形式のメールを構築するためのヘルパークラスがある.
このように,さほど大がかりなものではないが,文字コードの扱いに関して,APIとしてややこしい部分があるので,その点に注意. 本頁のサンプルでは,MIMEで非マルチパートメールとマルチパートメールを送信するものを作成した.
メール送信処理を記述する,MimeMailBLImplを以下に示す.
BeanFactoryにより,mailSenderにはJavaMailSenderImplが設定されている. 二つのメソッドprocessUniPart,processMultiPartが本頁の本題である. 前者が非マルチパートメール,後者がマルチパートメールを送信する. Springでは,MIMEメッセージを作成するには,MimeMessagePreparatorを使用してJavaMailSenderImpl#send(MimeMessagePreparator)から呼び出すコールバックメソッドを実装する.
MimeMessagePreparator preparator = new MimeMessagePreparator() {
MimeMessagePreparatorはインタフェースで,サンプルのようにコールバックprepare(MimeMessage)メソッドを実装する. このメソッド内で,具体的にどういったメールを生成するかといった処理を記述する. SpringではMIMEメール生成のためのヘルパークラスとして,MimeMessageHelperがある. いくつかのコンストラクタがあり,以下がもっとも設定の多いものである.
MimeMessageHelper(MimeMessage mimeMessage, boolean multipart, String encoding)
引数について以下に記述する.
mimeMessage.
MimeMessageHeloperは内部でこれを編集するのだが,prepareメソッドの引数を渡すことで,JavaMailSenderImplに編集結果を渡す. したがって,決めでprepareメソッドの引数を渡す.
multipart
作成するメールがマルチパートか否かのフラグを設定する. したがってサンプルでは,メソッドprocessUniPartではfalse,processMultiPartではtrueを設定している.
encoding
文字コードを記述する. サンプルでは日本語を記述するので,ISO-2022-JP(定数MAIL_CHAR_SET)を設定している.
あとは,いつものようにsetToやらsetSubjectやらすればよい. MimeMessageHelperはコンストラクタでencodeが指定されていると,setSubjectやsetTextの際にそのエンコードを適用するので,毎回文字コードを指定する必要がない点に注意. したがって,
message.setSubject(origMessage.getSubject() + " / UniPart版サブジェクト");
message.setText("UniPart版メール本文.");
は,サンプルでコメントアウトされている
mimeMessage.setSubject(origMessage.getSubject() + " UniPart版サブジェクト", MAIL_CHAR_SET);
mimeMessage.setText("UniPart版メール本文.", MAIL_CHAR_SET);
と等価となる. processMultiPartにあるように,MimeMessageHelperでは,
addInline
addAttachment
などが提供されており,マルチパートメールの作成を補助してくれる. なお,setTextは,addInlineやaddAttachmentより先に呼び出さなければならない.
MimeMessageHelperを使用すると,いちいちsetTextなどをする際に文字コードを指定する必要がない. コンストラクタのものが設定される. MimeMessageHelper#setTextには,その設定が楽になった分,HTMLメールか否かの引数がある.
setText(String text)
通常のテキストを設定する.
setText(String text, boolean html)
第二引数で,HTMLメールか否かを指定する. 第二引数に応じて,Content-Typeがtext/htmlに変化する.
setText(String plainText, String htmlText)
プレーンテキストと,HTMLテキストの両方を設定する. これは両方メールに記述し,メールクライアントにて表示を選択するようなメールである.
本頁のサンプルドライバを以下に示す.
サンプルを実行する前に,
conf/mail.conf
に,メールの設定を記述する. サンプルを実行すると実際にメールを送信するので,送信先などに注意する. 実行には,引数でマルチパートメールか否かを指定する.
$> java -jar springsample.jar false
あとは,宛先でメールを受信して内容を確認する.
matsu(C)
Since 2002
Mail to matsu