cron でメールを送るためのスクリプト
自分への通知用に指定時刻にメールを送る。
自分(の携帯など)に指定時刻にメールを送る様にしておくと便利な事がある。 例えば特定の曜日の決まった時刻にやる事がある場合なんかに。
5 分前にメールを受け取る様にしておくとか。
概要
要は自分の使っている メールサーバと直接 smtp で話してくれるプログラムに、 必要な情報をセットして実行するって事。
ポート 25 が使えた頃は mail コマンドで簡単だったのだが。
今、使っているサーバは SSL/submission port を使う必要があるが、 msmtp でなんとか実現できた。
ただ、メール受信が無料(タダ)ではないので、実際に使うかどうか、思案中。
使用法
cron で使う事を想定している。まぁ普通のシェルスクリプト。 引数は 1 番目のみ使用し、Subject とする。本文は無し。
受信リスト上で、内容が分かる様、Subject に用件を設定する。
使用する例は以下
$ alartmail.sh "【自動通知】本日 9 時○○で打ち合わせ"
スクリプト
一部伏字。 Subject の生成に ruby と nkf モジュールを使っている。
最初は msmtp への引数に --serverinfo
や --debug
を指定して
設定を確認したり、動きを見たりすると良い。
#! /bin/sh
TO="xxxx@xxxxxxxx.co.jp"
FROM="xxxxxx@xxxxx.co.jp"
SMTPSERVER="smtp.xxxx.xxxxx.co.jp"
SMTPPORT="999"
SMTPUSER="username"
SMTPPASS="userpass"
MAILER="/usr/bin/msmtp"
TIMEOUT=60
# Subject: use ARGV[1]
if [ ! -z "$1" ]; then
SUBJECT="`echo $1 | ruby -e 'require \"nkf\";puts NKF.nkf( \"-WMm0j\", STDIN.gets )'`"
else
SUBJECT="(no subject)"
fi
# send
cat <<EOF \
| ${MAILER} \
--auth=plain \
--tls \
--tls-starttls=off \
--tls-trust-file=/etc/ssl/certs/ca-certificates.crt \
--timeout=${TIMEOUT} \
--host=${SMTPSERVER} \
--port=${SMTPPORT} \
--from=${FROM} \
--user=${SMTPUSER} \
--passwordeval="echo ${SMTPPASS}" \
-- \
${TO}
From: ${FROM}
To: ${TO}
Subject: ${SUBJECT}
EOF
ちょっとハマったのは --auth
と --tls-trust-file
。
--auth
には plain、scram-sha-1、cram-md5、gssapi、external、
digest-md5、login、ntlm が指定できる。ここはサーバ依存なので、
サーバに合わせるしかない。または端から試す。
--tls-trust-file
は、最初何を指定して良いか、全然分からなかったが、
いろいろ検索する中で見たサンプルをまねた。
/etc/ssl/certs/ca-certificates.crt
はおそらく openssl 辺りが
インストール時に作成するものと思われる。
あと、メールヘッダに From:
や To:
を記述しているのは、
接続しているサーバが spam 判定でエラーにするのを避けるため。
最低限、From:
が必要だった。
(--auto-from=on
でも良かったかも)
この辺りも接続するサーバ次第。