使用salesforce触发器反弹电子邮件处理邮箱已满

使用salesforce触发器反弹电子邮件处理邮箱已满,salesforce,Salesforce,我试图通过创建一个触发器,在邮件包含“邮箱已满”时重新发送邮件,来解决基于“邮箱已满”的反弹邮件问题 我面临的问题是,我需要将重新发送的次数限制为3次。 我现在所拥有的东西是在收到一封被退回的电子邮件后立即重新发送电子邮件 我的扳机是 trigger trgBouncedEmails on EmailMessage (after insert) { for(EmailMessage myEmail: trigger.New) { //mail box full bounced

我试图通过创建一个触发器,在邮件包含“邮箱已满”时重新发送邮件,来解决基于“邮箱已满”的反弹邮件问题

我面临的问题是,我需要将重新发送的次数限制为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;
              }
      }
}
如何限制重新发送,在执行“Update parentCase”之前是否有办法设置等待时间

有没有更好的方法来解决这个问题,因为我知道我有不同类型的电子邮件,每一封都有不同的模板和不同的用途

编辑
系统应以24小时的频率自动重新发送电子邮件3次,24小时后停止重新发送。我的触发器一直在无限期地重新发送,我正试图找到一种方法来等待,这样它在24小时内只能发送3次,比如每8小时发送一次。

您只需将案例中的“重新发送”布尔值更改为发送尝试的整数计数,并在该计数小于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;

此外,我假设您简化了触发器以显示问题,但如果不是这样,您真的需要将其放大。

@grigriforce比我更准确-我还建议使用一个字段来计算重试次数,而不是一个简单的布尔值。这是一个“bulkified”触发器,其逻辑与您发布的触发器基本相同:

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;
}
**请注意,将此代码放在实现可调度的类中不是最佳做法-此代码最好放在另一个由
resendcasemails
类调用的类中

通过从开发人员控制台调用以下代码,可以计划此作业每小时运行一次:

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

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

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

让我们将此表/对象称为“反弹电子邮件跟踪器”。它将包含以下3个字段:

  • 电子邮件名称(电子邮件的一些独特描述)
  • 电子邮件状态(已发送、已跳转、重新发送、失败)
  • 重发计数
  • 发送电子邮件时间戳
  • 如果发送电子邮件,您将使用状态设置为“已发送”和“已发送电子邮件”的触发器在此表中创建一个条目。如果电子邮件反弹,另一个触发器将“更新”表中的条目,以将记录状态更改为“反弹”

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

    • 如果重新发送计数小于3,并且上一封电子邮件发送时间超过或等于8小时,请从计划程序发送另一封电子邮件。将记录的状态更改为“已发送”
    • 如果重新发送计数大于3,且状态为“已反弹”,则将状态更改为“失败”
    • 如果重发次数少于3次,但最后一封电子邮件发送时间不到8小时,请不要执行任何操作
    我知道这是一个很大的努力,我相信它可能需要更多的思考,但这将提供一个强大的框架来跟踪和重新发送被退回的电子邮件。 希望这有帮助


    Anup

    很抱歉,我的问题中没有包含此内容,但我需要以24小时的频率重新发送3次!很抱歉,我的问题中没有包含此内容,但我需要以24小时的频率重新发送3次,您知道如何跟踪吗?>@raym0nd是您无法保证3次重试的问题在最初的24小时内,或者您希望它在随后的每个24小时内再尝试3次,直到成功接收为止?问题是,上面的代码一直在无限期地尝试,直到收到消息为止,我要做的是使它在24小时内只尝试3次,然后停止重新发送。@raym0nd这就是原因您可能希望使用一个数字字段,如我在上面引用的
    重发电子邮件\u计数\uuu c
    。然后,只有当此字段的值小于4时,发送电子邮件的工作流才会启动。在发送初始电子邮件以及随后三次失败后,工作流将停止启动。在这种情况下,您还需要添加在成功接收电子邮件后,将
    重新发送电子邮件\u Count\u c
    字段设置为4的一些逻辑。@raym0nd为此,您需要一个额外的字段来跟踪上次尝试发送电子邮件的时间,例如
    重新发送电子邮件\u time\u c
    。您可能需要一个简单的批处理Apex脚本每小时运行一次,然后执行p选中符合条件的案例记录(即
    重新发送电子邮件\u计数\u c
    值小于4且
    重新发送电子邮件\u时间\u c
    过去大于8小时的案例记录),然后进行更新以再次启动工作流。
    ResendCaseEmails sched = new ResendCaseEmails();
    String cron = '0 0 * * * ?';
    System.schedule('Resend Case Email Job', cron, sched);