perl メール送信にテンプレートを使う Email::MIME::MobileJP::Template

perl メール送信にテンプレートを使う Email::MIME::MobileJP::Template

id:tokuhirom氏作の Email::MIME::MobileJP::Template を発見したので使ってみる。

PODにあるコードは動作しないので注意。renderメソッドのAPIが変わったのかな?ソースを見ると引数の最初に送り先のメールアドレスを指定しないとダメみたい。

それと、Email::MIME::MobileJP にあるソースも間違えているので注意。syntax=>'TTerse' は newする時に引数で指定する事。

use Email::MIME::MobileJP::Template;
use Email::Sender::Simple;

    my $token='123';
    my $to_email = '<foo@hoge.jp>'; # <>で囲わないとdocomoで受信したときToがおかしなことに。

    my $mail_maker = Email::MIME::MobileJP::Template->new(
                    'Text::Xslate' => {
                            syntax => 'TTerse',
                            path => ['email_tmpl/']     # テンプレートの保存場所
                    }
    );

    my $mail = $mail_maker->render(
                    $to_email,                  # 送信先
                    'signup.eml',               # テンプレートファイル
                    {token => $token}    # テンプレートで利用する変数
    );
    # メールを送信
    Email::Sender::Simple->send($mail);

テンプレートファイル

path で指定したディレクトリにテンプレートファイルを作成する。MIMEヘッダはテンプレートでしか指定できない。Fromは記述しないと致命的なエラーとなるので注意。

./email_tmpl/signup.eml

Subject: [Example] サインアップ!
From: <name@hoge.com>

    以下をクリックせよ
    http://example.com/signup/[% token %]

携帯電話宛のメールが正しく送れない?


メールテンプレートで、Fromに指定するメールアドレスは<>で囲わないとdocomoへ送ったときにUnknown user となってしまった。from=<> となっている。これは自分の環境の問題?

エラーになったテンプレートファイル例

Subject: [Example] サインアップ!
From: name@hoge.com

    以下をクリックせよ
    http://example.com/signup/[% token %]

Postfixのエラーログ

Apr  5 17:44:56 vm postfix/smtp[24073]: 7D4ED32358D: to=<xxxxx.@docomo.ne.jp>, relay=mfsmax.docomo.ne.jp[203.138.180.112]:25, delay=0.17, delays=0.09/0.01/0.03/0.04, dsn=5.0.0, status=bounced (host mfsmax.docomo.ne.jp[203.138.180.112] said: 550 Unknown user xxxxx.@docomo.ne.jp (in reply to end of DATA command))
Apr  5 17:44:56 vm postfix/cleanup[23741]: A169832358F: message-id=<20110405084456.A169832358F@mail.hoge.jp>
Apr  5 17:44:56 vm postfix/qmgr[1698]: A169832358F: from=<>, size=2480, nrcpt=1 (queue active)

あと、送信先のメールアドレスは

my $to_email = '<foo@hoge.jp>';

のように指定しないと携帯(docomoムーバ)で受信したときにおかしな挙動となる。メールを開くと返信不可マークのToヘッダが表示されている(メールアドレスは送った携帯のメアド)。返信しようとすると返信先を選択する画面になる。

メール送信の実装はガラケーとカオスな文字コードのおかげでやたらと面倒なことが多い。