運用の現場では Slack のようなメッセンジャーアプリが利用されてきていますが、メールによる通知もまだまだ多いと思います。具体的には、システム側での cron による処理結果や監視ツールからのレポートなどがメールで通知されてくるケースがあります。今回は Kompira Enterprise がメールサーバよりメールを受信し、その内容によってメンテナンス処理を実行する方法をご紹介します。
ここでは、メールサーバより IMAP4/POP3 プロトコルを通じて、メールを取り込む「メールチャネル」を利用します。メールチャネルは設定されているメールサーバ ( IMAP4/POP3 サーバ ) をチェックし、メール受信をした場合にはそのメールを取得し、ジョブフローに渡します。
※メールチャネルはあらかじめ指定された時間間隔でメール受信のポーリング処理を行います。
動作確認環境
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.4.10.post10 |
OS | CentOS 6.10 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.5.5.post7 |
OS | CentOS 7.8.2003 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.6.2.post4 |
OS | CentOS 8.2.2004 |
または
ソフトウェア | バージョン |
---|---|
Kompira Enterprise | 1.6.8 |
OS | CentOS Stream 8 |
メールチャネルの作成
「メールチャネル」はジョブフローと同様に、管理画面から作成します。この際に型指定のプルダウンでは「メールチャネル」を指定します。ここでは「mchan」という名前で作成します。
次のようなメールチャネルの設定画面が表示されます。
※以下の画像は Kompira Enterprise バージョン 1.6.8 時点のものです。他のバージョンでは項目が異なることがあります
フィールド | 説明 |
---|---|
サーバ名 | IMAP/POP3 サーバをホスト名か IP アドレスで指定します |
プロトコル | メール受信のプロトコルとして IMAP4/POP3 のいずれかを指定します |
SSL | SSL による通信を行う場合にチェックします |
ポート番号 | 受信のポート番号を指定します (指定が無い場合にはデフォルトのポートが使用されます) |
ユーザ名 | メールサーバのユーザ名を指定します |
パスワード | メールサーバのパスワードを指定します |
接続タイムアウト | IMAP4/POP3 サーバに対して受信タイムアウトを秒単位で指定します。空、もしくは、0や負の値を設定すると、受信時にタイムアウトしません
※ Kompira Enterprise バージョン 1.6.6 以前は「受信タイムアウト」という名前のパラメータでしたが「接続タイムアウト」に変更されました |
OAuth2使用 | メールサーバへの認証に OAuth2 認証を使用する場合はチェックをつけます |
OAuth2プロバイダ | OAuth2 のサービスプロバイダ (OAuth2 プロバイダ型) を選択します |
メールボックス | 受信するメールボックスを設定します (デフォルトは “INBOX”)。POP3 プロトコルの場合、メールボックスの設定は無視されます
※ 日本語のメールボックス名を設定することはできません |
受信モード | メールを受信するときの動作を下記のいずれかから指定します
※ 「未読のメールを受信して既読にする」は POP3 プロトコルの場合は設定することはできません |
受信チェック間隔 |
新着メッセージを確認する間隔を分単位で指定します (デフォルトは10分)。0を指定するとデフォルトの値となります ※ 負の値を指定することはできません |
アクション種別 | メールを受信したときの動作を下記のいずれかから指定します
|
アクションターゲット | アクション種別が「アクションターゲットで指定したジョブフローを実行する」の場合のみ、実行するジョブフローを指定します。そのジョブフローは第一パラメータに受信したメールを渡して、メールチャネル (オブジェクト) の所有者をユーザとして実行されます
※ 指定するジョブフローは少なくともパラメータが1つは必要で、2つめ以降のパラメータがある場合はデフォルト値定義が必要です |
ログサイズ | ログの最大サイズを指定します。最大サイズを超えた場合には古いメッセージから削除されます (ログはメールチャネル画面の ”ログ” タブで閲覧可) |
無効 | メールサーバへの接続を無効にする場合はチェックをつけます |
メールを受信するジョブフローの作成①
作成したメールチャネル “mchan” をジョブフロー中で利用する際には、”<./mchan>” のように、<> で囲みます。受信したメッセージの内容は $RESULT に格納されます。
<./mchan> -> print("メールを受信しました") -> [raw_mail_text = $RESULT] -> print(raw_mail_text) -> print("メールを解析します") -> [mail_text = mail_parse(raw_mail_text)] -> print(mail_text) -> [from = mail_text['From']] -> print("$from からメールを受信しました")
メッセージの内容はヘッダー部分も本文部分も一緒になっているため、mail_parse() という組み込み関数を利用して、辞書型のデータに変換します。メールのヘッダー情報に加えて “Body” キーでメールの本文、”Filename” キーで添付ファイル名にアクセスできます。またメールの本文は Content-Type が Text/Plain で添付ファイルが無い場合に限り utf-8 形式にエンコードされます。Content-Type が multipart の場合は “Is-Multipart” キーが true になり、”Body” キーの要素が辞書オブジェクトの配列になります。
上記のジョブフローを一部修正して、メールの表題に “DOWN” が含まれていた場合には、指定のサーバーのプロセスを再起動するジョブフローを呼び出すようにしてみます。
print("メール受信待機中") -> <./mchan> -> [raw_mail_text = $RESULT] -> [mail_text = mail_parse(raw_mail_text)] -> [subject = mail_text['Subject']] -> # メールのタイトルに "DOWN" を含む場合には、サーバーのプロセス再起動を実施 { if "DOWN" in subject | then: print("DOWN を検知しました") -> [./プロセス再起動] else: print("処理対象外メールです") }
「プロセス再起動」は「ジョブフローから別のジョブフローを呼び出す」で作成したジョブフローをそのまま使いましたが、もちろん他の処理を記述していただいても構いません (関係者への通知、チケットシステムへの投稿、予備系への切り替えなど)。
ジョブフローの常駐化
上記で作成したジョブフローはメールを1通処理して終了となりますが、これを継続的に行なえるように変更してみましょう。
繰り返しの処理を指定するために while ブロックを使用し、あわせて何らかの原因で受信処理に異常が発生した場合でも全体が強制終了しないように、try ブロックを追加します。
{ while(true) | # 無限ループにする # ブロック内部の処理が正常に行われると $STATUS に0が挿入される { try | print("メール受信待機中") -> <./mchan> -> [raw_mail_text = $RESULT] -> [mail_text = mail_parse(raw_mail_text)] -> [subject = mail_text['Subject']] -> # メールのタイトルに "DOWN" を含む場合には、サーバーのプロセス再起動を実施 { if "DOWN" in subject | then: print("DOWN を検知しました") -> [./プロセス再起動] else: print("処理対象外メールです") } } => { if $STATUS != 0 | then: print("受信処理中にエラーが発生しました。次のメール待ちです") else: print("受信処理が正常に完了しました。次のメール待ちです") } }
このジョブフローを実行して、メールを指定のアドレスに送信すると、以下のような結果となります。なお、このジョブフローは無限ループにしているため停止させる場合は手動で「中止」ボタンをクリックする必要があります (プロセスが実行中であるかどうかは Kompira Enterprise 画面上部の「プロセス一覧」メニューで確認することができます)。
メールを受信するジョブフローの作成②
Kompira Enterprise のバージョンが 1.6.6 以降の場合かつメールチャネルのアクション種別が「アクションターゲットで指定したジョブフローを実行する」のとき、下記のようなジョブフローを作成し、メールチャネルのアクションターゲットに指定することで、同様の動作を行うことができます。
※この例ではメールチャネルに連動してジョブフローが実行されるため、無限ループを使用して繰り返し処理をさせる必要はありません
| raw_mail_text | # メールチャネルがメールを受信した際、その内容が渡される print("メールを受信しました") -> # ブロック内部の処理が正常に行われると $STATUS に0が挿入される { try | [mail_text = mail_parse(raw_mail_text)] -> [subject = mail_text['Subject']] -> # メールのタイトルに "DOWN" を含む場合には、サーバーのプロセス再起動を実施 { if "DOWN" in subject | then: print("DOWN を検知しました") -> [./プロセス再起動] else: print("処理対象外メールです") } } => { if $STATUS != 0 | then: print("受信処理中にエラーが発生しました") else: print("受信処理が正常に完了しました") }
メールを指定のアドレスに送信すると、以下のような結果となります (このジョブフローは無限ループではないため、処理が終了し次第「完了」となります)。
メールチャネルを利用する際、ポーリング処理でメールを取り込んだ後は、メールチャネルの設定によってはメールサーバ上から該当のメールが削除されることに注意してください。今回の記事で紹介したようなメール連携を行う場合は、連携処理専用のアカウントをメールサーバに作成し、そのアドレスに対してメールを送信することを推奨します。