HOME > blog > Perl > Email::Sender+Email::MIMEで添付ファイル

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 を使います。これまで逆に書いてました。

カテゴリー: Perl タグ: , , , ,
  • 小早川

    本ページを参考にさせていただきました。大変参考になり、有難う御座いました。
    実際にやってみると上記プログラムのline 27 line 30が逆になっているようです。
    実物のファイルを指定するのが、’name’であり、送られた添付書類の
    ファイル名として振る舞うのが’filename’のようです。

  • matsuoka

    ご指摘ありがとうございます。
    記事を書いた際に file と filename が分かりにくいなぁ と思いつつ実際に確認してたはずなのですがそれでも間違ってたみたいです。記事の方も直しておきますね。