tokuhirom's Blog

Perl5 によるメール送信 - 実践的な Email::Sender の利用方法

Perl5 では、E-mail の送信をするためのモジュールが多数 CPAN にアップロードされているが、現在もっともまじめにメンテされていて質がよいのは Email::Sender らしい。
Email::Sender は登場当初はドキュメントもなさすぎるしつかいものにならなかったが、現在ではだいぶマシになっている。Moose 依存が気にならないケースでは、実用としてつかっても問題ないとおもう。

iso-2022-jp の日本語のメールを送るには、以下のようにすればよい。

use 5.12.1;
use utf8;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
use Data::Recursive::Encode;
use Encode;

# e-mail object の作成
my $email = Email::Simple->create(
    header => Data::Recursive::Encode->encode(
        'MIME-Header-ISO_2022_JP' => [
            To      => '"TKSK" <[email protected]>',
            From    => '"まっつん" <[email protected]>',
            Subject => "夕飯",
        ]
    ),
    body       => encode( 'iso-2022-jp', "うちでたべるの?" ),
    attributes => {
        content_type => 'text/plain',
        charset      => 'ISO-2022-JP',
        encoding     => '7bit',
    },
);

# 送信
sendmail($email);

ちなみに、送信の手段は、環境変数で指定することができます(default は sendmail による送信)。

開発時には、メールを送信しないで以下のように STDOUT に吐かせるのがよいでしょう。

% EMAIL_SENDER_TRANSPORT=Print perl mail.pl
ENVELOPE TO  : [email protected]
ENVELOPE FROM: [email protected]
---------- begin message
To: =?ISO-2022-JP?B?IhskQiNUI0sjUyNLGyhCIg==?= <[email protected]>
From: =?ISO-2022-JP?B?IhskQiReJEMkRCRzGyhCIg==?= <[email protected]>
Subject: =?ISO-2022-JP?B?GyRCTTxIUxsoQg==?=
Date: Mon, 19 Jul 2010 21:36:09 +0900

$&$A$G$?$Y$k$N!)
---------- end message

テスト時には、以下のようにするとメールのオブジェクトをとりだせます。

  use Test::More;
  BEGIN { $ENV{EMAIL_SENDER_TRANSPORT} = 'Test' }
  use YourCode;

  YourCode->run;

  my @deliveries = Email::Sender::Simple->default_transport->deliveries;

Gmail に送信したい場合は林さんの Email::Sender::Transport::SMTP::TLS をつかうとよいでしょう。
http://search.cpan.org/dist/Email-Sender-Transport-SMTP-TLS/

use 5.12.1;
use utf8;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
use Data::Recursive::Encode;
use Encode;
use Email::Sender::Transport::SMTP::TLS;

my $sender = Email::Sender::Transport::SMTP::TLS->new(
    host     => 'smtp.gmail.com',
    port     => 587,
    username => '[email protected]',
    password => 'pa33w0rd',
    helo     => 'example.com',
);


# e-mail object の作成
my $email = Email::Simple->create(
    header => Data::Recursive::Encode->encode(
        'MIME-Header-ISO_2022_JP' => [
            To      => '"TKSK" <[email protected]>',
            From    => '"まっつん" <[email protected]>',
            Subject => "夕飯",
        ]
    ),
    body       => encode( 'iso-2022-jp', "うちでたべるの?" ),
    attributes => {
        content_type => 'text/plain',
        charset      => 'ISO-2022-JP',
        encoding     => '7bit',
    },
);

# 送信
my $ret = sendmail($email, {transport => $sender});