Mandrillを試す

メール配信サービスMandrillでPerlからメール配信を試したのでメモ

Mandrill?

サイトは英語ですが、UIやページ構成が分かりやすくて苦労しない。
APIリファレンスも充実していると思う
サクサクっと登録完了

MandrillのAPIを叩く

PerlのプログラムからMandrillのAPIを叩くのにWebService::Mandrillを使用した。
use WebService::Mandrill;

my $api_key = '**********';  #MandrillのSettingページで表示されるもの
my $ml_from = "hoge-from¥@hoge.com";
my $ml_to   = "hoge-to¥@hoge.com";
my $subject = "Mail Sample";
my $message = "Hellow World¥nThanks";

my $mandrill = WebService::Mandrill->new(
    debug   => 0,
    api_key => $api_key
);

$mandrill->send(
    from_email   => ${ml_from},
    to           => ${ml_to},
    subject      => ${subject},
    text         => ${message},
    track_opens  => 0,
    track_clicks => 0,
);
debugを"1″にすると標準出力に送信データが出力されるが、実際にメールも送信されるのでテスト時には注意が必要。Mandrill側でテスト用API KEY(メール配信をしない)を作れるのでそれを利用する。

SMTP送信する

smtp送信といってもMandrillは587ポートを使っており暗号化された"smtps"プロトコルとなる。
モジュールはEmail::Sender::Transport::SMTPSを使う。
(ちなみにEmail::Sender::Transport::SMTP::TLSなんかも試したが、cpanのページの説明にもあるように非推奨だそう。こちらのページがその辺りを詳しく書かれていた。)

CPANのページのサンプル通りだが一応記載

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTPS;
use Try::Tiny;

my $smtphost = 'smtp.mandrillapp.com';
my $user     = 'account@hoge.com';     #Mandrillに登録したID
my $pass     = '*********';            #Mandrillのsettingページで表示されるAPIキー
my $ml_from  = "hoge-from¥@hoge.com";
my $ml_to    = "hoge-to¥@hoge.com";
my $subject  = "Mail Sample";
my $message  =  "Hellow World¥nThanks";

my $smtps = Email::Sender::Transport::SMTPS->new({
    host          => ${smtphost},
    ssl           => 'starttls',
    sasl_username => ${user},
    sasl_password => ${pass},
});
my $msg = Email::Simple->create(
    header => [
        From    => ${ml_from},
        To      => ${ml_to},
        Subject => ${subject},

    ],
    body => ${message}
);

try{
    sendmail($msg, {transport => $smtps});
}catch{
}
メール送信とは直接関係無いけど、サンプルではTry::Tinyモジュールのtry/cacheを使っているが、Perlの例外処理ってなんか違和感

日本語メールについて

いろいろ試したが、日本語メールを扱うことができなかった。これはメールのヘッダーの"Content-type"が"text/plain;charset=utf8″で固定なことと無関係じゃない気がする。もちろん"Content-type"を設定するようにいろいろ試したけど変更のさせかたが分からなかった。おそらくMandrill側でそもそも日本語メールを想定していないのではないかと思う。

ただメールサーバーの設定や運用で悩まずに済むので、英語メールでも問題無い案件ならアリだと思う