2

メッセージに「メールボックスがいっぱい」が含まれている場合にメッセージを再送信するトリガーを作成することにより、「メールボックスがいっぱい」に基づいてバウンスするメールの問題を解決しようとしています。

私が直面している問題は、再送の回数を3回に制限する必要があるということです。私が今持っているものは、バウンスされた電子メールが受信されるとすぐに電子メールを再送信し続けます。

私の引き金は

trigger trgBouncedEmails on EmailMessage (after insert) {

  for(EmailMessage myEmail: trigger.New) {


    //mail box full bounced email 
    if (myEmail.HtmlBody.contains('full'))
    {

        Case[] parentCase = [Select c.Id from Case c where c.Id =: myEmail.ParentId];


         if (myEmail.Subject.contains('Financial Review'))
                parentCase[0].Resend_Email_Send__c = true;  // this will trigger a workflow to send the email again.

          Update parentCase;
              }
      }
}

再送信を制限するにはどうすればよいですか?「parentCaseの更新」を実行する前に待機時間を設定する方法はありますか?

私にはさまざまな種類の電子メールがあり、それぞれに異なるテンプレートと異なる目的があることを知っているので、この問題を解決するためのより良い方法はありますか?

編集 システムは、24時間の頻度で3回自動的に電子メールを再送信し、24時間後に再送信を停止する必要があります。私のトリガーは無期限に再送信し続け、8時間に1回のように、24時間に3回しか送信できないように待機する方法を見つけようとしています。

4

3 に答える 3

2

@grigriforceは私を打ち負かしました-単純なブール値ではなく、フィールドを使用して再試行回数をカウントすることもお勧めします。これは、投稿したものと本質的に同じロジックを持つ「バルク化された」トリガーです。

trigger trgBouncedEmails on EmailMessage (after insert) {
    List<Id> parentCaseIds = new List<Id>();
    for ( EmailMessage myEmail : trigger.New ) {
        // mail box full bounced email for Financial Review emails
        if ( myEmail.HtmlBody.contains('full') && myEmail.Subject.contains('Financial Review') )
            parentCaseIds.add(myEmail.ParentId);
    }
    Case[] parentCases = [select c.Id from Case c where c.Id in :parentCaseIds];
    for ( Case c : parentCases ) {
        c.Resend_Email_Count__c += 1;  // this will trigger workflow to send the email again
        c.Resend_Email_Time__c = System.now();  // keep track of when it was last retried
    }
    update parentCases;
}

電子メールを24時間にわたって均等に送信するように更新します。

ワークフローを作り直して、Resend_Email_Time__c最後に設定されてから8時間経過していることを確認してから、Apexジョブを1時間ごとに実行するようにスケジュールして、メールの再送が必要な適格なケースをピックアップし、ワークフローが確実に行われるように更新を呼び出します。発砲せずに長すぎないでください:

global class ResendCaseEmails implements Schedulable {
    global void execute(SchedulableContext sc) {
        Contact[] cs = [select id, Resend_Email_Count__c, Resend_Email_Time__c from Contact where Resend_Email_Count__c < 4];
        List<Contact> ups = new List<Contact>();
        for ( Contact c : cs ) {
            if ( c.Resend_Email_Time__c != null && c.Resend_Email_Time__c.addHours(8) < System.now() )
                ups.add(c);
        }
        update ups;
    }
}

** Schedulableを実装するクラスにこのコードを含めることはベストプラクティスではないことに注意してください。このコードは、理想的には、クラスによって呼び出される別のResendCaseEmailsクラスにあります。

開発者コンソールから次のコードを呼び出すことにより、このジョブを1時間に1回実行するようにスケジュールできます。

ResendCaseEmails sched = new ResendCaseEmails();
String cron = '0 0 * * * ?';
System.schedule('Resend Case Email Job', cron, sched);
于 2012-07-26T15:03:05.163 に答える
1

ケースの再送信ブール値を送信試行の整数カウントに変更し、そのカウントが3未満の場合にのみワークフロールールを再送信することができます。

Case[] parentCase = [Select c.Id, c.Resend_Email_Count__c from Case c where c.Id =: myEmail.ParentId];
if (myEmail.Subject.contains('Financial Review'))
            parentCase[0].Resend_Email_Count__c += 1;  // this will trigger a workflow to send the email again.

      Update parentCase;

また、問題を表示するためにトリガーを簡略化したと思いますが、そうでない場合は、実際にそれをまとめる必要があります。

于 2012-07-26T14:51:59.530 に答える
0

だから、これがあなたが起こりたいことです(私が間違っているなら私を訂正してください)。メールを送信し、返送された場合は8時間ごとにメールを再送信します。再送信の数は最大3つである必要があります。

このシナリオでは、トリガーのみを使用するわけではありません。代わりに、トリガー、スケジューラー、および場合によってはカスタムテーブルを使用して、バウンスされた電子メールを追跡するソリューションを設計します。

このテーブル/オブジェクトを「バウンスメールトラッカー」と呼びましょう。次の3つのフィールドがあります。

  1. 電子メール名(電子メールのいくつかの一意の説明)
  2. 電子メールのステータス(送信済み、バウンス済み、再送信済み、失敗)
  3. 再送数
  4. メールのタイムスタンプを送信

メールが送信された場合は、ステータスが「送信済み」に設定されたトリガーと「送信済みメール」を使用してこのテーブルにエントリを作成します。メールが返送された場合、別のトリガーによってテーブルのエントリが「更新」されます。レコードのステータスを「バウンス」に変更します。

スケジューラーが定期的に実行され、ステータスが「バウンス」に等しいこの新しいテーブルからすべてのレコードを取得し、「送信済み電子メールタイムスタンプ」の値を使用して電子メールが最後に送信された時刻を確認します。送信時間に応じて以下のアクションを実行し、カウントを再送します。

  • 再送信回数が3未満で、最後の電子メールが8時間以上前に送信された場合は、スケジューラーから別の電子メールを送信します。レコードのステータスを「送信済み」に変更します。
  • 再送信回数が3を超え、ステータスが「バウンス」の場合は、ステータスを「失敗」に変更してください。
  • 再送数が3未満で、最後のメールが8時間以内に送信された場合は、何もしないでください。

これは大変な労力であり、おそらくもっと考える必要があると思いますが、これにより、返送された電子メールを追跡して再送信するための堅牢なフレームワークが提供されます。お役に立てれば!

Anup

于 2012-07-27T11:29:56.033 に答える