Linuxサーバのローカルメールの内容を(無料枠の)SlackにPOSTさせるPythonスクリプト
Pocket

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

で、そもそも最近はメールもあまり見ないし、Slackにはメールを受け付けてチャンネルにPOSTしてくれる機能もあるので、これを使おう…と思ったのだが、有料契約のワークスペースじゃないと使えないらしい。
今回の場合は個人用に作ってあるワークスペースで、単に監視情報を受け付けるのが目的なので、正直有料プランに契約するのはちょっとなぁ…と思ったので、定期的にmboxのメールを確認し、新規で発生したメールについてはWebhookからSlackにPostさせるようなスクリプトを作成することにした。
Pythonであればライブラリもあるので、Python(Python3)で作成する。
以下、コード。Webhookのトコのurlは事前に自分のワークスペースで取得しておくこと。

Sponsored Links

● 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するだけならこんなのでもいいかな。

Pocket

Written by blacknon

インフラエンジニア(…のつもり)。 仕事で使うならクライアントはWindowsよりはUNIXの方が好き。 大体いつも眠い。

Leave a Comment

メールアドレスが公開されることはありません。

*