Perlでメール送信
UNIX系のOSでは、ローカルから他のマシンにメールを配信するシステムを持っています。また、サーバでは、sendmail等のSMTPサーバが動いておりそれによって配信が可能です。
sendmailコマンドでメール配信を行うのではなく、perlがSMTPプロトコルで直接メール送信を行う方法です。稼動させるサーバにSMTPサーバが動いている必要はありませんが、利用できるSMTPサーバは必要です。外部のサーバも利用できますが、正規に利用できるところが必要です。
スパムメール等の問題もありますので、利用には注意してください。
単純なメール送信
単純なメールの配信方法です。とりあえず、送ってみる。
- 送信元・送信先の指定(名前の指定不可、送信先は1件のみ)
- 件名・本文に日本語利用可
- 添付ファイル使用不可
- 認証処理なし(迷惑メール送信対策済みサーバで利用不可)
1 |
#!/usr/bin/perl -w
##### Character-code is SHIFT_JIS. Tab-size is 4 space character. #####
###############################################################################
## PerlSmtpMail - perlからsmtpプロトコルでメール送信 - Ver.1.00 (2006/04/21)
##
## V1 : 単純な送信(本文・件名日本語 対応)
###############################################################################
########################################
## 必要パッケージ
use Net::SMTP; # SMTP処理
use Jcode; # 日本語エンコード
########################################
## 諸設定
# SMTP サーバ
my $smtp_server = 'smtp.example.com';
# メール送信者アドレス
my $sender = 'webmaster@example.com';
# メール送信先アドレス
my $recipient = 'foo@mail.bar.net';
# メール送信件名
my $subject = 'perlでメール送信';
# メールメッセージ設定
my $mail_body = << '__END_OF_MESSAGE__';
perlでメール送信
__END_OF_MESSAGE__
# DEBUG 出力
my $debug = 0;
########################################
## メール送信データ組み立て
# メールヘッダ作成 (MIMEエンコード変換)
my $header = "";
$header .= "From: " . $sender . "\n";
$header .= "To: " . $recipient . "\n";
$header .= "Subject: " . jcode($subject)->mime_encode() . "\n";
$header .= "X-Mailer: PerlSmtpMail version 1.00 (Net::SMTP)\n";
$header .= "Mime-Version: 1.0\n";
$header .= "Content-Type: text/plain; charset=ISO-2022-JP\n";
$header .= "Content-Transfer-Encoding: 7bit\n";
# メール本文作成 (JISコード変換)
# iso_2022_jp にエンコードすると、半角カナは全角に変換
my $message = jcode($mail_body)->iso_2022_jp;
########################################
## SMTP メール配信処理
# SMTP接続
my $smtp = Net::SMTP->new($smtp_server, Debug => $debug) or die 'SMTP SERVER CONNECT ERROR';
#送信元の指定
$smtp->mail($sender) or die 'SENDER ERROR';
#送信先の指定
$smtp->recipient($recipient) or die 'RECIPIENT ERROR';
# メール文面セット
$smtp->data();
$smtp->datasend($header);
$smtp->datasend("\n");
$smtp->datasend($message);
$smtp->dataend();
# SMTP切断
$smtp->quit;
###############################################################################
## End Of File (mailsend.pl) ##
############################################################################### |
複数の送信先、カーボンコピー対応
単純なメールの配信方法に複数の送信先を対応したものです。
- 送信元・返信先の指定(名前の指定不可)
- 送信先(TO,CC,BCC)で複数の配信先を指定可能(名前の指定不可)
- 件名・本文に日本語利用可
- 添付ファイル使用不可
- 認証処理なし(迷惑メール送信対策済みサーバで利用不可)
1 |
#!/usr/bin/perl -w
##### Character-code is SHIFT_JIS. Tab-size is 4 space character. #####
###############################################################################
## PerlSmtpMail - perlからsmtpプロトコルでメール送信 - Ver.2.00 (2006/04/21)
##
## V1 : 単純な送信(本文・件名日本語 対応)
## V2 : 複数の送信先、カーボンコピー対応(Cc, Bcc, Reply-To)
###############################################################################
########################################
## 必要パッケージ
use Net::SMTP; # SMTP処理
use Jcode; # 日本語エンコード
########################################
## 諸設定
# SMTP サーバ
my $smtp_server = 'smtp.example.com';
# メール送信者アドレス
my $sender = 'webmaster@example.com';
# メール返信先アドレス [OPT]
my $replyto = 'helpdesk@example.com';
# メール送信先アドレス(TO)
my $addr_to = 'foo1@mail.bar.net, foo2@mail.bar.net, foo3@mail.bar.net';
# メール送信先アドレス(CC) [OPT]
my $addr_cc = 'foo4@mail.bar.net, foo5@mail.bar.net, foo6@mail.bar.net';
# メール送信先アドレス(BCC) [OPT]
my $addr_bcc = 'foo7@mail.bar.net, foo8@mail.bar.net, foo9@mail.bar.net';
# メール送信件名
my $subject = 'perlでメール送信';
# メールメッセージ設定
my $mail_body = << '__END_OF_MESSAGE__';
perlでメール送信
__END_OF_MESSAGE__
# DEBUG 出力
my $debug = 0;
########################################
## メール送信データ組み立て
# メールヘッダ作成 (MIMEエンコード変換)
my $header = "";
$header .= "From: " . $sender . "\n";
$header .= "Reply-To: " . $replyto . "\n" if( $replyto ne "" );
$header .= "To: " . $addr_to . "\n";
$header .= "Cc: " . $addr_cc . "\n" if( $addr_cc ne "" );
$header .= "Subject: " . jcode($subject)->mime_encode() . "\n";
$header .= "X-Mailer: PerlSmtpMail version 1.00 (Net::SMTP)\n";
$header .= "Mime-Version: 1.0\n";
$header .= "Content-Type: text/plain; charset=ISO-2022-JP\n";
$header .= "Content-Transfer-Encoding: 7bit\n";
# メール本文作成 (JISコード変換)
# iso_2022_jp にエンコードすると、半角カナは全角に変換
my $message = jcode($mail_body)->iso_2022_jp;
# 受け取りのメールアドレスリスト作成
my @recipient = split(/[ ,]+/, $addr_to ." " . $addr_cc ." " . $addr_bcc );
########################################
## SMTP メール配信処理
# SMTP接続
my $smtp = Net::SMTP->new($smtp_server, Debug => $debug) or die 'SMTP SERVER CONNECT ERROR';
#送信元の指定
$smtp->mail($sender) or die 'SENDER ERROR';
#送信先の指定
$smtp->recipient(@recipient) or die 'RECIPIENT ERROR';
# メール文面セット
$smtp->data();
$smtp->datasend($header);
$smtp->datasend("\n");
$smtp->datasend($message);
$smtp->dataend();
# SMTP切断
$smtp->quit;
###############################################################################
## End Of File (mailsend.pl) ##
############################################################################### |
作業中
1 |
#!/usr/bin/perl -w
##### Character-code is SHIFT_JIS. Tab-size is 4 space character. #####
###############################################################################
## PerlSmtpMail - perlからsmtpプロトコルでメール送信 - Ver.x.00 (2006/04/21)
##
## V1 : 単純な送信(本文・件名日本語 対応)
## V2 : 複数の送信先、カーボンコピー対応(Cc, Bcc, Reply-To)
## V3 : 認証対応(POP before SMTP, SMTP AUTH, outbound Port25 Blocking 対応)
## V4 : 添付ファイル対応
###############################################################################
########################################
## 必要パッケージ
use Net::SMTP; # SMTP処理
use Net::POP3; # POP3処理 : POP before SMTP に必要
use Authen::SASL; # SASL認証 : SMTP AUTH に必要
#use MIME::Entity; # multipart作成 : 添付ファイルを送信に必要
#use MIME::Base64; # エンコード : 添付ファイルを送信に必要
use Jcode; # 日本語エンコード
########################################
## 諸設定
# サーバ設定
my %mail_conf;
# SMTP サーバ
$mail_conf{'SMTP'} = 'smtp.example.com';
# SMTP認証方式 (0:なし 1:SMTP 2:POP 3:APOP)
$mail_conf{'AUTH'} = 0;
# 認証ユーザ
$mail_conf{'USER'} = 'username';
# パスワード
$mail_conf{'PASS'} = 'password';
# POP3 サーバ (空白SMTPと同じ)
$mail_conf{'POP3'} = 'pop3.example.com';
# タイムアウト時間(秒)
$mail_conf{'TimeOut'} = 10;
# 不正なアドレスを無視 (0:エラー 1:する)
$mail_conf{'SkipBad'} = 1;
# メールヘッダ設定
my %mail_data;
# メール送信者アドレス
$mail_data{'FROM_ADDR'} = 'webmaster@example.com';
# メール送信者名
#$mail_data{'FROM_NAME'}= 'web 管理者';
# メール返信先アドレス
#$mail_data{'REPLY_TO'} = '';
# メール送信先アドレス(TO)
$mail_data{'TO_ADDR'} = 'foo@mail.bar.net';
# メール送信先アドレス(CC)
#$mail_data{'CC_ADDR'} = 'foo-cc@mail.bar.net';
# メール送信先アドレス(BCC)
#$mail_data{'BCC_ADDR'} = 'foo-bcc@mail.bar.net';
# メール送信件名
$mail_data{'SUBJECT'} = 'perlでメール送信';
# メールメッセージ設定
my $mail_body = << '__END_OF_MESSAGE__';
perlでメール送信
__END_OF_MESSAGE__
# DEBUG 出力
my $debug = 0;
########################################
## メール送信データ組み立て
# メール送信者
my $sender = $mail_data{'FROM_ADDR'};
# メール送信先
my $recipient = $mail_data{'TO_ADDR'};
# メールヘッダ作成 (MIMEエンコード変換)
my $header = "";
$header .= "From: " . $mail_data{'FROM_ADDR'} . "\n";
#$header .= "From: " . jcode($mail_data{'FROM_NAME'})->mime_encode() . " <" . $mail_data{'FROM_ADDR'} . ">\n";
#$header .= "Reply-To: " . $mail_data{'REPLY_TO'} . "\n";
$header .= "To: " . $mail_data{'TO_ADDR'} . "\n";
#$header .= "Cc: " . $mail_data{'CC_ADDR'} . "\n";
$header .= "Subject: " . jcode($mail_data{'SUBJECT'})->mime_encode() . "\n";
#$header .= "Date: " . . "\n";
$header .= "X-Mailer: Perl mail sender version 0.00 (Net::SMTP)\n";
$header .= "Mime-Version: 1.0\n";
$header .= "Content-Type: text/plain; charset=ISO-2022-JP\n";
$header .= "Content-Transfer-Encoding: 7bit\n";
# メール本文作成 (JISコード変換)
# iso_2022_jp にエンコードすると、半角カナは全角に変換
my $message = jcode($mail_body)->iso_2022_jp;
########################################
## POP before SMTP 用処理
if( $mail_conf{'AUTH'} == 2 || $mail_conf{'AUTH'} == 3 ){
if ( defined $mail_conf{'POP3'} || $mail_conf{'POP3'} eq '' ) {
# POP3 サーバの指定が無ければSMTPと同じとみなす
$mail_conf{'POP3'} = $mail_conf{'SMTP'};
}
# POP3接続
my $pop3 = Net::POP3->new($mail_conf{'POP3'}, Timeout => $mail_conf{'TimeOut'}, Debug => $debug) or die 'POP3 SERVER CONNECT ERROR';
if( $mail_conf{'AUTH'} == 2 ){
# POPユーザ認証 (conf:AUTH=2)
$pop3->login($mail_conf{'USER'}, $mail_conf{'PASS'}) or die 'POP AUTHENTICATION ERROR';
}
if( $mail_conf{'AUTH'} == 3 ){
# APOPユーザ認証 (conf:AUTH=3)
$pop3->apop($mail_conf{'USER'}, $mail_conf{'PASS'}) or die 'APOP AUTHENTICATION ERROR';
}
# POP3切断
$pop3->quit;
}
########################################
## SMTP メール配信処理
# SMTP接続
my $smtp = Net::SMTP->new($mail_conf{'SMTP'}, Timeout => $mail_conf{'TimeOut'}, Debug => $debug) or die 'SMTP SERVER CONNECT ERROR';
if( $mail_conf{'AUTH'} == 1 ){
# SMTP AUTH 認証 (conf:AUTH=1)
$smtp->auth($mail_conf{'USER'}, $mail_conf{'PASS'}) or die 'SMTP AUTHENTICATION ERROR';
}
#送信元の指定
$smtp->mail($sender) or die 'SENDER ERROR';
#送信先の指定
$smtp->recipient($recipient, { SkipBad => $mail_conf{'SkipBad'} }) or die 'RECIPIENT ERROR';
# メール文面セット
$smtp->data();
$smtp->datasend($header);
$smtp->datasend("\n");
$smtp->datasend($message);
$smtp->dataend();
# SMTP切断
$smtp->quit;
###############################################################################
## End Of File (mailsend.pl) ##
############################################################################### |
参考資料
- Net::SMTP - SMTP(Simple Mail Transfer Protocol)クライアント
- Net::POP3 - POP3(Post Office Protocol 3)クライアントクラス (RFC1939)
- Perlでメール送信
- Devel/Perl/Net-SMTP - cubic9.com
- World Wide Walker : Net::SMTP->auth
- Perlでメールを送る
最終更新時間:2008年11月17日 23時58分00秒 指摘や意見などあればSandBoxのBBSへ。
mailsend.pl mailsend_v1.pl mailsend_v2.pl