2013年11月12日火曜日

CSVファイル情報を宛先(To:)や本文に挿し込んで一斉メール送信するシェルスクリプト

以前、「シェルスクリプトとcrontabでメール定時送信 on MacOS X 」という投稿をしましたが、この一斉メール送信シェルスクリプトを少し手を入れて、CSVファイルからメールアドレスをTo:に挿し込んだり、メール本文に相手の名前を挿し込んで一斉送信できるように改造しました。使いようによってはSPAMメールの発射装置ですな...
このスクリプトは無保証です、念のため。

例えば、こういうCSVファイルがあったとして
鈴木一郎,ichiro@hogehoge.com,userid0001,xko2magk,
上原浩治,uehara@funyafunya.org,userid0002,d8namdw2,
岩隈久志,iwakuma@bashabasha.net,userid0003,yuA7qle C,
メールのTo: にそれぞれのメールアドレスを挿入し、こうしたメール本文↓に相手先の使命や、ID、パスワードなどを挿し込んでいきます(パスワードをメールに記述することは本来望ましくありませんが)。
member_name 様

平素はご利用ありがとうございます。
弊社Webサイトのお客様ページへのmember_name 様のログイン情報をご案内します。

ーーーーーーーーーーーーーーーーー
ユーザー名:member_ID
パスワード:member_passwd
ーーーーーーーーーーーーーーーーー
member_name のところにCSV1列目の氏名を、
member_IDのところにCSV2列目のログインIDを、
member_passwdのところにCSV3列目のパスワードを
それぞれ挿し込んで、順次送信していきます。

なお、今回のスクリプトは、前回と同様に コマンドラインでのメール送信にmailコマンドではなくmuttを使います。
今回はmuttの設定には触れませんので、設定方法は他を参照してください。

 以下、スクリプトです。行頭の番号は行数の目安と、説明のために便宜的に付けているので、実際にスクリプトを書くときには削除してください。また、ファイル名やPATHなどは適宜読み替えてください。
  1 #!/bin/sh
  2 listfile="$HOME/list.csv"
  3 if [ ! -f $listfile ]; then
  4         echo "Recipient list file $listfile does not exist.."
  5         exit 1
  6 fi
  7
  8 mailfile="$HOME/mailbody.txt"
  9 if [ ! -f $mailfile ]; then
 10         echo "Mail body file $mailfile does not exist.."
 11         exit 1
 12 fi
 13
 14 subject=`head -n 1 $mailfile | nkf -m`
 15 cat ${listfile} | while read line
 16 do
 17         name=`echo $line | cut -d"," -f 1`
 18         to=`echo $line | cut -d"," -f 2`
 19         usernm=`echo $line | cut -d"," -f 3`
 20         passwd=`echo $lin3 | cut -d"," -f 4`
 21         contents=`/usr/bin/tail -n +2 $mailfile | sed -e "s/member_name/$name    /g" | sed -e "s/member_ID/$usernm/g" | sed -e "s/member_passwd/$passwd/g"`
 22         echo "$contents" | nkf | mutt -s "$subj    ect" "$to" -a "$1"
 23         if [ $? -eq 1 ]; then
 24                 echo "send mail failure $to"
 25                 exit 1
 26         fi
 27
 28         echo "send mail success $to"
 29         sleep 15
 30 done
 31 exit
2:CSVファイルの指定
3〜6:$listfileがなかった場合に吐くメッセージ。
8:メールサブジェクトと本文のテキスト指定。1行目がSubject、2行目以降が本文。
9〜12:$mailfileがなかった場合に吐くメッセージ。
14:$mailfileの一行目をsubjectに指定する。文字化けしないようにnkfコマンドで日本語コードを調整。お手元の環境に応じて適宜変更してください。
15:$listfileを一行ごと読み出し、whileで繰り返す。
17:$listfileから1列目の氏名をcutコマンドで切り出す。
18:$listfileから2列目のメールアドレスをcutコマンドで切り出す。
19:$listfileから3列目のユーザーIDをcutコマンドで切り出す。
20:$listfileから4列目のパスワードをcutコマンドで切り出す。
21:tailコマンドで、メール本文は2行目からと指定し、sed -e コマンドで本文中のmember_name、member_ID、member_passwdをそれぞれ置換する。
22:上記までで整えた本文をnkfをかまして、文字化け回避。お手元の環境に応じて適宜変更してください。そしてmuttに渡して送信。「-a "$1"」は添付ファイルをする場合のおまけで、スクリプト実行の際、引数として添付ファイルを指定してください。添付ファイル不要の場合は削除可の記述です。
23〜26:メールが送信できなかった場合に吐くメッセージ。
28:メール送信が成功した場合に吐くメッセージ。
29:送信間隔の指定。スパム対策のため時間当たりのメール発信数を制限しているSMTPがあるので、制限に応じたインターバルを設定する。

参考情報
お忙しい中、スクリプト作成の相談にのってくださり、多くの助言をくださった、K.O氏に感謝。