この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Newer Version Available

This content describes an older version of this product. View Latest

getCaseIdFromEmailHeaders(headers)

指定されたメールヘッダー情報に対応するケース ID を返します。情報が見つからなかった場合は null を返します。

署名

public static Id getCaseIdFromEmailHeaders(List<Messaging.InboundEmail.Header> headers)

パラメータ

headers
型: List<Messaging.InboundEmail.Header>

戻り値

型: Id

使用方法

カスタムコード内のメールスレッドおよびケース間で一致項目がないか��検索する動作を最適化するために、このメソッドと EmailMessages.getRecordIdFromEmail を使用して、トークンベーススレッドとヘッダーベーススレッドを組み合わせて実装することをお勧めします。

参照 ID スレッドから移行する場合は、Cases.getCaseIdFromEmailThreadIdCases.getCaseIdFromEmailHeadersEmailMessages.getRecordIdFromEmail の組み合わせに置き換えることをお勧めします。ヘッダーベーススレッドのみを実装する場合は、Cases.getCaseIdFromEmailThreadIdCases.getCaseIdFromEmailHeaders に置き換えます。

headers 引数は、RFC 2822 に基づいて In-Reply-To ヘッダーと References ヘッダーの値を使用して一致するケース ID を見つけるために使用されます。メール-to-ケースで In-Reply-To または References ヘッダーが一致するメールが見つからない場合は、受信メールで Thread-Index と呼ばれる Outlook 固有のヘッダーもチェックされます。このヘッダーの最初の 22 バイトでスレッドが一意に識別されます。メール-to-ケースで受信メールの Thread-Index ヘッダーが検出された場合、EmailMessage レコードの ClientThreadIdentifier 項目で一致する情報が検索されます。一致が見つかった場合、顧客の返信メールが関連ケースにリンクされます。

通常、この方法は、Apex コードを使用して受信メールを独自に処理できるようにするためにメールサービスで使用されます。

現在メールサービスでヘッダーベーススレッドを実装している場合は、トークンベーススレッドとヘッダーベーススレッドを組み合わせた Lightning スレッドを使用することをお勧めします。ヘッダーベーススレッドで作業を続行するには、MessagedIdentifier 項目が正しく設定された EmailMessage レコードとしてメールを保存します。Lightning スレッドでは、スレッドトークンを主要なスレッド方式として使用し、ヘッダーベーススレッドをフォールバックとして利用することも、その逆を行うこともできます。

次の例では、スレッドトークンを利用して、ヘッダーベーススレッドをフォールバックとして使用しています。

1global class AttachEmailMessageToCaseExample implements Messaging.InboundEmailHandler {
2    global Messaging.InboundEmailResult handleInboundEmail(Messaging.inboundEmail email, 
3                Messaging.InboundEnvelope env) {
4 
5        // Create an InboundEmailResult object for returning the result of the 
6        // Apex Email Service.
7        Messaging.InboundEmailResult result = new Messaging.InboundEmailResult();
8        
9        // Try to find the Case ID using threading tokens in email attributes.
10        Id caseId = EmailMessages.getRecordIdFromEmail(email.subject, email.plainTextBody, email.htmlBody);
11        
12        // If we haven't found the Case ID, try finding it using headers.
13        if (caseId == null) {
14            caseId = Cases.getCaseIdFromEmailHeaders(email.headers);
15        }
16
17        // If a Case isn’t found, create a new Case record.
18        if (caseId == null) {
19            Case c = new Case(Subject = email.subject);
20            insert c;
21            System.debug('New Case Object: ' + c);
22            caseId = c.Id;
23        }
24
25        // Process recipients
26        String toAddresses;
27        if (email.toAddresses != null) {
28            toAddresses = String.join(email.toAddresses, '; ');
29        }
30
31        // To store an EmailMessage for threading, you need at minimum
32        // the Status, the MessageIdentifier, and the ParentId fields.
33        EmailMessage em = new EmailMessage(
34            Status = '0',
35            MessageIdentifier = email.messageId,
36            ParentId = caseId,
37            // Other important fields.
38            FromAddress = email.fromAddress,
39            FromName = email.fromName,
40            ToAddress = toAddresses,
41            TextBody = email.plainTextBody,
42            HtmlBody = email.htmlBody,
43            Subject = email.subject,
44            // Parse thread-index header to remain consistent with Email-to-Case.
45            ClientThreadIdentifier = getClientThreadIdentifier(email.headers)
46            // Other fields you wish to add.
47        );
48        
49        // Insert the new EmailMessage.
50        insert em;
51        System.debug('New EmailMessage Object: ' + em );   
52    
53    // Set the result to true. No need to send an email back to the user 
54    // with an error message.
55    result.success = true;
56    
57    // Return the result for the Apex Email Service.
58    return result;
59  }
60  
61  private String getClientThreadIdentifier(List<Messaging.InboundEmail.Header> headers) {
62    if (headers == null || headers.size() == 0) return null;
63    try {
64        for (Messaging.InboundEmail.Header header : headers) {
65            if (header.name.equalsIgnoreCase('thread-index')) {
66                Blob threadIndex = EncodingUtil.base64Decode(header.value.trim());
67                return EncodingUtil.convertToHex(threadIndex).substring(0, 44).toUpperCase();
68            }
69        }
70    } catch (Exception e){
71        return null;
72    }
73    return null;
74  }
75}