2006年12月18日月曜日

[Perl] HTMLメールを生成/送信する

最初は使い慣れている MIME::Entity 使おうと思ったのだがちょっと面倒くさい。で、次に MIME::Lite 使おうと思ったのだが、HTML部分をテンプレート化したい。ということで、最終的に MIME::Lite::TT::HTML::Japanese を使ってみました。
Content-Type: は text/html と text/plain の混合であるmultipart/alternative となります。

まずは MIME::Lite::TT::HTML::Japanese と依存モジュールのインストール
$ perl -MCPAN -e shell
cpan> install Template::Toolkit
cpan> install DateTime::Format::Mail
cpan> install MIME::Lite::TT::HTML::Japanese
お次はメールのテンプレートを準備
$ vi test.html
This is template.
my name is [% name %].
$ vi test.txt
This is template.
my name is [% name %].
最後にソースコード
use strict;
use MIME::Lite::TT::HTML::Japanese;
my %params = (name => 'isoya9');
my %options = (EVAL_PERL=>1);
my $msg = MIME::Lite::TT::HTML::Japanese->new(
  From => 'isoya@cpan.org',
  To => 'isoya9@gmail.com',
  Subject => 'HTML Mail test',
  Template => {
    html => 'test.html',
    text => 'test.txt', 
  },
  Icode => 'euc',
  TmplIcode => 'sjis',
  TmplParams => \%params,
  TmplOptions => \%options,
);
$msg->send();
実行すると、テンプレートの [% name %] に "isoya9" がセットされたメールが届きます。
MIME::Lite::TT::HTML::Japanese の中を覗いてみるとJcode使ってる。
sub encode_subject {
  my ( $subject, $icode ) = @_;
  $subject = remove_utf8_flag($subject);
  Jcode->new( $subject, $icode )->mime_encode;
}
sub encode_body {
  my ( $body, $icode ) = @_;
  my $str = remove_utf8_flag($body);
  Jcode->new( $str, $icode )->jis;
}
国際化に対応する場合は、MIME::Lite::TT::HTML を利用した方がいいね。

0 件のコメント: