読者です 読者をやめる 読者になる 読者になる

毎日ランダムな時刻にメールを送るシェルスクリプト

試験を控えた友人から、「”試験まであと○日"っていうメールを毎晩送って!」という依頼を受けた。それも、毎日同じ時間だとドキッとしないので「21時から22時の間のランダムな時刻の間に」メールを受信するのが望ましいらしい。これを実現するため、私は下記のような動作を自動で行うシェルスクリプトを書くことにした。常時稼働しているサーバーを持っていればスリープ解除云々は必要ないのだが、残念ながら私は1日の大半の時間スリープしているラップトップしか持ち合わせていないのである。

  1. 21時から22時の間にMac(OS Sierra)をスリープ解除する
  2. 1の1分後に文章を自動生成しファイルに保存、postfixを使用してgmailsmtpサーバーに繋ぎメールを送信する
  3. 乱数を発生させ、次の日上記の動作を行う時間を決める
  4. 翌日の21:XX分に1が行われるように設定する
  5. 4の1分後に2が行われるように設定する
  6. Macをスリープさせる

以下、順番に書いていこう。

コマンドラインからメールを送信できるようにする

今回はデフォルトでインストールされているpostfixを利用することにした。初めは独自ドメインを作って送信しようと思ったが、テストメールを送信したところ悉く弾かれたので仕方なくgmailsmtpサーバーを利用することにした。そのため、事前準備として安全性の低いアプリがgoogleアカウントにアクセスするのを許可しておく必要がある。

/etc/postfix/main.cfに

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain
smtp_use_tls = yes

を追記した上で、googleのログインに必要な情報を入れた

[smtp.gmail.com]:587 hogehoge@gmail.com:passwd

という内容の/etc/postfix/sasl_passwdを作成し、sudo postmap sasl_passwdとしてデータベースを更新する。

あとはpostfixを再起動すればメールを送信できるようになる。

sudo postfix stop
sudo postfix start

文章を自動生成する

「あと○日」とだけ打ったメールを送るのはあまりにも味気ないので、翌日の天気と星占いも一緒に載せることにした。

翌日の天気の取得

翌日の天気をAPIで取得するにはOpenWeatherMapが便利である。Sign UpすればAPI Keyが無料で入手できる。後は毎日APIを叩いて当日と翌日の天気が記載されたjsonファイルを取得し、こちらを参考に翌日の天気予報を取り出して文章を整形する。この作業にwgetコマンドとjqコマンドを使用するため、事前にbrewを用いてインストールしておく。

翌日の星占いの取得

検索すれば意外と見つかるもので、WebAdFortuneAPIで星占いを発信している。これも同じくjsonファイルが得られるので、友人の星座のところの占いだけ取得し文章を整形する。

時刻指定してシェルスクリプトを実行する

これにはatコマンドを用いたが、デフォルトではオフになっているそうで(?)、私の場合は

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

が効いて動くようになった。が、plistファイルを編集しなくてはならないという話もあって情報が錯綜している。因みにpilstファイルは最近導入されたAppleの特殊プロテクトSystem Integrity Protectionにより保護されているらしくroot権限でも書き込みできないので、これを解除するとなるとセーフモードで起動したり色々しなくてはならないようだ。

sudoをパスワードなしで利用できるようにする

Macのスリープ解除時刻指定に使うpmsetは設定変更にあたるためsudoを用いる必要がある。が、いちいちパスワードを要求されていては自動化の意味がないので、visudoで

root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL
hogehoge ALL=(ALL) NOPASSWD: ALL #これを追記

とした。

これで下準備が整った。以下は実際に書いたシェルスクリプトである。

gist48e87a2a210a8888b230a0c13eca4e18

これにより友人には以下のようなメールが毎晩送信される。

生理学試験まであと37日です。

---明日の天気と占い---
京都の天気は快晴、最高気温は15.87度、最低気温は3.18度です。
双子座は2位。運勢は全体運:5、仕事運:5、金運:4、恋愛運:5です。新しい習い事にチャレンジするなど、前向きな行動が運気を高めます。気になっている場所の掃除も、早めに終わらせて☆
ラッキーカラーはシルバー、ラッキーアイテムはしょうゆです。