Linuxでなにかしら処理を動かしていると、処理が終了した際にローカルのユーザにメールを送ってくることが多い(デフォルトでは/var/spool/mail/<user>にファイルとして吐かれてる場合が多い(mbox形式))。 ちゃんとしたサーバだったら監視ツールとか入れたり、別途Slackにポストさせたり、ちゃんとメーリングリスト宛にメールを転送させるように設定したりしているけど、適当にCUIでキックした処理の終了連絡とか、cronで定期実行してる処理だとそこまでしてなかったりする。

で、そもそも最近はメールもあまり見ないし、Slackにはメールを受け付けてチャンネルにPOSTしてくれる機能もあるので、これを使おう…と思ったのだが、有料契約のワークスペースじゃないと使えないらしい。

今回の場合は個人用に作ってあるワークスペースで、単に監視情報を受け付けるのが目的なので、正直有料プランに契約するのはちょっとなぁ…と思ったので、定期的にmboxのメールを確認し、新規で発生したメールについてはWebhookからSlackにPostさせるようなスクリプトを作成することにした。 Pythonであればライブラリもあるので、Python(Python3)で作成する。

以下、コード。Webhookのトコのurlは事前に自分のワークスペースで取得しておくこと。

mbox2slack.py
#!/usr/bin/env python3 import mailbox import os import slackweb # slackへのpost関数 def to_slack(messages): slack_url = "https://hooks.slack.com/services/hoge/hoge/hogehoge" slack = slackweb.Slack(url=slack_url) slack.notify(username=os.environ.get("HOSTNAME"), text=messages) # メールをチェックしてslackへPOSTする関数 def check_mail(file): # mboxからkeysを取得する mbox = mailbox.mbox(file) keys = mbox.keys() # mboxをlockし、1メールづつSlackにPOSTする(読んだメールは削除する) mbox.lock() for k in keys: to_slack(mbox.get_string(k)) mbox.remove(k) mbox.flush() mbox.close() mbox.unlock() # main関数 def main(): mbox_dir = "/var/spool/mail/" user = os.environ.get("USER") check_mail(mbox_dir + user) # main関数の実行 if __name__ == "__main__": main()

いろいろと面倒くさがって書いてるので、ある程度環境に依存しそう(一般ユーザの場合は権限の有無でmailの削除ができない可能性があるなど)だし、Attachment使ってないから読みにくいんだけど、ローカルのメールをPOSTするだけならこんなのでもいいかな。