GMAILから添付ファイル付きのメールを送信するPerlスクリプトを探していたら
見つかりましたのでメモしておきます。
■リンク
GmailのSMTPを利用してPerlからメール送信(添付ファイル付) - memo.mzt
http://d.hatena.ne.jp/mzt/20080219/p1
↑基本的には上記のサイトの通りでできますが、
必要なライブラリをLinux(Ubuntu)に導入する際に苦戦したので、
エラーと対処方法をメモしておきます。
■インストール方法
1.CPAN起動(Ubuntuには最初からCPANがはいっています)
$ sudo cpan
質問はデフォルト値でよいので、基本はEnter連打でよい
2.「cpan[1]>」のプロンプトが出たら、installコマンドでインストールする
cpan[1]>install Net::SSLeay
cpan[2]>install Test::More
cpan[3]>install IO::Socket::SSL
cpan[4]>install Net::SMTP
cpan[5]>install Net::SMTP::SSL
cpan[6]>install Authen::SASL
cpan[7]>install MIME::Entity
cpan[8]>install Jcode
特にエラーがなければOKです。
★確認方法:インストール後にもう一度「install Jcode」のようにコマンドを打ち、
「Jcode is up to date (2.07).」のように出れば最新版が入っているのでOK
あとはリンク先のサイトを参考にコードを書けばOKです。
■エラーがでたときは
・Can't locate Net/SSLeay.pm in @INC
のような表記が出る
⇒必要なライブラリがないです。今回は「Net/SSLeay.pm」が必要なので、
こちらを先にインストールします。
※ IO::Socket::SSLはSSLeay.pmがインストールされていないとインストールに失敗します
※ Net::SMTP::SSLはSSL.pmがインストールされていないとインストールに失敗します
・Net::SSLeayがインストールできない
・エラーその1:
SSLeay.xs:92:25: error: openssl/err.h: No such file or directory
のようなエラーが出ている
⇒$ sudo aptitude install libssl-dev
でlibssl-devをインストールします(aptitudeはapt-get的なコマンドらしい)
・エラーその2:
Running install for module 'Net::SSLeay'
Running make for F/FL/FLORA/Net-SSLeay-1.35.tar.gz
Has already been unwrapped into directory /home/bird/.cpan/build/Net-SSLeay-1.35-enixVl
Could not make: Unknown error
のようなエラーが出る
⇒インストールディレクトリ配下(Has already been unwrapped into directory部分
ここでは「/home/bird/.cpan/build/Net-SSLeay-1.35-enixVl」)
のMakefile.PLを確認します
手動でperlを実行
$ cd /home/bird/.cpan/build/Net-SSLeay-1.35-XiA6EZ
$ sudo perl Makefile.PL
Cannot determine perl version info from lib/Net/SSLeay.pm
のエラーが出て止まる。今回はこれが原因とわかります。
⇒手動でコンパイルすればよいようなので、コンパイル実行、インストール
コンパイラやコマンドはシステムによって違うかもしれないです(gmakeなど)
$ sudo make
$ sudo make install
⇒インストール完了
※もうひとつ何かインストールできないライブラリがありましたが、
同様に上記方法でコンパイル、インストールできました。
・参考サイト
StrawberryPerlにNet-SSLeayをインストールする - 日曜プログラマのそゞろ事
http://weblog.nqou.net/archives/20090315041224.html
■スクリプト
(以下は参考までに、今回使用したPerlスクリプト。リンク先のスクリプトに
少しだけ手を加えたもの)
---
#!/usr/bin/perl
# 引数で与えたファイル(フルパス指定)をメールに添付し、送信する
# (GMAILアカウントから送信する。)
# その際、このプログラムを実行した時刻が本文に記載される。
# 参考
# GmailのSMTPを利用してPerlからメール送信(添付ファイル付) - memo.mzt
# http://d.hatena.ne.jp/mzt/20080219/p1
use Jcode;
use Net::SMTP;
use MIME::Entity;
use Net::SMTP::SSL;
#--Config----------------------------
my $smtp_server = 'smtp.gmail.com';
my $smtp_port = '465';
my $smtp_acc = 'test@gmail.com';
my $smtp_pwd = 'passwd';
#------------------------------------
#--日時取得-----------------------------------------------------------------
( $sec, $min, $hour, $date, $month, $year, $youbi ) = localtime;
$year += 1900;
$month++;
@jweek = ( "日", "月", "火", "水", "木", "金", "土" );
$j_youbi = $jweek[ $youbi ];
$hour = sprintf "%02d", $hour;
$min = sprintf "%02d", $min;
$sec = sprintf "%02d", $sec;
$event_time="$year/$month/$date($j_youbi)$hour:$min:$sec";
print "イベント発生:$event_time\n";
#日時取得ここまで-----------------------------------------------------------
$event_name=$ARGV[0]; #引数を格納する
#添付ファイル名
my $file_path_mail=$event_name;
my $timestamp_string=$event_time;
#あて先など
my $mail_to = 'test@gmail.com';
#my $mail_bcc = 'bcc@example.com';
my $mail_from = 'test@gmail.com';
#件名
my $mail_subject = 'メール件名';
#本文
my $mail_body = <<"_MAILBODY_";
データ送信です
時刻:$timestamp_string
_MAILBODY_
#文字コード変換
$mail_subject = jcode($mail_subject)->jis;
$mail_subject = jcode($mail_subject)->mime_encode;
$mail_to = jcode($mail_to)->jis;
$mail_to = jcode($mail_to)->mime_encode;
#$mail_bcc = jcode($mail_bcc)->jis;
#$mail_bcc = jcode($mail_bcc)->mime_encode;
$mail_from = jcode($mail_from)->jis;
$mail_from = jcode($mail_from)->mime_encode;
$mail_body = jcode($mail_body)->jis;
my $err;
my $oSmtp;
my $oMime;
#ここから送信処理
$oSmtp = Net::SMTP::SSL->new($smtp_server,Port => $smtp_port, Debug => 1);
if($oSmtp->auth($smtp_acc,$smtp_pwd)){
$oSmtp->mail($mail_from);
$oSmtp->to($mail_to);
# $oSmtp->bcc($mail_bcc);
$oSmtp->data();
$oMime = MIME::Entity->build(
From => $mail_from,
To => $mail_to,
# Bcc => $mail_bcc,
Subject => $mail_subject,
Data => $mail_body);
$oMime->attach(
Path => $file_path_mail,
Type => "application/octet-stream",
Encoding => "Base64"
);
$oSmtp->datasend($oMime->stringify);
$oSmtp->dataend();
$oSmtp->quit;
print "ok mail to $mail_to\n";
}else{
$err = 'SMTP Server Authentication Error!!';
print "NG \n";
print "error : $err \n";
}
print "end... \n";
exit;
hiroと申します。スクリプトから動くメール送信スクリプトを探していたら、ここにたどり着きました。ほぼ丸写しですが、当方のブログDBバックアップ用途に使わさせて頂きました。また、事後報告になってしまいましたが、当方サイトでのバックアップ手法紹介記事でこちらのコードにちょっと手を加えたものを表示致しております。事後報告となりすみませんでした。今後ともよろしくお願いいたします。
hiroさんはじめまして。
メール送信スクリプトがあると便利ですよね。
ブログ拝見させていただきました。掲載されているソースコードがカラーだとわかりやすくてよいですね。これからもよろしくお願いします。
(私も他の方のスクリプトに手を加えさせていただいただけなのでたいしたことはしていないです^^;)