【问题标题】:Bounce email handling mailbox full using salesforce triggers使用 Salesforce 触发器退回电子邮件处理邮箱已满
【发布时间】:2012-07-26 14:43:46
【问题描述】:

我正在尝试通过创建一个触发器来解决基于“邮箱已满”的退回电子邮件问题,如果邮件包含“邮箱已满”,则该触发器会重新发送邮件。

我面临的问题是我需要将重发次数限制为 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 小时后停止重发。我的触发器无限期地重新发送,我正在尝试寻找一种方法来等待,这样它只能在 24 小时内发送 3 次,比如每 8 小时一次。

【问题讨论】:

    标签: salesforce


    【解决方案1】:

    @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 作业每小时运行一次,以获取需要重新发送电子邮件的符合条件的案例,并调用更新它们确保工作流程不会持续太久而不触发:

    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 类调用的类中。

    您可以通过从开发人员控制台调用此代码来安排此作业每小时运行一次:

    ResendCaseEmails sched = new ResendCaseEmails();
    String cron = '0 0 * * * ?';
    System.schedule('Resend Case Email Job', cron, sched);
    

    【讨论】:

    • 很抱歉我没有在我的问题中包含这个,但我需要以 24 小时的频率重新发送 3 次,您知道如何跟踪吗?>
    • @raym0nd 问题是您无法保证 3 次重试在最初的 24 小时内,或者您希望它在随后的每个 24 小时内再尝试 3 次,直到收到成功了吗?
    • 问题是上面的代码一直在无限期地尝试直到收到消息,我要做的是让它在 24 小时内只尝试 3 次然后停止重新发送。跨度>
    • @raym0nd 这就是为什么您要使用一个数字字段,例如我在上面引用的Resend_Email_Count__c。然后,仅当此字段的值小于 4 时才会触发您发送电子邮件的工作流。在发送初始电子邮件以及随后的三个失败后,工作流将停止触发。在这种情况下,您还需要添加一些逻辑,以便在成功接收电子邮件后将 Resend_Email_Count__c 字段设置为 4。
    • @raym0nd 为此,您需要一个额外的字段来跟踪上次尝试发送电子邮件的时间,例如Resend_Email_Time__c。您可能希望一个简单的批处理 Apex 脚本每小时运行一次并挑选出符合条件的案例记录(过去的 Resend_Email_Count__c 值小于 4 和 Resend_Email_Time__c 大于 8 小时),然后进行更新以再次启动工作流程。
    【解决方案2】:

    您可以简单地将案例上的重新发送布尔值更改为发送尝试的整数计数,并仅在该计数小于 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;
    

    另外,我假设您简化了触发器以显示问题,但如果不是,您确实需要扩大它。

    【讨论】:

    • 对不起,我的问题中没有包含这个,但我需要以 24 小时的频率重新发送 3 次!
    【解决方案3】:

    所以,这就是您希望发生的事情(如果我错了,请随时纠正我)。您发送一封电子邮件,如果它被退回,您希望每 8 小时重新发送一封电子邮件。重发次数最多应为 3 次。

    在这种情况下,我不会只使用触发器。相反,我会设计一个解决方案,使用触发器、调度程序,也许还有一个自定义表格来跟踪退回的电子邮件。

    让我们将此表/对象称为“退回电子邮件跟踪器”。它将具有以下 3 个字段:

    1. 电子邮件名称(电子邮件的一些独特描述)
    2. 电子邮件状态(已发送、退回、重新发送、失败)
    3. 重发次数
    4. 已发送电子邮件时间戳

    如果发送电子邮件,您将在此表中使用状态设置为“已发送”和“已发送电子邮件”的触发器在此表中创建一个条目。如果电子邮件退回,另一个触发器将“更新”该条目该表将记录的状态更改为“已退回”。

    调度程序将定期运行,它将从该新表中检索状态等于“退回”的所有记录,并使用“已发送电子邮件时间戳”中的值检查上次发送电子邮件的时间。它将根据发送的时间和重新发送计数执行以下操作。

    • 如果重新发送计数小于 3,并且如果最后一封电子邮件发送时间超过或等于 8 小时前,请从调度程序发送另一封电子邮件。将记录的状态更改为“已发送”。
    • 如果重发次数超过 3,且状态为“已退回”,则将状态更改为“失败”。
    • 如果重发次数少于 3,但最后一封电子邮件的发送时间少于 8 小时,则不要执行任何操作。

    我知道这需要付出很多努力,而且我相信它可能需要更多的思考,但这将提供一个强大的框架来跟踪和重新发送退回的电子邮件。 希望这会有所帮助!

    阿努普

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-03
      • 2021-11-13
      • 2011-03-24
      • 2011-05-24
      • 1970-01-01
      • 2019-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多