Net::SMTPSを用いてメール送信する。
メール本文の作成は次の3通りの方法で
・全て手動で作成する
・Email::MIMEを使う
・MIME::Entityを使う
また、添付ファイルがある場合も考察する。
※ Net::SMTPSではなく、Email::Sender を使うサンプルは『(Perl) Email::Senderを使ってメール送信』を参照。
メール本文の手動作成、添付ファイル無し
最も基本的な例
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Encode qw(encode);
use Net::SMTPS;
my $from = 'sender@gmail.com';
my $from_name = '差出人の名前';
my $to = 'recipient@example.com';
my $to_name = 'あて先の名前';
my $subject = 'test テスト';
my $body =
"年齢からいえば、関羽がいちばん年上であり、次が劉備、"
. "その次が張飛という順になるのであるが、"
. "義約のうえの義兄弟だから年順をふむ必要はないとあって、"
. "「長兄には、どうか、あなたがなって下さい。\n"
. "それでないと、張飛の我ままにも、おさえが利きませんから」と、関羽がいった。";
my $smtp = Net::SMTPS->new(
'smtp.gmail.com',
Port => 587,
doSSL => 'starttls',
Debug => 1
);
$smtp->auth( 'sender@gmail.com', 'My_Password', 'CRAM-MD5' );
$smtp->mail($from);
$smtp->recipient( $to, SkipBad => 1 );
$smtp->data();
my $header_str =
"From: " . encode( 'MIME-Header-ISO_2022_JP', $from_name ) . "<$from>\n"
. "To: " . encode( 'MIME-Header-ISO_2022_JP', $to_name ) . "<$to>\n"
. "Subject:" . encode( 'MIME-Header-ISO_2022_JP', $subject ) . "\n"
. "Mime-Version: 1.0\n"
. "Content-Type: text/plain; charset = \"ISO-2022-JP\"\n"
. "Content-Trensfer-Encoding: 7bit\n\n";
$smtp->datasend($header_str);
$smtp->datasend( encode( 'iso-2022-jp', $body ) );
$smtp->dataend();
$smtp->quit;
STARTTLSではなく、SSLを用いる場合は、赤で着色した部分を次のように書き換える
Port => 465,
doSSL => 'ssl',
また、デバッグ表示を行うために青で着色した部分を記述している。
Email::MIMEを使用、添付ファイル無し
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Encode qw(encode);
use Net::SMTPS;
use Email::MIME;
use Email::MIME::Creator;
use Path::Class;
my $from = '差出人の名前 <sender@gmail.com>';
my $to = 'あて先の名前 <recipient@example.com>';
my $subject = 'test テスト';
my $body =
"年齢からいえば、関羽がいちばん年上であり、次が劉備、"
. "その次が張飛という順になるのであるが、"
. "義約のうえの義兄弟だから年順をふむ必要はないとあって、"
. "「長兄には、どうか、あなたがなって下さい。\n"
. "それでないと、張飛の我ままにも、おさえが利きませんから」と、関羽がいった。";
my $mail = Email::MIME->create(
'header' => [
'From' => encode( 'MIME-Header-ISO_2022_JP', $from ),
'To' => encode( 'MIME-Header-ISO_2022_JP', $to ),
'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
],
'attributes' => {
'content_type' => 'text/plain',
'charset' => 'ISO-2022-JP',
'encoding' => '7bit',
},
'body' => encode( 'iso-2022-jp', $body ),
);
eval {
my $smtp = Net::SMTPS->new(
'smtp.gmail.com',
Port => 587,
doSSL => 'starttls',
Debug => 1
);
$smtp->auth( 'sender@gmail.com', 'My_Password', 'CRAM-MD5' );
$smtp->mail($from);
$smtp->recipient( $to, { SkipBad => 1 } );
$smtp->data();
$smtp->datasend( $mail->as_string() );
$smtp->dataend();
$smtp->quit;
};
if ($@) {
die "ERROR : $@\n";
}
Email::MIMEを使用、添付ファイル有り
一つ上の例で、メール本文を構築している部分を次のように書き換える
my $mail = Email::MIME->create(
'header' => [
'From' => encode( 'MIME-Header-ISO_2022_JP', $from ),
'To' => encode( 'MIME-Header-ISO_2022_JP', $to ),
'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
],
parts => [
Email::MIME->create(
'attributes' => {
'content_type' => 'text/plain',
'charset' => 'ISO-2022-JP',
'encoding' => '7bit',
},
'body' => encode( 'iso-2022-jp', $body ),
),
Email::MIME->create(
'attributes' => {
'content_type' => 'text/plain',
'name' => 'attached image name',
'filename' => 'test01.jpg',
'encoding' => 'base64',
'disposition' => 'attachment',
},
'body' => scalar Path::Class::file('test01.jpg')->slurp,
),
],
);
緑で着色した部分で添付ファイルを処理している
MIME::Entityを使用、添付ファイル無し
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Encode qw(encode);
use Net::SMTPS;
use MIME::Entity;
my $from = '差出人の名前 <sender@gmail.com>';
my $to = 'あて先の名前 <recipient@example.com>';
my $subject = 'test テスト';
my $body =
"年齢からいえば、関羽がいちばん年上であり、次が劉備、"
. "その次が張飛という順になるのであるが、"
. "義約のうえの義兄弟だから年順をふむ必要はないとあって、"
. "「長兄には、どうか、あなたがなって下さい。\n"
. "それでないと、張飛の我ままにも、おさえが利きませんから」と、関羽がいった。";
my $mail = MIME::Entity->build(
'From' => encode( 'MIME-Header-ISO_2022_JP', $from ),
'To' => encode( 'MIME-Header-ISO_2022_JP', $to ),
'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
'Type' => 'text/plain;charset="iso-2022-jp"',
'Encoding'=> '7bit',
'Data' => encode( 'iso-2022-jp', $body ),
);
eval {
my $smtp = Net::SMTPS->new(
'smtp.gmail.com',
Port => 587,
doSSL => 'starttls',
Debug => 1
);
$smtp->auth( 'sender@gmail.com', 'My_Password', 'CRAM-MD5' );
$smtp->mail($from);
$smtp->recipient( $to, { SkipBad => 1 } );
$smtp->data();
$smtp->datasend($mail->stringify());
$smtp->dataend();
$smtp->quit;
};
if ($@) {
die "ERROR : $@\n";
}
MIME::Entityを使用、添付ファイル有り
一つ上の例で、メール本文を構築している部分を次のように書き換える
my $mail = MIME::Entity->build(
'From' => encode( 'MIME-Header-ISO_2022_JP', $from ),
'To' => encode( 'MIME-Header-ISO_2022_JP', $to ),
'Subject' => encode( 'MIME-Header-ISO_2022_JP', $subject ),
'Type' => 'text/plain;charset="iso-2022-jp"',
'Encoding'=> '7bit',
'Data' => encode( 'iso-2022-jp', $body ),
);
$mail->attach(
'Description' => 'attached image name',
'Type' => 'image/jpeg',
'Encoding' => 'base64',
'Path' => 'test01.jpg'
);