はじめに
CSMの開発PJで、開発環境でメール通知のテストを実施していたところ、送信箱(sys_emailテーブル)にあるいくつかのメールのステータスが "Ignored"(無視)となる事象が発生しました。
本稿では、この "Ignored" の謎についてチームで調査した結果を残しておきます。
調査していたインスタンスでは メールの送信設定をOFF(実際のメールが送信されない設定)にしているため、メールが正しく送信されたかの確認は、インスタンス内の送信箱から確認します。
【前提知識 - 各ステータスの意味】
Ready:送信準備完了(=送信され待ち状態)
Error:エラー
Ignored:メール送信が無視される(=送信されない)
Processed:送信完了
事象
1つのレコードに対して、複数の操作を実行します。
例:インシデントへのコメント追加・ソリューション提案の更新
すると、操作が実行されたタイミングでそれぞれのメールが送信箱に生成されていますが、
生成されたほぼすべてのメールのステータスが、 "Ignored" になりました。
また、操作の中で最後に送信されたソリューション提案通知メールのみ、ステータスが "Ready" になっています。
メールが "Ignored" ステータスとなる仕組み
「SMTP Sender」というOOTBのスケジュールジョブによって、ステータスが "Ignored" になっていることが判明しました。
→「SMTP Sender」は2 分ごとに実行されるようにスケジュールされたジョブで、インスタンス上に保持されているすべての送信準備完了(ステータス=Ready)メールを送信する(ステータス=Processedにする)役割を果たします。
すべての送信準備完了メールがインスタンスから消去されるまで、実行は継続されます。
そこで、優先度の比較によって送信されない判断をされたメールが、ステータスが "Ignored" に更新されます。
※メールの優先度は通知(sysevent_email_action)テーブルのweightの値で定義されます。
メールが実際に送信されるまでの流れはこんな感じ↓
① イベント実行
イベントがトリガーされる(例: コメントが追加される)
② メール生成
weightに関係なく、通知条件が満たされる かつ 有効な受信者が存在する場合、送信箱(sys_emailテーブル)にメールが生成される。
この時点でステータスは "Ready"
③ スケジュールジョブ実行
ステータスが "Ready" かつ メールの'Recipient' と 'Target' がまったく同じである場合、最もweightの値が大きいメールと、weight=0 のメールのみが実際に送信される。
送信されたメールは、ステータスが "Processed" に更新される
残りのメールは、ステータスが "Ignored" に更新される
※同じ通知の場合は、作成日時が新しいほうが送信される
※メールの送信設定がOFFの場合はメールが送信できないため、"Ready"から更新なし
よって、インスタンスのメール送信設定をOFFにしていることにより、
ステータスが "Ready" のメールが滞留するため、複数のメールで③の比較がされて "Ignored" のメールが存在していた、ということでした。
メール送信設定をONにしている場合は、
③で各メールのステータスが順次 "Processed" に更新されるため、"Ready" でメールが滞留することは稀です。
そのため、本事象は発生しないと思われます。
おわりに
前述の通り、メール送信設定がONの環境では、通常このような事象は発生しません。
ですが、弊社と同じように開発・テスト中のメール誤送信防止のため、インスタンスのメール送信設定をOFFにしている方も多いと思いますので、頭の片隅に入れておくと良いかと思います。
参考記事