【Salesforce】メールサービスで受信メールの情報を自動的にケースに追加する

Salesforce

1.背景

以下でメールサービスの設定をしました。

メールサービスで使用するApexクラスに処理を追加すれば、ケース作成時に項目の値を設定したりケース以外のオブジェクトの値を設定することなどが可能なので、今回はそれを実施します。

2.自動生成したケース項目に値を設定

ケースに「受信メール情報」という項目を準備しました。この項目にメールアドレスなどの情報を自動的に設定するようにしたいと思います。

メールサービスで呼び出すApexクラスを修正します。(今回もCopilotに作成してもらいました。)

public with sharing class EmailToCaseHandler implements Messaging.InboundEmailHandler {
    // メール受信時に呼び出されるメインの処理
    public Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
        // 結果オブジェクトを初期化
        Messaging.InboundEmailResult result = new Messaging.InboundEmailResult();
        
        try {
            // メール情報からケースを作成
            Case newCase = createCaseFromEmail(email);
            // メールの添付ファイルをケースに追加
            attachFilesToCase(email, newCase.Id);
            
            // 処理が成功したことを設定
            result.success = true;
        } catch (Exception e) {
            // エラーログの出力
            System.debug('エラーが発生しました: ' + e.getMessage());
            System.debug(e.getStackTraceString());
            // 処理が失敗したことを設定
            result.success = false;
            result.message = 'ケース作成中にエラーが発生しました。';
        }
        
        // 結果を返す
        return result;
    }
    
    // メール情報からケースを作成するメソッド
    private Case createCaseFromEmail(Messaging.InboundEmail email) {
        // 新しいケースのインスタンスを作成
        Case newCase = new Case();
        // 件名を設定(件名がない場合は「(無題)」とする)
        newCase.Subject = email.subject != null ? email.subject : '(無題)';
        // 本文を設定
        newCase.Description = email.plainTextBody;
        // ステータスを設定
        newCase.Status = '新規';
        // 受付経路を設定
        newCase.Origin = 'Email';
        // 送信者のメールアドレスを設定
        newCase.SuppliedEmail = email.fromAddress;
        // 送信者の名前を設定
        newCase.SuppliedName = email.fromName;
        // ケース所有者をコンテキストユーザーに設定
        newCase.OwnerId = UserInfo.getUserId();
        // メール情報を改行で結合してケースメモに設定
        newCase.InboundEmailInfo__c = '送信者: ' + email.fromName + '\n' +
                                      '送信者のメールアドレス: ' + email.fromAddress + '\n' +
                                      '宛先のメールアドレス: ' + email.toAddresses + '\n' +
                                      '件名: ' + email.subject;
        
        // ケース作成の権限があるかチェック
        if (Schema.sObjectType.Case.isCreateable()) {
            // ケースを挿入
            insert newCase;
        } else {
            System.debug('ユーザーにはケースを作成する権限がありません。');
        }
        
        // 作成したケースを返す
        return newCase;
    }
    
    // メールの添付ファイルをケースに追加するメソッド
    private void attachFilesToCase(Messaging.InboundEmail email, Id caseId) {
        // 添付ファイルが存在するかチェック
        if (email.binaryAttachments != null && email.binaryAttachments.size() > 0) {
            // 添付ファイル作成の権限があるかチェック
            if (Schema.sObjectType.Attachment.isCreateable()) {
                // 添付ファイルを格納するリストを初期化
                List<Attachment> attachmentList = new List<Attachment>();
                // 添付ファイルをループ処理
                for (Messaging.InboundEmail.BinaryAttachment attachment : email.binaryAttachments) {
                    // 新しい添付ファイルのインスタンスを作成
                    Attachment att = new Attachment();
                    // 親IDをケースIDに設定
                    att.ParentId = caseId;
                    // ファイル名を設定
                    att.Name = attachment.fileName;
                    // ファイルの内容を設定
                    att.Body = attachment.body;
                    // リストに添付ファイルを追加
                    attachmentList.add(att);
                }
                // 一括挿入で添付ファイルを作成
                insert attachmentList;
            } else {
                System.debug('ユーザーには添付ファイルを作成する権限がありません。');
            }
        }
    }
    
}

上記を保存したら動作確認のためにメール送信します。

ケースが自動生成されており、メールの情報が自動的に項目に設定されていることを確認します。

3.ユーザー項目に自動で値を設定する

今度はケースではなく、ユーザーオブジェクトの項目に値を自動で設定する処理を追加します。

public with sharing class EmailToCaseHandler implements Messaging.InboundEmailHandler {
    // メール受信時に呼び出されるメインの処理
    public Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) {
        // 結果オブジェクトを初期化
        Messaging.InboundEmailResult result = new Messaging.InboundEmailResult();
        
        try {
            // メール情報からケースを作成
            Case newCase = createCaseFromEmail(email);
            // メールの添付ファイルをケースに追加
            attachFilesToCase(email, newCase.Id);
            // ユーザーオブジェクトに情報を追加
            updateUserCaseNote(email);
            
            // 処理が成功したことを設定
            result.success = true;
        } catch (Exception e) {
            // エラーログの出力
            System.debug('エラーが発生しました: ' + e.getMessage());
            System.debug(e.getStackTraceString());
            // 処理が失敗したことを設定
            result.success = false;
            result.message = 'ケース作成中にエラーが発生しました。';
        }
        
        // 結果を返す
        return result;
    }
    
    // メール情報からケースを作成するメソッド
    private Case createCaseFromEmail(Messaging.InboundEmail email) {
        // 新しいケースのインスタンスを作成
        Case newCase = new Case();
        // 件名を設定(件名がない場合は「(無題)」とする)
        newCase.Subject = email.subject != null ? email.subject : '(無題)';
        // 本文を設定
        newCase.Description = email.plainTextBody;
        // ステータスを設定
        newCase.Status = '新規';
        // 受付経路を設定
        newCase.Origin = 'Email';
        // 送信者のメールアドレスを設定
        newCase.SuppliedEmail = email.fromAddress;
        // 送信者の名前を設定
        newCase.SuppliedName = email.fromName;
        // ケース所有者をコンテキストユーザーに設定
        newCase.OwnerId = UserInfo.getUserId();
        // メール情報を改行で結合してケースメモに設定
        newCase.InboundEmailInfo__c = '送信者: ' + email.fromName + '\n' +
                                      '送信者のメールアドレス: ' + email.fromAddress + '\n' +
                                      '宛先のメールアドレス: ' + email.toAddresses + '\n' +
                                      '件名: ' + email.subject;
        
        // ケース作成の権限があるかチェック
        if (Schema.sObjectType.Case.isCreateable()) {
            // ケースを挿入
            insert newCase;
        } else {
            System.debug('ユーザーにはケースを作成する権限がありません。');
        }
        
        // 作成したケースを返す
        return newCase;
    }
    
    // メールの添付ファイルをケースに追加するメソッド
    private void attachFilesToCase(Messaging.InboundEmail email, Id caseId) {
        // 添付ファイルが存在するかチェック
        if (email.binaryAttachments != null && email.binaryAttachments.size() > 0) {
            // 添付ファイル作成の権限があるかチェック
            if (Schema.sObjectType.Attachment.isCreateable()) {
                // 添付ファイルを格納するリストを初期化
                List<Attachment> attachmentList = new List<Attachment>();
                // 添付ファイルをループ処理
                for (Messaging.InboundEmail.BinaryAttachment attachment : email.binaryAttachments) {
                    // 新しい添付ファイルのインスタンスを作成
                    Attachment att = new Attachment();
                    // 親IDをケースIDに設定
                    att.ParentId = caseId;
                    // ファイル名を設定
                    att.Name = attachment.fileName;
                    // ファイルの内容を設定
                    att.Body = attachment.body;
                    // リストに添付ファイルを追加
                    attachmentList.add(att);
                }
                // 一括挿入で添付ファイルを作成
                insert attachmentList;
            } else {
                System.debug('ユーザーには添付ファイルを作成する権限がありません。');
            }
        }
    }
    
    // ケース所有者のユーザーのケースメモを更新するメソッド
    private void updateUserCaseNote(Messaging.InboundEmail email) {
        // ユーザーの項目アクセス権をチェック
        if (Schema.sObjectType.User.fields.CaseInfo__c.isAccessible()) {
            // ユーザーの更新権限をチェック
            if (Schema.sObjectType.User.isUpdateable()) {
                // コンテキストユーザーのIDを取得
                Id userId = UserInfo.getUserId();
                // ユーザーを取得
                User caseOwner = [SELECT Id, CaseInfo__c FROM User WHERE Id = :userId LIMIT 1];
                // メール情報を改行で結合してケースメモに設定
                caseOwner.CaseInfo__c = '送信者: ' + email.fromName + '\n' +
                                              '送信者のメールアドレス: ' + email.fromAddress + '\n' +
                                              '宛先のメールアドレス: ' + email.toAddresses;
                // ユーザーを更新
                update caseOwner;
            } else {
                System.debug('ユーザーにはユーザーオブジェクトを更新する権限がありません。');
            }
        } else {
            System.debug('ユーザーにはCaseInfo__c項目へのアクセス権がありません。');
        }
    }
}

上記を保存したら、メール送信して動作確認をします。

以下のようにケースが自動生成され、ユーザーオブジェクトの項目にも値が自動的に設定されていることが確認できました。

4.最後に

当然ですがメールサービスはメール-to-ケースよりも柔軟性は高いので、フローと組み合わせてもやりたいことができない場合にはメールサービスの使用を検討したほうが良い可能性があります。

以下あたりを参考にしています。

Salesforce Developers
Salesforce Developer Website
Salesforce Developers
Salesforce Developer Website

タイトルとURLをコピーしました