自分への通知用に指定時刻にメールを送る。

自分(の携帯など)に指定時刻にメールを送る様にしておくと便利な事がある。 例えば特定の曜日の決まった時刻にやる事がある場合なんかに。

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 でも良かったかも) この辺りも接続するサーバ次第。