トップ 履歴 一覧 カテゴリ ソース 検索 ヘルプ RSS ログイン

Source/Perl/PerlSmtp

INDEX

Perlでメール送信

UNIX系のOSでは、ローカルから他のマシンにメールを配信するシステムを持っています。また、サーバでは、sendmail等のSMTPサーバが動いておりそれによって配信が可能です。

sendmailコマンドでメール配信を行うのではなく、perlがSMTPプロトコルで直接メール送信を行う方法です。稼動させるサーバにSMTPサーバが動いている必要はありませんが、利用できるSMTPサーバは必要です。外部のサーバも利用できますが、正規に利用できるところが必要です。

スパムメール等の問題もありますので、利用には注意してください。

単純なメール送信

単純なメールの配信方法です。とりあえず、送ってみる。

  • 送信元・送信先の指定(名前の指定不可、送信先は1件のみ)
  • 件名・本文に日本語利用可
  • 添付ファイル使用不可
  • 認証処理なし(迷惑メール送信対策済みサーバで利用不可)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/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)                                              ##
###############################################################################

参考資料

最終更新時間:2008年11月17日 23時58分00秒 指摘や意見などあればSandBoxのBBSへ。

mailsend.pl mailsend_v1.pl mailsend_v2.pl