こんにちは。
先日、Raspberry Pi 4Bで稼働中のNode-REDを外部公開しました。
外部公開と言っても私自身が外部からアクセスしたいだけなんですが、お勉強がてらリバースプロキシサーバを立てたりファイアウォールを設定したり・・・さらに無駄にもSSL証明書まで適用してみたりしました。
そんなSSL証明書は無料のLet's Encryptを利用しており、90日で有効期限が切れるため定期的に更新する必要があります。
更新処理はシェルスクリプトで自動化し定期実行しているのですが、もし失敗している場合にそれに気付かないままだと有効期限切れとなってしまいます。
そこで成功/失敗に関わらず処理結果をメールで自分に送ることを検討してみました。
■上手くいかん
さっそくLinux端末からメール送信するためのプログラムをインストールしてみたのですがどうにも上手くいきません。
先人のお知恵を拝借しながらsSMTP, Exim4を試してみたのですが、両方ともダメでした。
□sSMTP
謎のエラーが発生してメール送信に失敗します。
これは多くの方も上げられている問題で、設定ファイルにAuthLogin="YES"を追記すれば行ける!などの情報も試してみたのですが上手くいきませんでした。
□Exim4
こちらはSMTPサーバに拒否られます。何故なのかはさっぱり分かりません。
ネットにはGmailを利用した例が多く挙げられていましたが、諸々の事情で私はAOLメールを使う前提としました。
ファイアウォールのポート許可など万障お繰り合わせしたはずなんですが、GmailとAOLの差分を上手く設定に反映できていないっぽい?
どこをどうしていいのやら・・・。
■上手くいっている例がある
今回の「シェルスクリプトからメール送信」とは別件で実はメール送信出来ている例があります。
Node-REDのemailノードです。
Node-REDで操作している家電の稼働状況をAOLメールで送信していて、問題なく使えています。
じゃあSSL証明書更新の結果もNode-REDに送信させてしまえ!と思い立ちました。
■すげえ簡単じゃん
更新処理の標準出力/標準エラーはキャッシュファイルに出力するようスクリプトを組んでいます。
このキャッシュファイルをNode-REDで読み取ってそのままメール本文として送信してしまえばいいわけです。
そんなNode-REDフローを新規作成しHTTPでリクエストを受け付けるようにしました。
(シェルスクリプトからNode-REDフローを呼び出すもっとクレバーな方法があるのかもしれませんが)
シェルスクリプトには自ホストのNode-RED実行ポートに向けてHTTPリクエストを投げる一文を追加。
上述のキャッシュファイルのフルパスをパラメータとして渡すようにしました。以下のようなイメージ。
curl http://localhost:1880/UpdSslRslt?filepath=$UPDATE_SSL_CACHE >/dev/null 2>&1
さて結果は・・・無事に成功!これでわざわざログファイルを見にいかなくても成否をプッシュで検出できます。
うーん、Node-REDのemailノードに出来てsSMTPやExim4では出来なかった理由はなんなんでしょう。
結果オーライなら深掘りしないという私の軽薄なポリシーに則り、sSMTPやExim4のことは忘れることにします。
■余談
シェルスクリプトの定期実行はcrontabで行っていますが、crontabにはスケジュールしたジョブの成否をメール送信する機能があるそうですね。
しかしRaspberry Pi OSに組み込まれたcrontabにはその機能が除外されいるようです。メール送信に関する設定項目がありません。
(crontabのコメントにはなんかゴニョゴニョ書いてあるんだけどな・・・)
そもそもメール送信コマンドも組み込まれていないようで、mailutilsをインストールする必要がありました。
.