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


2018年6月19日火曜日

device eth0 does not seem to be present

VMware vCenter Converter を使って CentOS6 を ESXi → ローカル → ESXi とコピーしたところ、タイトルのメッセージが出てネットワークの接続ができない。

俺の覚え書きさんの【CentOS6】NICが有効化できないときの対処 を参考に

# vi /etc/udev/rules.d/70-persistent-net.rules

を編集。一番下の行を生かし、eth1 を eth0 に変更し無事完了。

2018年5月9日水曜日

Cacti で不要rrdファイルの削除

Data Source を削除しても、対応する rrdファイルは削除されず残っております。Try & Error で Cacti の設定をしておりますが、いらなくなった rrdファイルの整理をしてみました。(残り容量がまだまだあるので、いますぐやらなくても大丈夫ではありますが。)

  1. [console] → "Utilities" → [System Utilities] を選択。
  2. "RRD Utilities" → [RRDfile Cleaner] を選択
  3. "Time Since Update" をプルダウンし、 "> 1 Week” を選択。(この辺はお好みで。)
    delete_rrd-01
  4. 一覧が表示されるので、削除するrrdファイルにチェックを入れ、右下 "Choose an action" から "Delete" を選択し、[Go] ボタンをクリック。(全ていらないファイルだと思うので、 "RRD File Name"バー右脇のチェックボックスをクリックし全選択が楽。)
    delete_rrd-02

タイムスタンプを見ているだけだと思うので、/usr/share/cacti/rra 配下のタイムスタンプが更新されていないファイルを削除しても一緒だと思います。

2018年5月8日火曜日

Windows 10 April 2018 Update を適用したら WOL ができなくなった...

表題通りです。

 Windows10 で Wake On LAN を使ってみるで一通り設定すべきことを書いておいたので、どこが変更されたか確認してみました。

  1. ドライバーは変更されていなかったです。
  2. 高速スタートアップが有効化されていました。

ということで、電源オプションから高速スタートアップを無効化しました。Wake on LAN for Windows 用に ping が通るか確認したところ、

  1. 同一セグメントからは ok
  2. 他セグメントからは NG

Windows Defender ファイアウォールの設定を確認したのですが、スコープで任意のIPアドレスが指定されているので問題ないはず。→ でも通らない。

面倒なので、ufufu diaryさんのブログのページを参考に、グループポリシーエディタで強制設定することにしました。これで次の大型アップデートが来ても pingの疎通確認は ok かな?

設定箇所:

「gpedit.msc」でグループポリシーを開く

 →コンピューターの構成
 →管理用テンプレート
 →ネットワーク
 →ネットワーク接続
 →Windowsファイアーウォール内

 「ドメインプロファイル」「標準プロファイル」それぞれで、
 「ICMPの例外を許可する」を「有効」にした上で、
 「着信エコー要求を許可する」にチェックすることで、回避できました。