2011年5月16日月曜日

シェルスクリプトとcrontabでメール定時送信 on MacOS X

仕事上で、会議のリマインダーメールやメールマガジンを定時送信する必要があったので、ネットの情報を参考に、MacOSX上で動くシェルスクリプトを書いてみた。

環境は、MacOSX 10.5 シェルはMac portのzsh です。

1.1行目にSubject: を記入し、2行目以降にメール本文を記述したテキストファイルを用意
  このファイルが、スクリプト2行目の mailfile= にあたります。
2.宛先メールアドレスを記入したテキストファイルを用意(1行1アドレス)
  このファイルが、スクリプト3行目の listfile= にあたります

crontabでスケジュールするためには、1.2.のファイルや、コマンドはフルパスで書いた方が良いようです。

メールを送るコマンドは、普通 mail コマンドを使うらしいですが、私の普段使いのメーラーのmuttは、mailコマンドと同じような使い方ができます。muttは普段使いしているので、smtp設定は済んでいるしているし、送信記録も普段通りに残るので便利です。
mutt もmacport からインストールしたものです。
行頭の番号は目安なので、実際に書くときは省いてください。
======== ここから ========
01 #!/bin/sh
02 listfile="[fullpath]/[listfile_name]"
03 mailfile="[fullpath]/[mailfile_name]"
04
05 if [ ! -f $listfile ]; then
06 echo "Recipient list file $listfile does not exist.."
07 exit 1
08 fi
09
10 if [ ! -f $mailfile ]; then
11 echo "Mail body file $mailfile does not exist.."
12 exit 1
13 fi
14
15 subject=`/usr/bin/head -n 1 $mailfile | /opt/local/bin/nkf -m`
16 for to in `cat $listfile`
17 do
18 /usr/bin/tail -n +2 $mailfile | /opt/local/bin/nkf | /opt/local/bin/mutt -s "$subject" $to
19 done
20 exit

======== ここまで ========

上記を保存して、
chmod コマンドで、実行権限を与えておきます。

次に、 crontab でスケジューリングします。
送信スクリプトのファイル名は、autosend.sh とします。
送信できなかった場合の原因をわかりやすくするために、実行ログや、エラーログが残るようにします。
実行ログは、>>[fullpath]/[filename]
エラーログは、 2>>[fullpath]/[filename]

例えば、5月16日午前10時にメールを送信する設定は
======== ここから ========
% crontab -e

00 10 16 05 * /opt/local/bin/zsh /[fullpath]/autosend.sh >>$HOME/log/exec.log 2>>$HOME/log/error.log
======== ここまで ========

色々試したのだけど、スクリプトのパスの前に普段使っているシェルを指定するとうまくいきました。指定しないと環境変数の関係か、日本語文字コードの変換がうまくいかず、メール本文が文字化けしました。

OSの日本語環境変数、シェルの日本語環境変数、muttの日本語設定の組み合わせなどで、
スクリプトの中にnkfコマンドが必要だったり不要だったり、nkfオプションが違ったりしました。

何せ、日本語メールの文字コード設定は複雑です。上記も、何回かの実験で検証しただけで、日本語文字コードを完全に理解した上で書いているわけではないので、予めご了承を。


ありがたく参考にさせてもらった情報
http://shikabo.ddo.jp/wp-content/uploads/mailsendsh.txt
http://d.hatena.ne.jp/anmino/mobile?date=20100407

0 件のコメント:

コメントを投稿