Kompira

Menu Menu

Enterprise Technical information

外部との連携 メール受信をトリガーにしてジョブフローを実行する

運用の現場では 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

 

メールチャネルの作成

「メールチャネル」はジョブフローと同様に、管理画面から作成します。この際に型指定のプルダウンでは「メールチャネル」を指定します。ここでは「mchan」という名前で作成します。

 

メールチャネル

 

次のようなメールチャネルの設定画面が表示されます。

 

 

フィールド 説明
サーバ名 IMAP/POP3 サーバをホスト名か IP アドレスで指定
プロトコル メール受信のプロトコルとして IMAP/POP3 のいずれかを指定
SSL SSL による通信を行う場合に有効化します。
ポート番号 受信のポート番号を指定します。指定が無い場合にはデフォルトのポートが使用されます。
メールボックス 受信するメールボックスを設定します。デフォルトは “INBOX” です。POP3 プロトコルの場合、メールボックスの設定は無視されます。

※ 日本語のメールボックス名を設定することはできません。

ユーザ名 メールサーバのユーザ名を指定
パスワード メールサーバのパスワードを指定
受信チェック間隔 新着メッセージを確認する間隔を分単位で指定します。デフォルトは10分で、0を指定するとデフォルト値が指定されます。負の値を指定した場合は新着メッセージの確認を行いません。
受信タイムアウト IMAP4/POP3 サーバに対して受信タイムアウトを秒単位で指定します。 空、もしくは、0や負の値を設定すると、受信時にタイムアウトしません。
無効 メールサーバへの接続を無効にします
ログサイズ ログの最大サイズを指定。最大サイズを超えた場合には古いメッセージから削除されます。(ログはメールチャネル画面の ”ログ” タブで閲覧可)

 

メールを受信するジョブフローの作成

作成したメールチャネル “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 subject == "DOWN" |
  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 subject == "DOWN" | 
          then: 
            print("DOWN を検知しました") -> 
            [./プロセス再起動]
          else: 
            print("処理対象外メールです")
        } 
    } =>
    { if $STATUS != 0 | 
      then: print("受信処理中にエラーが発生しました。次のメール待ちです") 
      else: print("受信処理が正常に完了しました。次のメール待ちです")
    } 
  }

 

このジョブフローを実行して、メールを指定のアドレスに送信すると、以下のような結果となります。このジョブフローは無限ループとしているので、停止させる場合は手動で「中止」ボタンをクリックする必要があります。(プロセスが実行中であるかどうかは Kompira Enterprise 画面上部の「プロセス一覧」メニューで確認することができます。)

 

 

メールチャネルを利用する際、ポーリング処理でメールを取り込んだ後は、メールサーバ上から該当のメールが削除されることに注意してください。今回の記事で紹介したようなメール連携を行う場合、連携処理専用のアカウントをメールサーバに作成し、そのアドレスに対してメールを送信することを推奨しています。

スタートガイド

Kompiraジョブフローの基礎

ジョブフローの簡単な例

Kompiraの機能

外部との連携