2018年7月13日金曜日

Perl でメール送信(Email::Sender編) 添付ファイルあり

Email::Sender を使ったサンプルコードを記載。今度は添付ファイルありバージョン。


#!/usr/bin/perl
#
# メール送信サンプル
#
use Encode;
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP;
use IO::All;
use strict;
use warnings;
use utf8;

# サブルーチンを呼んでメールを送る
&mailSend();

sub mailSend {
   my $from    = 'foo@localhost';
   my $mailto  = 'user01@bar.com, user02@bar.com';
   my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'メール送信テスト');
   my $message = <<"BODY";
テストで送信するメールです

ここに本文を記載します。本文はヒアドキュメントを
利用して作成しています。

※本メールへの返信はしないでください。
BODY

  my $body = Encode::encode('iso-2022-jp', $message);
   my $file = '/home/A0gaku/attachment.zip';

  my @parts = (
     Email::MIME->create(
       'attributes' => {
       'content_type' => 'text/plain',
       'charset'      => 'ISO-2022-JP',
       'encoding'     => '7bit',
       },
       'body' => $body,
     ),

    Email::MIME->create(
       'attributes' => {
       'fimename'     => 'attached.zip',
       'content_type' => 'application/octet-stream',
       'encoding'     => 'base64',
       'name'         => 'attachment.zip',
       },
       'body' => io($file)->all,
     ),
   );

  my $mail = Email::MIME->create(
     header   => [
       From    => "$from",
       To      => "$mailto",
       Subject => "$subject",
      ],

    parts => [@parts],
   );


   my $transport = Email::Sender::Transport::SMTP->new({
     host => 'smtp.foo.com',
     port => 25,
   });

  sendmail($mail, { transport => $transport });
}

Perl でメール送信(Email::Sender編) 添付ファイル無し

Email::Sender を使ったサンプルコードを記載。モジュールは標準ではインストールされていないので、CPANから追加して使うこと。添付ありで IO::All を使うので、事前に入れておく。

# cpan
> install Email::MIME
> install Email::Sender
> install IO::All

#!/usr/bin/perl
#
# メール送信サンプル
#
use Encode;
use Email::MIME;
use Email::MIME::Creator;
use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP;
use strict;
use warnings;
use utf8;

# サブルーチンを呼んでメールを送る
&mailSend();

sub mailSend {
   my $from    = 'root@localhost';
   my $mailto  = 'user01@bar.com, user02@bar.com';
   my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'メール送信テスト');
   my $message = <<"BODY";
テストで送信するメールです

ここに本文を記載します。本文はヒアドキュメントを
利用して作成しています。

※本メールへの返信はしないでください。
BODY

  my $body = Encode::encode('iso-2022-jp', $message);

  my $mail = Email::MIME->create(
     header   => [
       From    => "$from",
       To      => "$mailto",
       Subject => "$subject",
      ],

    attributes => {
       content_type => 'text/plain',
       charset      => 'ISO-2022-JP',
       encoding     => '7bit',
     },

    body => $body,
   );

  my $transport = Email::Sender::Transport::SMTP->new({
     host => 'smtp.foo.com',
     port => 25,
   });

  sendmail($mail, { transport => $transport });
}

2018年7月5日木曜日

Perl でメール送信(MIME::Lite編) 添付ファイルあり

MIME::Lite 使ったサンプルコードを記載。今度は添付ファイルありバージョン。


#!/usr/bin/perl
#
# メール送信サンプル
#
use Encode;
use MIME::Lite;
use strict;
use warnings;
use utf8;

# サブルーチンを呼んでメールを送る
&mailSend();

sub mailSend {
   my $from    = 'root@localhost';
   my $mailto  = 'user01@bar.com, user02@bar.com';
   my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'メール送信テスト');
   my $message = <<"BODY";
テストで送信するメールです

ここに本文を記載します。本文はヒアドキュメントを
利用して作成しています。

※本メールへの返信はしないでください。
BODY

  my $body = Encode::encode('iso-2022-jp', $message);

  # コンテナを作成
   my $msg = MIME::Lite->new(
       From => "$from",
       To => "$mailto",
       Subject => "$subject",
       Type => 'multipart/mixed',
   );

  # メッセージを作成
   $msg->attach(
     Type => 'text/plain; charset="ISO-2022-JP"',
     Encoding => '7bit',
     Data => "$body"
   );

  # 添付ファイル
   $msg->attach(
       Type => 'application/octet-stream',
       Disposition => 'attachment',
       Path => '/home/foo/attachment.zip',
       Filename => 'attachment.zip',
   );

# 送信
   my $smtp = 'smtp.foo.com';
   $msg->send('smtp',$smtp);
}

Perl でメール送信(MIME::Lite編) 添付ファイル無し

MIME::Lite を使ったサンプルコードを記載。モジュールは標準ではインストールされていないので、CPANから追加して使うこと。

perldoc を読むと

WAIT!
     MIME::Lite is not recommended by its current maintainer. There are a
     number of alternatives, like Email::MIME or MIME::Entity and
     Email::Sender, which you should probably use instead. MIME::Lite continues
     to accrue weird bug reports, and it is not receiving a large amount of
     refactoring due to the availability of better alternatives. Please
     consider using something else
.

非推奨のようです。色々調べてみたのですが、技術評論社の第20回 Email::Sender:メールを送信するが詳しいです。


#!/usr/bin/perl
#
# メール送信サンプル
#
use Encode;
use MIME::Lite;
use strict;
use warnings;
use utf8;

# サブルーチンを呼んでメールを送る
&mailSend();

sub mailSend {
   my $from    = 'root@localhost';
   my $mailto  = 'user01@bar.com, user02@bar.com';
   my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'メール送信テスト');
   my $message = <<"BODY";
テストで送信するメールです

ここに本文を記載します。本文はヒアドキュメントを
利用して作成しています。

※本メールへの返信はしないでください。
BODY

  my $body = Encode::encode('iso-2022-jp', $message);

  my $msg = MIME::Lite->new(
     From => "$from",
     To => "$mailto",
     Subject => "$subject",
     Type => 'text/plain; charset="ISO-2022-JP"',
     Encoding => '7bit',
     Data => "$body"
   );

  # SMTPサーバを指定します。FQDNではなくIPアドレスでもok
   my $smtp = 'smtp.foo.com';

  $msg->send('smtp', $smtp);
}

2018年7月4日水曜日

Perl でメール送信(Net::SMTP編)

Net::SMTP を使ったサンプルコードを記載。モジュールは標準でインストールされているはずなので、CPANから追加なしで使えるはず。


#!/usr/bin/perl
#
# メール送信サンプル
#
use Encode;
use Net::SMTP;
use strict;
use warnings;
use utf8;

# サブルーチンを呼んでメールを送る
&mailSend();


sub mailSend {
   # メールを作成します。
   #
http://chaichan.lolipop.jp/perlnote/perlnote2007-09-02.htm を参考にする
   # 複数アドレスの送信ができるよう、ヘッダー部とNet::SMTPに送るデータが若干
   # 違うのがミソ

   my $from    = 'root@foo.com';
   my $mailto  = 'user01@bar.com, user02@bar.com';
   my @mailto  = split(',', $mailto);
   my $subject = Encode::encode('MIME-Header-ISO_2022_JP', 'メール送信テスト');
   my $header  = "From: $from\n" .
                 "To: $mailto\n" .
                 "Subject: $subject\n" .
                 "Mime-Version: 1.0\n" .
                 "Content-Type: text/plain; charset = ISO-2022-JP\n" .
                 "Content-Trensfer-Encoding: 7bit\n";
   my $message = <<"BODY";
テストで送信するメールです

ここに本文を記載します。本文はヒアドキュメントを
利用して作成しています。

※本メールへの返信はしないでください。
BODY

  my $body = Encode::encode('iso-2022-jp', $message);

  # SMTPサーバに接続します。FQDNではなくIPアドレスでもok
   my $smtp = Net::SMTP->new('smtp.foo.com');
   if ( !$smtp ) {
        print "メールサーバーにアクセスできません\n";
   }

  # メールを送信します。
   $smtp->mail($from);
   $smtp->to(@mailto);
   $smtp->data();
   $smtp->datasend($header);
   $smtp->datasend($body);
   $smtp->dataend();
   $smtp->quit;
}

2018年7月3日火曜日

CPANを使ってみる

Perl からメールを出す必要があり、四苦八苦したときの備忘録です。

Net::SMTP を使ってメールを出すんですが、見つけたサンプルでは MIME::Entity を使ってエンコードをしていました。

標準でMIME::Entity がインストールされていないので、Encode::encode を使って取りあえず変換→送信はできているのですが、いい機会なので CPAN のインストールを設定をしてみました。

モジュールがインストールされているか否かは次の方法で分かります。

  1. perl -Mモジュール名 -e ''
    ※何も表示されなければインストール済み
  2. perldoc モジュール名
    ※ドキュメントが表示されればok
    インストールされている場所が知りたい場合は
    perldoc -l モジュール名
    バージョンが知りたいときは(出ないこともあるけど)
    perldoc -m モジュール名

MIME::Entity がインストールされているか確認

#  perl -MMIME::Entity -e ''
Can't locate MIME/Entity.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .).
BEGIN failed--compilation aborted.

ということで入っておりませんでした。

開発用の rpm も cacti のインストール時に必要と思われるものは入れてありますが、CPANのインストールを行う場合は一式あった方が先々問題が出なそうでしたので、
# yum -y groupinstall 'Development tools'

でインストールをしておきました。

2018/07/13 追記
 CentOS 7 ではリリース当初は groupinstall が使えなかったようです。自分が使っている 7.5 では警告は出るもののインストールは完了しました。CentOS 7 からは

# yum groups install "Development Tools"

が正しいようです。
--- 追記終わり ---

最近のcpanはyamlが必要なのでcpanを使う前にyamlのインストールをしました。
# yum -y install libyaml-devel

続いて CPAN のインストールをします。
# yum -y install cpan


CPANの設定のします。全てデフォルトのまま。(問いに対しEnterキー押下のみ。)
# cpan

最後に
Would you like me to append that to /root/.bashrc now? [yes]


commit: wrote '/root/.cpan/CPAN/MyConfig.pm'

You can re-run configuration any time with 'o conf init' in the CPAN shell
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9800)
Enter 'h' for help.

cpan[1]> quit ← 一旦終了

と聞かれ、.bashrc が書き換わっております。Perl でモジュールの開発をする方はローカル→共通と使い分けすると思うのですが、自分はモジュールの開発はしないのでパスの通っているディレクトリにインストールされるよう .bashrc の変更をします。(Perl関連の追加5行をコメントアウトする。)

# vi .bashrc

#export PERL_LOCAL_LIB_ROOT="$PERL_LOCAL_LIB_ROOT:/root/perl5";
#export PERL_MB_OPT="--install_base /root/perl5";
#export PERL_MM_OPT="INSTALL_BASE=/root/perl5";
#export PERL5LIB="/root/perl5/lib/perl5:$PERL5LIB";
#export PATH="/root/perl5/bin:$PATH";

一旦ログアウトし、再度 rootでログイン。念のため環境変数の確認をする。

# exit
$ su -
# echo $PERL5LIB
← 空白ならok

yaml のライブラリはインストール済みですが、モジュールがまだですのでYAML のモジュールをインストール。続いて MIME::Entity をインストールしてみます。YAML のモジュールが未インストールだとモジュールの追加(コンパイル時)に失敗します。
※ CPAN も古いのが入っているので、ついでに上げておいた方がいいかも

# cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9800)
Enter 'h' for help.

cpan[1]> install YAML
Reading '/root/.cpan/Metadata'
   Database was generated on Sat, 30 Jun 2018 09:17:03 GMT
Running install for module 'YAML'
Running make for T/TI/TINITA/YAML-1.26.tar.gz

(snip)

Appending installation info to /usr/lib64/perl5/perllocal.pod
   TINITA/YAML-1.26.tar.gz
   /bin/make install  -- OK

cpan[2]> install MIME::Entity
Running install for module 'MIME::Entity'
Running make for D/DS/DSKOLL/MIME-tools-5.509.tar.gz

(snip)

Appending installation info to /usr/lib64/perl5/perllocal.pod
   DSKOLL/MIME-tools-5.509.tar.gz
   /bin/make install  -- OK

cpan[3]> quit


無事にインストールができたようです。root での確認では自分のローカルにインストールされている可能性もあるので、一般ユーザで確認をしてみることをにします。

# exit
$ perl -MMIME::Entity -e ''

なにも出力されませんので、問題なくインストールができたようです。


2018/07/13 追記

cpan でデフォルトインストール(基本的には対話形式で入れたいので、環境変数で一時的対応をする)
# export PERL_AUTOINSTALL='—defaultdeps'

cpan でモジュールのインストール時や upgrade でエラーが出る。(インストール環境に左右されますが、自分の足りなかった物たち)
# yum -y install expat-devel
# yum -y install perl-Env
# yum -y install openssl-devel

シェルでヒストリが効かない (Bundle::CPANをインストール)
# cpan
> install Bundle::CPAN