2011/08/20

Net::SMTP vs. Email::Send(er)?

Perl Email Project
Perlでメールを送信(SMTP)する時は、今まで殆どのケースでNet::SMTPを、たまーにEmail::Sendを使っていました。しかし、gihyo.jpの「モダンPerlの世界へようこそ 第20回 Email::Sender:メールを送信する」を読んで、Email::Sendはもう使うな、かわりにEmail::Senderを使えって話が書いていました。内部で呼んでいるReturn::Valueモジュールに問題があったりするそう(←ソースまでは読んでない)です。

Email::Senderを始めEmail::*な名前空間にあるモジュールは、古典的なMail::*やMIME::*の複雑さに業を煮やしたユーザ数名が始めたPerl Email Project(PEP)が管理しているモダンなメール関係モジュールです。モジュールの一覧はTask::Email::PEP::Allで確認できます。

時期的に旬なのでついでに書きますと、Email::Senderを作ったRicardo Signesさんが今年のYAPC::Asia TOKYO 2011来られるそうです。

依存モジュール

Net::SMTP, Email::Send, Email::Senderの依存もジュールを調べました。たくさんのモジュールに依存しているよりは、依存しているモジュールが少ない方がいいと思います。

Net::SMTPはPerl 5.7.3からコアモジュールに入っていて、依存モジュールは2個(どちらもコアモジュール)です。続いてEmail::Sendの依存モジュールは11個でうち7個がコアモジュールでした。PEPお薦めのEmail::Senderも当然調べました。依存モジュールは40個でうち13個がコアモジュールでした。Throwable::Errorが依存しているMoose::Roleが数を稼いでいる感じです。

ベンチマーク用SMTPd on 127.0.0.1

依存モジュールの数だけで取捨選択すればNet::SMTPがいいし、もうちょい楽をするならEmail::Sendがいいなぁと思うわけですが、速度はどうかと思ってベンチマークをとりました。小さなメールを作ってSMTPで送信するだけのコードです。ネットワークの影響を排除するのと、テストした場所がOP25B影響下にあるので手元のMacにSMTPサーバ立ててそこに送る事にしました。


ベンチマークのコード

SMTPサーバはNet::Server::Mailモジュールが127.0.0.1:2500でListenしているやつです。これを起動させた状態で書きのベンチマークのコードを走らせました。githubにも置いています。

依存モジュールの多さからNet::SMTP < Email::Send < Email::Senderの順位になるかと思ってましたが意外、Email::Senderは二位でした。

まとめ

結論は、インストール時に大量のモジュールを入れる必要があるけど、そこそこ楽してそこそこの機能なSMTPモジュールなら Email::Sender がよい、という事です。PEP も Email::Sender を薦めてますし、Email::Send は明示的にEnvelope From, Toが指定できないそうなので、敢えて Email::Send を選ぶ理由はなさそうです。

0 件のコメント:

コメントを投稿