一人一人に年賀メールを送りましょう

来年になれば、年賀状を見てくる人もいるんだろうなとか。
まぁ確かにそれはいいんだが、このページは極端に読みにくいからねぇ。
そうなると定着しないかなという気もしますけどね。
それはそうと、今日は大晦日だと。
今年はさほど忙しくもなかったが、来年は大変だろうなとか思わないこともない。


どうも最近は年賀状で年始の挨拶をするでなしに、
これを電子メールでする人が増えているとか。
僕は特に挨拶をしておかないといけない人には年賀状を送ってきたけどね。
まぁそれはそうと電子メールですか。
トラフィックが集中するから困ると携帯電話会社は言ってるけどね。
まぁここではコンピュータから送ることを考えよう。
ただ大量に送るとなるとちょっとめんどくさい。
これについては2つの考えがあるな。
Bccで大量送信する方法。別にこれで通常はOKなのだが、Toがインチキな宛先になるのが欠点。
Bccだけで送るのは変だから、普通はToに自分のメールアドレスを入れたりするけどね。
BccはBlind Carbon Copyの略で、Ccのうちヘッダーに出てこないもののこと。
別にそれでもいいんだが、受け取った方はちょっと気分が悪い。
そもそも電子メールの送り先にはTo、Cc、Bccの3つがあって、
Toは本来の宛先。だから普段はここばっかり使うと。
Ccは参考に送付しておく宛先。その中で特にヘッダーに書かずに送付するのがBcc。
ToとCcはヘッダーに記載されるので、受けとった人がどこに送ったかわかる。
けどBccはヘッダーに記載されないので、宛先がばれることがないと。
ToとかCcで複数に送信すると、他に送信した人のメールアドレスがばれてしまうと。
大量に送信するメールですが、このメールは送り先全員がToに書くに値するものだから、
気分が悪いと言うことです。とはいえ実用的な方法なのでよく使われますね。
けど、1通1通Toの部分だけ書き換えたメールを作ってやればいいんじゃないかと。
そりゃ当然ですが、そんなこともできます。


実は結構苦労したのですが、こんなPerlスクリプトで送れそうです。

use strict;
use warnings;
use utf8;
use Encode;
use Mail::Sendmail;
use Time::Local;
my @list=qw{
foo@example.com
bar@example.com
};
my $body=<<'EOF';
あけましておめでとうございます。
今年もよろしくお願いします。
EOF
my %params=(
'Smtp' => 'smtp.example.com',
'Content-Type'=> 'text/plain; charset=ISO-2022-JP',
'From' => encode('MIME-Header-ISO_2022_JP','Hidemaro '),
'Subject' => encode('MIME-Header-ISO_2022_JP','あけましておめでとうございます'),
'Date' => Mail::Sendmail::time_to_date( timelocal(0,0,0,1,1-1,2009) ),
'Message' => encode('iso-2022-jp',$body),
);
for my $to(@list){
sendmail(%params , 'to'=>$to) or die $Mail::Sendmail::error;
print "Send : $to\n";
}

useだらけですね。まぁ初め3つは特殊なプラグマだけどね。
use utf8;してるからこれはUTF-8で書いてね。他のエンコーディングでもuse encoding ‘euc-jp’;とかすればいいけど。
このうちMail::Sendmailは特に導入する必要があります。

perl -MCPAN -e "install Mail::Sendmail"

このコマンド一発でインストールできます。
かなり怪しい動作をしてるように見えたけど、最終的には入りました。
今回のポイントはMail::Sendmailですね。
sendmail関数に内容を書いたハッシュを渡してあげればいいわけです。
さて、宛先リストの@listはqw{ }で、本文の$bodyはヒアドキュメントで作ってます。
それでsendmail関数に渡すハッシュを用意します。To以外はここで埋めてしまおうと言うことです。
Smtpにはメールサーバーを書きますよと。
From・Subject、ToにASCII以外を含む場合は、エンコードしないといけない。
これなんだが、EncodeのエンコーディングにMIME-Header-ISO_2022_JPってやつがあるから、
これを使えばいいそうだ。今回はFromはASCIIだけだが、説明のために使ってる。
Dateだが、指定しなければ現在時刻になるが、ここは1月1日0時0分とするためにやってる。
まずUNIXTIMEを用意しないといけない。これはTime::Localのtimelocalを使うと出せる。
引数は、秒、分、時、日、月-1、年となってる。月-1であるところに注意。
これをMail::Sendmail::time_to_dateでメール用の表記に変えてもらう。
Messageは日本で主流のISO-2022-JPにエンコーディングする。
実はContent-Typeできっちり指定してあります。
さて、各人に送るわけだが、%paramにtoだけ足せばいいと。
こういう関数は引数にハッシュを取ると言っても実は配列なんですよね。
だからこういう風な表記も普通に出来ると。
エラーは$Mail::Sendmail::error、結果のログは$Mail::Sendmail::logに入る。


まぁこれを使えばうまく送れるんじゃないかなと。
このMail::Sendmailというモジュールは結構多機能みたいです。
実はPerlでメールを送る試みは初めてだったりする。
今まではPHPから送ることはあっても、Perlからは送らなかったしね。
Linuxから送るのなら、ひたすらパイプでmailコマンドに渡せばいいんだが、
Windowsではこうも行かないので、正攻法で書いてみた。
この方法ならば、何時に送っても1月1日の0時0分に送れるので、
トラフィックも安定してきましたなぁという時間に送ってもいいと思いますよ。
年始のご挨拶にご活用ください。