mail_parseが特定のメールで異常終了する
いつもお世話になっております。
メール受信をトリガーにしてジョブフローを実行する - Kompiraシリーズ 製品情報
上記を参考にエラー検知システムからのメールを自動で処理するようにメールチャネルと受信ジョブを作成しました。
通常のメールは受信後処理できるのですが、メール本文に画像が埋め込まれたメールを受信すると受信ジョブが異常終了します。ジョブ結果を見てもエラーの具体的な情報が載っておらずジョブステータスが異常終了となっています。
送信されてくるメール側をカスタマイズできないのでEnterprise側の処理で解決したいので、方法ございましたらご教授お願い致します。
-
ご連絡ありがとうございます。
下記取得した情報になりますので、調査いただけますと幸いです。・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--"
-
ジョブフローやデータの共有ありがとうございます。
添付していただいたジョブフローはログに残っている「/本番利用/受信ジョブ」で合っていますでしょうか?
ログでは「/本番利用/受信ジョブ」の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 も表示するようにしてみましたので、一度こちらのジョブを実行して添付ファイル付きメールを受信させて、どのような動作になるのか確認してみていただけますでしょうか。
-
ご連絡遅くなり申し訳ありません。
ジョブフロー名に関しては内部情報が含まれていたので、可変しておりました。混乱させてしまいすみません。
また、受信ジョブのご指摘ありがとうございました。
添付ファイル付きメールを受信したのでジョブを確認したところ、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無理を言って申し訳ありませんが、ご教授いただけますでしょうか。
-
「メール処理ジョブ」のご提供ありがとうございます。
これをみて気が付いた点がございます。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つめのパートが添付ファイルである想定でファイル名を表示しています。しかし、これは送信されたメールの構造に依存しますので、実用に際しては構造の判定やチェックなどの処理を追加してください。
参考になさってみてください。
サインインしてコメントを残してください。
コメント
6件のコメント