Salesforce API:如何从电子邮件参考代码中识别案例(“[Ref:...:Ref]”)?

时间:2011-07-26 07:46:51

标签: api salesforce

我正在编写一个Windows服务,该服务将在我的IMAP4收件箱中查询来自客户端的电子邮件,并根据它们在Salesforce中创建新案例。

有时,电子邮件会在主题中附带一个案例参考代码。例如:“[ref:00FFwxyz.500FFJJS5:ref]”。我想将这些电子邮件分配给代码识别的现有案例,而不是创建一个新案例。

我的问题是:是否有一个确定的公式用于从参考代码中提取唯一的案例标识符?我已经看到了一些相反的公式,但它们看起来都像猜测:{ {3}},Blog post on KnowThyCloud.com

3 个答案:

答案 0 :(得分:3)

找到了一个不错的解决方案。我在调用the post on KnowThyCloud.com猜测时错了。在正确的背景下,它工作正常。

我的解决方案是在“公式(文本)”类型的案例记录上创建一个新的自定义字段。该字段的值是博客文章中提到的公式:

TRIM(" [ ref:" + LEFT( $Organization.Id, 4) + RIGHT($Organization.Id, 4) +"."+ LEFT( Id, 4) + SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(Id, RIGHT( Id, 4), ""), LEFT( Id, 4), ""), "0", "") + RIGHT( Id, 4) + ":ref ] ")

现在,每个案例记录的自定义字段的值与电子邮件中的引用ID相同,我只需使用Salesforce API查询它。

答案 1 :(得分:2)

我实施了urig的解决方案,效果很好。

这是一个Apex代码解决方案,可以在没有此字段的情况下找到Case。

String emailSubject = 'FW: Re: RE: order 36000862A Case: 00028936 [ ref:00D7JFzw.5007Ju10k:ref ]';
String caseNumber = null;
/*  
Extract the text after ref: and before the period. Could use this to locate the organization.
In the text after the period and before the :ref split into a 4 digit number and remaining number.
Insert 0's to get ref id.
*/  
String patternString = '.*ref:(.{8}).(.{4})(.+):ref.*';
Pattern thePattern = Pattern.compile(patternString);
Matcher matcher = thePattern.matcher(emailSubject);

if (matcher.matches()) {
    String caseId = matcher.group(2) + '000000' + matcher.group(3);
    Case[] matchingCases = [Select CaseNumber from Case where Id = :caseId];
    if(matchingCases.size() == 1) {
        Case theCase = matchingCases[0];
        caseNumber = theCase.CaseNumber;
    }    
} 

答案 2 :(得分:1)

我修改了上面的Jan的代码段,以支持包含underrscores的新引用字符串(例如_00DC0PxQg._500C0KoOZS)。

String patternString = '.*ref:(.{11}).(.{5})(.+):ref.*';
Pattern thePattern = Pattern.compile(patternString);
Matcher matcher = thePattern.matcher(emailSubject);

if (matcher.matches()) {
    String caseId = matcher.group(2) + '00000' + matcher.group(3);
    system.debug('### '+caseId);
    Case[] matchingCases = [Select CaseNumber from Case where Id = :caseId];
    if(matchingCases.size() == 1) {
        Case theCase = matchingCases[0];
        caseNumber = theCase.CaseNumber;
    }    
}