mail_parseが特定のメールで異常終了する

コメント

6件のコメント

  • Ichiro Takahashi

    フィックスポイントの高橋です。

    サーバ上のログファイル /var/log/kompira/kompirad.log に、ジョブフローが異常終了した時刻付近になんらかのエラーなどが記録されていないでしょうか?周辺を含むログを共有いただけますと、なにか分かることがあるかもしれません。

    また、具体的なジョブフローやエラーになったメールのヘッダなどを含む全文を共有いただけると、こちらでも再現調査できるかと思います。

    0
    コメントアクション パーマリンク
  • 鎮守満隆

    ご連絡ありがとうございます。
    下記取得した情報になりますので、調査いただけますと幸いです。

    ・kompira.log

    [2024-02-06 09:05:30,625:41284:kompirad:EngineServer] INFO: [EngineServer] execute jobflow "/本番利用/受信ジョブ" by user "root"
    [2024-02-06 09:05:30,665:41284:kompirad:EngineServer] INFO: Process(42750).start: started /本番利用/受信ジョブ (execute by user "root")
    [2024-02-06 09:05:31,709:41284:kompirad:ThreadPoolExecutor-1_6] INFO: [MailChannel] /本番利用/受信チャネル: called polling (interval=1 min)
    [2024-02-06 09:05:31,744:41284:kompirad:ThreadPoolExecutor-1_6] INFO: [MailChannel] /本番利用/受信チャネル: [pop3] start to fetch mail: ['203.179.225.18', 110], timeout=None
    [2024-02-06 09:05:31,801:41284:kompirad:ThreadPoolExecutor-1_6] INFO: [MailChannel] /本番利用/受信チャネル: [pop3] login 'dca-test-tier': b'+OK Logged in.'
    [2024-02-06 09:05:31,815:41284:kompirad:ThreadPoolExecutor-1_6] INFO: [MailChannel] /本番利用/受信チャネル: [pop3] list: b'+OK 1 messages:'
    [2024-02-06 09:05:31,834:41284:kompirad:ThreadPoolExecutor-1_6] INFO: [MailChannel] /本番利用/受信チャネル: [pop3] fetched mail 1: b'+OK 27030 octets'
    [2024-02-06 09:05:31,925:41284:kompirad:ThreadPoolExecutor-1_6] INFO: [MailChannel] /本番利用/受信チャネル: [pop3] finished to fetch mail: ['203.179.225.18', 110]
    [2024-02-06 09:05:31,934:41284:kompirad:MainThread] INFO: JobflowRuntime(42750).abort: aborted at line 1 in /本番利用/受信ジ
    ョブ: アサーション失敗: status code is non 0
    [2024-02-06 09:05:31,938:41284:kompirad:MainThread] INFO: Process(42750).abort: finished /本番利用/受信ジョブ [ABORTED] elapsed=0:00:01.273173
    [2024-02-06 09:05:31,969:41284:kompirad:MainThread] INFO: JobflowRuntime(42750).finish: process stats: cputime=0:00:00.147096, latency=0:00:00.001677, dispatch=2, preempt=0, interrupt=0
    ・ジョブフロー
     
    { while(true) |

        { try |  

            print("メール受信待機中") ->

            <./受信チャネル>->

            print("メール処理開始")->

            [mail_data = mail_parse($RESULT)] -> 

            { fork | detach() -> [./メール処理ジョブ:mail_data]}->

        { if $STATUS != 0 |

          then: print("受信処理中にエラーが発生しました。次のメール待ちです")

           else: print("受信処理が正常に完了しました。次のメール待ちです")

        }

        }

    }

    ・ジョブフロー実行時のResult(28509文字)
     ※内部情報は■に変換しております
     ※inlineの画像文字列が長すぎるため省略しております

    "Return-Path: <■>\\r\\nX-Original-To: ■@■\\r\\nDelivered-To: ■@■\\r\\nReceived: from smtp-relay■ (smtp-relay■ [■])\\r\\n\\tby ■メールサーバ■ (Postfix) with ESMTP id 3C5B2206ACCE\\r\\n\\tfor <■@■>; Mon,  5 Feb 2024 20:01:22 +0900 (JST)\\r\\nReceived: from ■ (unknown [■IPアドレス■])\\r\\n\\tby smtp-relay-i-■ (Postfix) with ESMTP id 3F3448776C9;\\r\\n\\tMon,  5 Feb 2024 03:01:21 -0800 (PST)\\r\\nDKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=■;\\r\\n\\ts=lmprod20240118; t=1707130881;\\r\\n\\th=from:from:reply-to:subject:subject:date:date:message-id:message-id:\\r\\n\\t to:to:cc:mime-version:mime-version:content-type:content-type;\\r\\n\\tbh=Fg0blCqmGbg/OA+qF5Bdw2LAzT7HayG72Ye3+uMjWbc=;\\r\\n\\tb=eR5I4z0hC+w2EG0JBHYEqWJMJU/ma4f6xLghC3Kigv3J4iI9nzaifrZfYBxX49Z9iIu0WC\\r\\n\\tVg+xR6fWkqEmOsj/VooZRWc+KVpTeiwbCpy7ynfKwocu5txpLFheH0hGIDpwU59TQw4PuE\\r\\n\\teumVlZlPxG/UA0+HgsjTNt8yLxQfJ9wm8mfgfXGKCXF5h2A7dDe8yk0ByoyoXqTv9DmELz\\r\\n\\t+ffqT6Ki+F/d9aaxSmEdNS1iHapNOr1wPJzWwvXeCNHijhGYk3vXWSTOYPtAnON1V1sOat\\r\\n\\t4Fa352PMlULXKNePQBdJVybERuQjxtNNKjPOmXi7kngCr9E3hjai+eQX0HaAqA==\\r\\nReceived: from deliverycenter-5b6757d9f6-s4p6z (localhost [127.0.0.1])\\r\\n\\tby deliverycenter.logicmonitor.net (Postfix) with ESMTP id 32595410386B;\\r\\n\\tMon,  5 Feb 2024 11:01:21 +0000 (UTC)\\r\\nFrom:■@■\\r\\nTo: ■@■, \\r\\n\\t■@■, \\r\\n\\t■@■\\r\\nMessage-ID: <2131451469.37474.1707130881205.JavaMail.root@deliverycenter-5b6757d9f6-s4p6z>\\r\\nSubject: LMD1275097 ***CLEARED***warn Standard Configs (SSH\\r\\n Interactive)-Show Check\\r\\nMIME-Version: 1.0\\r\\nContent-Type: multipart/related; \\r\\n\\tboundary=\"----=_Part_37473_2045127345.1707130881204\"\\r\\nDate: Mon,  5 Feb 2024 11:01:21 +0000 (UTC)\\r\\n\\r\\n------=_Part_37473_2045127345.1707130881204\\r\\nContent-Type: text/html; charset=utf-8\\r\\nContent-Transfer-Encoding: 7bit\\r\\n\\r\\n<!doctype html><html><b>Host: </b>ISFW0001<br><b>Configsource: </b>Standard Configs (SSH Interactive)-Show<br><b>InstanceGroup: </b>@default<br><b>Configcheck: </b>Check<br></b><br><b>Level: </b>warn<br><b>Start: </b>2024-02-05 19:41:17 JST<br><b>Duration: </b>0h 19m<br><b>Clear Reason: </b>No new configuration changes detected<br><br><b>Graphs:</b><br><img style=\\'width: 600px; height: 400px;\\' src=\\'cid:my-image-id\\'></body></html>\\r\\n------=_Part_37473_2045127345.1707130881204\\r\\nContent-Type: image/png; \\r\\n\\tname=alertGraph_16c83bcb-01de-4c76-979b-63dc237abaad.png\\r\\nContent-Transfer-Encoding: base64\\r\\nContent-ID: <my-image-id>\\r\\nContent-Disposition: inline; \\r\\n\\tfilename=alertGraph_16c83bcb-01de-4c76-979b-63dc237abaad.png\\r\\n\\r\\niVBORw0KGgoAAAANSUhEUgAAA4QAAAJYCAYAAAA6xSjbAABElklEQVR4Xu3dB5glZYHv//s8/713\\r\\nc7p38+quyuq6q67umvO6rllXdw0YAAmSUVARURRFkSgiWUBBUCRLTiIgSUREQLIEAclBkjDk+vOr\\r\\nsZrq4nT3eXtmmOl3Pp/nqWemT5rTp09N1/e8VW/9rwYAAICl0v8aXgAAAMDSQRACAAAspQQhAADA\\r\\nUkoQAgAALKUEIQAAwFJKEAIAACylBCEAAMBSShACAAAspQQhAADAUmrsIPz//vYDFovFYrFYLBaL\\r\\nxWKZA8u4ioIQAACAJVtJuwlCAACAipS0myAEAACoSEm7CUIAAICKlLSbIAQAAKhISbsJQgAAgIqU\\r\\ne97ThmFmG81IYGevvfZq3vrWt7azjGbimQRk9IPw6quvbl70ohc1G2644cT9AGBRKWk3QQgAAFCR\\r\\nknYThAAAABUpaTdBCAAAUJGSdhOEAAAAFSlpN0EIAABQkZJ2E4QAAAAVKWk3QQgAAFCRknYThAAA\\r\\nABUpaTdBCAAAUJGSdhOEAAAAFSlpN0EIAABQkZJ2E4QAAAAVKWk3QQgAAFCRknYThAAAABUpaTdB\\r\\nCAAAUJGSdhOEAAAAFSlpN0EIAABQkZJ2E4QAAAAVKWk3QQgAAFCRknYThAAAABUpaTdBCAAAUJGS\\r\\ndhOEAAAAFSlpt6IgtFgsFovFYrFYLBbLkr+Ma+wgBAAAoC6CEAAAYCklCAEAAJZSghAAAGApJQgB\\r\\nAACWUoIQAABgKSUIAQAAllKCEAAAYCklCAEAAJZSghAAAGAp9f8DUN1cWjsbY3AAAAAASUVORK5C\\r\\nYII=\\r\\n------=_Part_37473_2045127345.1707130881204--"

    0
    コメントアクション パーマリンク
  • Ichiro Takahashi

    ジョブフローやデータの共有ありがとうございます。

    添付していただいたジョブフローはログに残っている「/本番利用/受信ジョブ」で合っていますでしょうか?

    ログでは「/本番利用/受信ジョブ」の1行目で異常終了していることになっておりますが、しかし、添付いただいたジョブフローの1行目では異常終了する要素が見当たらず、現状では理解に苦しんでいるところです。

    ただ、メールチャネルでのメール受信は行われているようですので、その後の動きも気になるところです。

    お手数ですが、以下についても共有いただけますでしょうか。

    • ご利用中の Kompira のバージョン
    • サーバ上の /var/log/kompira/process.log
    • ジョブフロー「メール処理ジョブ」の内容

    また、提示いただいたジョブフローについて、{ if $STATUS != 0 | ... } でエラー判定されようとしているのだと思いますが、このコードでは直前の { fork | ... } ブロックの成否を判定していることになります。

    おそらく、意図としては { try | ... } ブロックの成否を判定されたいのかと思います。そうであるならば、例えば以下のように、{ try | ... } ブロックの後に => 結合子で { if $STATUS != 0 | ... } とエラー判定を続けるようにしていただくとよいかもしれません。

    { while true |
        { try |  
            print("メール受信待機中") ->
            <./受信チャネル>->
            print("メール処理開始")->
            [mail_data = mail_parse($RESULT)] -> 
            { fork | detach() -> [./メール処理ジョブ:mail_data]}
        } =>
        { if $STATUS != 0 |
           then: print("受信処理中にエラーが発生しました。次のメール待ちです", $ERROR)
           else: print("受信処理が正常に完了しました。次のメール待ちです")
        }
    }

    このジョブフローでは、エラー時に $ERROR も表示するようにしてみましたので、一度こちらのジョブを実行して添付ファイル付きメールを受信させて、どのような動作になるのか確認してみていただけますでしょうか。

    0
    コメントアクション パーマリンク
  • 鎮守満隆

    ご連絡遅くなり申し訳ありません。

    ジョブフロー名に関しては内部情報が含まれていたので、可変しておりました。混乱させてしまいすみません。

    また、受信ジョブのご指摘ありがとうございました。

     

    添付ファイル付きメールを受信したのでジョブを確認したところ、pail_perse自体は問題なく通過しておりBodyを処理しようとした際に異常終了していました。

    ./メール処理ジョブ
    |mail_data=""|
    [kenmei = mail_data['Subject']] =>
    [raw_body = mail_data['Body']]=>
    [splited_body= raw_body.split("Start: ")] ->  ※この行が異常終了

    メールのBodyに"Start:"が必ず含まれるので、そこでメール本文を分割しようとしており通常のテキストメールは処理できています。

    異常終了するメール本文はHTML形式で届いていました。

    下記ログが検知した内容なのですが、原因がよくわかりません。

    "[{'Content-Type': 'text/html; charset=utf-8', 
    'Content-Transfer-Encoding': '7bit',
    'Is-Multipart': False,
    'Body': "<!doctype html><html><b>ID: </b>LMD1275097<br>Please click the following URL to acknowledge the alert (or paste it to the browser)<br>https://monitor.com/santaba/uiv4/alert#detail~id=LMD1275097&type=alert<br><br><b>Host: </b>ISFW0001<br><b>Configsource: </b>Standard Configs (SSH Interactive)-Show<br><b>InstanceGroup: </b>@default<br><b>Configcheck: </b>Check<br></b><br><b>Level: </b>warn<br><b>Start: </b>2024-02-14 15:41:22 JST<br><b>Duration: </b>0h 0m<br><b>Reason: </b>A change was made to the configuration file\r\n<br>\r\n<br><b>Alert Rule: </b> This alert matches the rule ConfigDiffCheck_Alert<br><b>Recipients: </b>Alert now is going to stage 1 recipients:  alert\r\n<br>\r\n<br>You may reply to this alert with these commands:<br>  - ACK (comment) - acknowledge alert<br>  - NEXT - escalate to next contact<br>  - SDT X - schedule downtime for this alert on this host for X hours.<br>  - SDT datasource X - SDT for all instances of the datasource on this host for X hours<br>  - SDT host X - SDT for entire host for X hours<br><br><b>Graphs:</b><br><img style='width: 600px; height: 400px;' src='cid:my-image-id'></body></html>",
    'Filename': None},
    {'Content-Type': 'image/png; \r\n\tname=alertGraph_4765bdc1-fcca-488a-bf81-641fe7c7985c.png',
    'Content-Transfer-Encoding': 'base64',
    'Content-ID': '<my-image-id>',
    'Content-Disposition': 'inline; \r\n\tfilename=alertGraph_4765bdc1-fcca-488a-bf81-641fe7c7985c.png',
    'Is-Multipart': False,
    'Body': b'\x89PNG\<<ここから画像データ>>0\x00IEND\xaeB`\x82',
    'Filename': 'alertGraph_4765bdc1-fcca-488a-bf81-641fe7c7985c.png'}]":
    list indices must be integers or slices, not str

    無理を言って申し訳ありませんが、ご教授いただけますでしょうか。

    0
    コメントアクション パーマリンク
  • Ichiro Takahashi

    「メール処理ジョブ」のご提供ありがとうございます。

    これをみて気が付いた点がございます。mail_parse() は受信したメールを解析して、件名や本文などを辞書要素に分解しますが、マルチパートメールの場合は注意が必要になります。

    マルチパートメールを mail_parse() でパースすると、Is-Multipart と Body の要素が以下のようになります。

    • Is-Multipart 要素:  True
    • Body 要素: 各パート(HTML部や添付ファイル部)を解析した辞書の配列

    ようするに、mail_parse() した結果が入れ子構造になって Body に格納されます。

    [raw_body = mail_data['Body']]=>

    よって、マルチパートメールでは raw_body は配列になっており、これを split() しようとしてエラーになっている可能性が高いです。(マルチパートメールでない場合は、raw_body は配列ではなく本文のテキストのため split() できます)

    受信するメールが、シングルパート・マルチパートのいずれも有りえる場合は、例えば以下のように Is-Multipart 要素で解析処理を分岐する必要があります。

    |mail_data|
    [kenmei = mail_data['Subject']] =>
    [raw_body = mail_data['Body']]=>
    { if mail_data['Is-Multipart'] |
    then:
        print("受信したメールはマルチパートです") ->
        print("添付ファイル名:", mail_data['Body'][1]['Filename'])    
    else:
        print("受信したメールはシングルパートです") ->
        [splited_body= raw_body.split("Start: ")] ->
        print("splited_body: ", splited_body)
    }

    ※ このサンプルではマルチパートの場合に、2つめのパートが添付ファイルである想定でファイル名を表示しています。しかし、これは送信されたメールの構造に依存しますので、実用に際しては構造の判定やチェックなどの処理を追加してください。

    参考になさってみてください。

    0
    コメントアクション パーマリンク
  • 鎮守満隆

    ご回答ありがとうございます。

    ご教示いただきましたMultipartの構成をもとに実装することができました。

    取得したかったメールの本文は"mail_data['Body'][0]['Body']"で確認することができました。

    エラーの調査方法についても大変勉強になりました。ありがとうございます。

    今後ともよろしくお願いいたします。

    0
    コメントアクション パーマリンク

サインインしてコメントを残してください。