21 April 2013

(Perl) Email::Senderを使ってメール送信

Email::Senderを用いてメール送信する。

※ Email::Senderではなく、Net::SMTPSを使うサンプルは『(Perl) Net::SMTPSを使ってメール送信』を参照。

Email::Sender::Transport::SMTPとEmail::MIMEを使用、添付ファイル無し

#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
use Encode qw(encode);
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP;
 
my $from    = '差出人の名前 <sender@gmail.com>';
my $to      = 'あて先の名前 <recipient@example.com>';
my $subject = 'test テスト';
my $body =
    "年齢からいえば、関羽がいちばん年上であり、次が劉備、"
  . "その次が張飛という順になるのであるが、"
  . "義約のうえの義兄弟だから年順をふむ必要はないとあって、"
  . "「長兄には、どうか、あなたがなって下さい。\n"
  . "それでないと、張飛の我ままにも、おさえが利きませんから」と、関羽がいった。";
 
my $mail = Email::MIME->create(
    'header' => [
        'From'    => encode( 'MIME-Header-ISO_2022_JP', $from ),
        'To'      => encode( 'MIME-Header-ISO_2022_JP', $to ),
        'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
    ],
    'attributes' => {
                      'content_type' => 'text/plain',
                      'charset'      => 'ISO-2022-JP',
                      'encoding'     => '7bit',
    },
    'body' => encode( 'iso-2022-jp', $body ),
);
 
eval {
    my $smtp =
      Email::Sender::Transport::SMTP->new( {
        'host'          => 'smtp.gmail.com',
        'port'          => 587,
        'ssl'           => 'starttls',
        'sasl_username' => 'sender@gmail.com',
        'sasl_password' => 'My_Password',
        'debug'         => 1,
      } );
 
    sendmail( $mail, { 'transport' => $smtp } );
};
if ($@) {
    die "ERROR : $@\n";
}

SSLを用いる場合は、赤で着色した部分を次のように差し替える

        'port'          => 465,
        'ssl'           => 'ssl',

また、上の例では緑で着色した部分を指定することで、デバッグ表示を有効にしている。

Email::MIMEの自動文字エンコードを使用する場合

自動エンコードを使う場合は、下の例のように赤で着色した部分のようにする。
但し、ヘッダは強制的にUTF8エンコードされてしまう。(Email::MIME 1.9以降対応版)

my $mail = Email::MIME->create(
    'header_str' => [
        'From'    => $from ,
        'To'      => $to,
        'Subject' => $subject,
    ],
    'attributes' => {
                      'content_type' => 'text/plain',
                      'charset'      => 'ISO-2022-JP',
                      'encoding'     => '7bit',
    },
    'body_str' => $body,
);

Email::Sender::Transport::SMTP::TLSとEmail::MIMEを使用、添付ファイル無し

Email::Sender::Transport::SMTP::TLSは非推奨だが、『さくらインターネット 共用サーバ』ではEmail::Sender::Transport::SMTPがエラーとなるため、非推奨方法を使わざるを得ない場合の例。

#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
use Encode qw(encode);
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP::TLS;
 
my $from    = '差出人の名前 <sender@gmail.com>';
my $to      = 'あて先の名前 <recipient@example.com>';
my $subject = 'test テスト';
my $body =
    "年齢からいえば、関羽がいちばん年上であり、次が劉備、"
  . "その次が張飛という順になるのであるが、"
  . "義約のうえの義兄弟だから年順をふむ必要はないとあって、"
  . "「長兄には、どうか、あなたがなって下さい。\n"
  . "それでないと、張飛の我ままにも、おさえが利きませんから」と、関羽がいった。";
 
my $mail = Email::MIME->create(
    'header' => [
        'From'    => encode( 'MIME-Header-ISO_2022_JP', $from ),
        'To'      => encode( 'MIME-Header-ISO_2022_JP', $to ),
        'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
    ],
    'attributes' => {
                      'content_type' => 'text/plain',
                      'charset'      => 'ISO-2022-JP',
                      'encoding'     => '7bit',
    },
    'body' => encode( 'iso-2022-jp', $body ),
);
 
eval {
    my $smtp =
      Email::Sender::Transport::SMTP::TLS->new( {
        'host'          => 'smtp.gmail.com',
        'port'          => 587,
        'ssl'           => 'starttls',
        'sasl_username' => 'sender@gmail.com',
        'sasl_password' => 'My_Password',
        # デバッグフラグは未対応のため意味なさず
        'debug'         => 1,
      } );
 
    sendmail( $mail, { 'transport' => $smtp } );
};
if ($@) {
    die "ERROR : $@\n";
}

Email::Sender::Transport::SMTPとEmail::MIMEを使用、添付ファイル有り

#!/usr/bin/perl
 
use warnings;
use strict;
use utf8;
use Encode qw(encode);
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP;
 
my $from    = '差出人の名前 <sender@gmail.com>';
my $to      = 'あて先の名前 <recipient@example.com>';
my $subject = 'test テスト';
my $body =
    "年齢からいえば、関羽がいちばん年上であり、次が劉備、"
  . "その次が張飛という順になるのであるが、"
  . "義約のうえの義兄弟だから年順をふむ必要はないとあって、"
  . "「長兄には、どうか、あなたがなって下さい。\n"
  . "それでないと、張飛の我ままにも、おさえが利きませんから」と、関羽がいった。";
 
my $mail = Email::MIME->create(
    'header' => [
        'From'    => encode( 'MIME-Header-ISO_2022_JP', $from ),
        'To'      => encode( 'MIME-Header-ISO_2022_JP', $to ),
        'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
    ],
    parts => [
               Email::MIME->create(
                                    'attributes' => {
                                                 'content_type' => 'text/plain',
                                                 'charset'  => 'ISO-2022-JP',
                                                 'encoding' => '7bit',
                                    },
                                    'body' => encode( 'iso-2022-jp', $body ),
               ),
               Email::MIME->create(
                        'attributes' => {
                                          'content_type' => 'text/plain',
                                          'name'         => 'attached image name',
                                          'filename'     => 'test01.jpg',
                                          'encoding'     => 'base64',
                                          'disposition'  => 'attachment',
                        },
                        'body' => scalar Path::Class::file('test01.jpg')->slurp,
               ),
    ],
);
 
eval {
    my $smtp =
      Email::Sender::Transport::SMTP->new( {
        'host'          => 'smtp.gmail.com',
        'port'          => 587,
        'ssl'           => 'starttls',
        'sasl_username' => 'sender@gmail.com',
        'sasl_password' => 'My_Password',
        'debug'         => 1,
      } );
 
    sendmail( $mail, { 'transport' => $smtp } );
};
if ($@) {
    die "ERROR : $@\n";
}

緑で着色した部分で添付ファイルを処理している