Email::Sender+Email::MIMEで添付ファイル

Email::Sender + Email::MIMEでのメール送信で、ファイルを添付したい場合、CPANにあるEmail::MIMEのサンプルにある通りIO::Allを利用すると、あっという間に対応可能です。

これまで同様、Perlによるメール送信(Email::Sender)のサンプルを元に添付ファイル付きメール送信のコードを書いてみます。

use strict;
use warnings;
use utf8;
use Encode qw(encode);
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
use IO::All;

my $from    = q("送信者の名前" <from_mail@example.jp>);
my $to      = q("受信者の名前" <to_mail@example.jp>);
my $subject = 'メールの送信テスト';
my $body    = '今度はファイルを添付してみます!!';
my $file    = './test.pdf';

my @parts   = (
                  Email::MIME->create(
                      'attributes' => {
                          'content_type' => 'text/plain',
                          'charset'      => 'ISO-2022-JP',
                          'encoding'     => '7bit',
                      },
                      'body' => Encode::encode( 'iso-2022-jp', $body ),
                  ),
                  Email::MIME->create(
                      'attributes' => {
                          'fimename'     => 'sample.pdf',
                          'content_type' => 'application/pdf',
                          'encoding'     => 'base64',
                          'name'         => $file,
                      },
                      'body' => io($file)->all,
                  ),
              );

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'  => [ @parts ],
           );

sendmail($mail);

1;

サンプルコードのうち、強調した部分が変更部分です。

で、Email::MIMEのサンプルの通り、encodingを “quoted-printable” しつつマルチバイトを含むファイルを添付しちゃうと受信側で添付ファイルを開けられなくなるので、その場合はbase64を指定します。

あと添付ファイル分のEmail::MIME->create時にname filename を指定すると、名前を変更してファイルを添付することが可能です。

それにしてもio('ファイル名')->allで全部片付いてしまうのは便利。

サンプルコードを含めて修正しましたが、添付書類名が filename で実際のファイルの指定に name を使います。これまで逆に書いてました。