21 April 2013

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

■ 参考にしたWeb
Email::Sender:メールを送信する

■ テキストメールを送信する

※ ヘッダ、本文を手動でISO_2022_JPエンコード

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
 
use Email::MIME;
use Email::Sender::Transport::SMTP;
use Email::Sender::Simple qw(sendmail);
use Encode;
 
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
 
my $email = Email::MIME->create(
    header => [
        From    => encode('MIME-Header-ISO_2022_JP', '"送信者名" <my_name@example.com>'),
        To      => encode('MIME-Header-ISO_2022_JP', '"受信者名" <rcpt_name@example.com>'),
        Subject => encode('MIME-Header-ISO_2022_JP', 'テストメール'),
    ],
    attributes => {
        content_type => 'text/plain',
        charset      => 'ISO-2022-JP',
        encoding     => '7bit',
    },
    body => encode('iso-2022-jp' => "これはテストメールの\n本文です。"),
);
 
sendmail($email, { transport => $transport });

※自動エンコードを使う。但し、ヘッダは強制的にUTF8エンコードされてしまう。(Email::MIME 1.9以降対応版)

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
 
use Email::MIME;
use Email::Sender::Transport::SMTP;
use Email::Sender::Simple qw(sendmail);
use Encode;
 
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
 
# Email::MIME 1.9以降の場合、自動的にエンコード変換される
# (但し、ヘッダは強制的にutf8エンコードされる)
my $email = Email::MIME->create(
    header_str => [
        From    => '"送信者名" <my_name@example.com>',
        To      => '"受信者名" <rcpt_name@example.com>',
        Subject => 'テストメール',
    ],
    attributes => {
        content_type => 'text/plain',
        charset      => 'ISO-2022-JP',
        encoding     => '7bit',
    },
    body_str => encode('iso-2022-jp' => "これはテストメールの\n本文です。"),
);
 
my $transport = Email::Sender::Transport::SMTP->new(
    host => 'smtp.example.com',
    port => 587,
);
 
sendmail($email, { transport => $transport });

■ 添付ファイルを付ける場合

#!/usr/bin/perl
 
use strict;
use warnings;
use utf8;
 
use Email::MIME;
use Email::Sender::Transport::SMTP;
use Email::Sender::Simple qw(sendmail);
use Path::Class;
use Encode;
 
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
 
my $email = Email::MIME->create(
    header => [
        From    => encode('MIME-Header-ISO_2022_JP', '"送信者名" <my_name@example.com>'),
        To      => encode('MIME-Header-ISO_2022_JP', '"受信者名" <rcpt_name@example.com>'),
        Subject => encode('MIME-Header-ISO_2022_JP', 'テストメール'),
    ],
    parts => [
        Email::MIME->create(
            attributes => {
                content_type => 'text/plain',
                charset      => 'ISO-2022-JP',
                encoding     => '7bit',
            },
            body => encode('iso-2022-jp' => "これはテストメールの\n本文です。"),
        ),
        Email::MIME->create(
            attributes => {
                content_type => 'text/plain',
                name         => 'test.txt',
                filename     => 'test.txt',
                encoding     => 'base64',
                disposition  => 'attachment',
            },
            body => scalar file('test.txt')->slurp,
        ),
    ]
);
 
my $transport = Email::Sender::Transport::SMTP->new(
    host => 'smtp.example.com',
    port => 587,
);
 
sendmail($email, { transport => $transport });

なお、添付ファイルはあらかじめbase64でエンコードしておくこと。

$ base64 test.txt.org > test.txt