【Salesforce】ケースのメールで返信時も特定の宛先を指定する

# はじめに

ケースのメールでは、メール送信アクションで「定義済み項目値」を設定することができます。
「定義済み項目値」を活用すれば、ケース情報を利用して、メール本文や宛先を自動的に設定できるため、ユーザの負荷が軽減されます。

しかし、ケースのメール送信アクションには、宛先に関する以下の制限事項があり、「定義済み項目値」を設定しても動作しないパターンがあります。  

>[宛先受信者] 項目、[CC 受信者] 項目、[BCC 受信者] 項目の定義済み項目値は、最初のメールでのみ入力されます。返信メールや転送メールの場合、これらの項目は事前入力されません。

引用元：[ケースの[メールを送信]アクションの考慮事項](https://help.salesforce.com/s/articleView?id=sf.case_interaction_send_email_quick_action_considerations.htm&type=5)

例として、メール-to-ケースで作成されたケースは、メールが紐づいているはずです。  
そのためオペレータがメール送信アクションを実行すると、そのメールは返信扱いとなるため、宛先系のデフォルト値が自動設定されません...。

本記事では、Salesforceのケースのメール送信アクションで、メール返信時（最初のメール以降）も特定の宛先をデフォルト値として指定する方法を記載します。

## 前提条件

- Salesforce：Developer Edition（Winter '25）
- オンデマンドメール-to-ケースを設定済  
※動作確認でメール-to-ケースを利用しますが、設定手順については本記事に記載しておりません。

## 結論

「QuickAction.QuickActionDefaultsHandler」インターフェースを実装したApexクラスを作成します。
QuickAction.QuickActionDefaultsHandlerは、**ケースのメール送信アクションのデフォルト値を指定できる**インターフェースです。  
このインターフェースを利用すれば、メール送信アクションの「定義済み項目値」と同じように、項目のデフォルト値をApexで指定できるようになります。

## 実装例

今回はサンプルとして、ケースの「種別（Type）」の値が**Other**の場合に、以下デフォルト値を設定するようにしてみます。

■メールメッセージ
- 宛先アドレス（ToAddress）：testxxxxxxx@example.com
- CCアドレス（CcAddress）：null
- BCCアドレス（BccAddress）：null

### Step1：ケースのメール送信アクション作成

メールを送信するための送信アクションをケースオブジェクトに作成します。
（記載していない項目はデフォルト）

- アクション種別：メールを送信
- 表示ラベル：メール送信テスト
- 名前：SendEmail1

※Apex側でデフォルト値を設定するため、ここでは「定義済み項目値」を設定しません。

### Step2：メール送信アクションをページレイアウトへ設定

Step1で作成したメール送信アクションをケースのページレイアウトへ設定します。ケースのメール送信アクションが利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944874/282e02e0-30c9-4e61-526d-c598caf50ed5.png)

<details>
    <summary>メール送信アクションが表示されない場合</summary>
Lightning レコードページに「Chatterパブリッシャー」が設定されていない可能性があります。  
キャッシュを削除しても表示されなかった場合は、以下の画像を参考に「Chatterパブリッシャー」を設定してみてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944874/a6a7385c-f9dc-82e7-a3aa-16c94003416e.png)

</details>

### Step3：Apexの作成

「QuickAction.QuickActionDefaultsHandler」を実装したApexクラスを作成します。  
Salesforceのヘルプページにサンプルコードが記載されているので、そちらをベースに作成していきます。

#### ヘルプページに記載されているサンプルコードについて

サンプルコードを見ると、メールのデフォルト値を設定するために、以下の処理を行っているようです。  

- 実行されたアクションの特定

```apex
// Check if the quick action is the standard case feed Send Email action
for (Integer j = 0; j < defaults.size(); j++) {
    if (defaults.get(j) instanceof QuickAction.SendEmailQuickActionDefaults &&
       defaults.get(j).getTargetSObject().getSObjectType() ==
           EmailMessage.sObjectType &&
       defaults.get(j).getActionName().equals('Case.Email') &&
       defaults.get(j).getActionType().equals('Email')) {
           sendEmailDefaults =
               (QuickAction.SendEmailQuickActionDefaults)defaults.get(j);
           break;
    }
}
```

コード引用元：[QuickActionDefaultsHandler インターフェース](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_interface_QuickAction_QuickActionDefaultsHandler.htm)

アクションのAPI名と種別が指定されているので、Step1で作成したメール送信アクションのものに変更する必要があります。

- アクションを実行したケースレコードの特定

```apex
Case c = [SELECT Status, Reason FROM Case
          WHERE Id=:sendEmailDefaults.getContextId()];
```

コード引用元：[QuickActionDefaultsHandler インターフェース](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_interface_QuickAction_QuickActionDefaultsHandler.htm)

こちらは、アクションに関連付けられているコンテキストID（ケースID）を利用しているため、取得条件は変更なしで良さそうです。

</details>

#### 今回作成したApex

```apex
global class EmailPublisherLoader implements QuickAction.QuickActionDefaultsHandler {
    global void onInitDefaults(QuickAction.QuickActionDefaults[] defaults) {
        QuickAction.SendEmailQuickActionDefaults sendEmailDefaults = null;
        for(Integer j = 0; j < defaults.size(); j++) {
            // 呼び出されたアクションがケースの「メール送信テスト」の場合
            if(defaults.get(j) instanceof QuickAction.SendEmailQuickActionDefaults &&
               defaults.get(j).getTargetSObject().getSObjectType() == EmailMessage.sObjectType &&
               // ↓でアクションのAPI名を指定している
               defaults.get(j).getActionName().equals('Case.SendEmail1') &&
               // 作成したアクションは「メールを送信」のため、SendEmailを指定する
               defaults.get(j).getActionType().equals('SendEmail')) {
                   sendEmailDefaults = (QuickAction.SendEmailQuickActionDefaults) defaults.get(j);
                   break;
            }
        }

        if (sendEmailDefaults != null) {
            // 返信時
            if(sendEmailDefaults.getInReplyToId() != null) {
                Case c = [SELECT Type FROM Case WHERE Id =: sendEmailDefaults.getContextId()];
                EmailMessage emailMessage = (EmailMessage) sendEmailDefaults.getTargetSObject();

                // ↓でデフォルト値を指定している
                if (c.Type != null && c.Type.equals('Other')) {
                    emailMessage.ToAddress = 'testxxxxxxx@example.com';
                    emailMessage.CcAddress = null;
                    emailMessage.BccAddress = null;
                }
            }
        }
    }
}
```

### Step4：デフォルトハンドラーの有効化

作成したApexがメールアクションで呼ばれるように、「サポート設定」で設定を行います。  

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944874/1bd68c3d-afcf-812d-2b5c-8c9ab38330f7.png)

以上で設定は完了です！

## 動作確認

今回はメール-to-ケースで作成されたケースを利用して、動作確認していきます。  
ケース作成時のメール以外は、ケースにメールが紐づいていません。

### 種別がOther以外の場合

デフォルト値を設定する条件を満たしていないので、メール送信元のアドレスが宛先に設定されます。  
※デフォルトハンドラーを有効化していないときと同じ挙動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944874/d7b918de-5d55-cd3d-19b0-6da34cd51af3.png)

### 種別がOtherの場合

デフォルト値を設定する条件を満たしているので、Apexで指定したメールアドレスが宛先に設定されます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3944874/8f3d955e-7c96-9f45-c25a-ceb9474405b3.png)

## 注意点

- メール送信アクションを押下した際に、既に下書き状態のメールが存在する場合は、デフォルト値が設定されません。  
デフォルト値を設定したい場合は、ゴミ箱アイコンよりドラフトを削除する必要があります。
- デフォルト値を設定する方法が複数あるので、実行の優先度を理解しておく必要があります。  
→例として、Apexとメール送信アクションの両方で同じ項目にデフォルト値が設定されている場合は、Apex側が優先されるようです。詳細は[ケースメールのデフォルト値のしくみ](https://help.salesforce.com/s/articleView?id=sf.case_interaction_send_email_default_field_values_matrix.htm&type=5)をご確認ください。

## おわりに

メール送信アクションで設定した宛先が、返信時には動作しなくて困った。という人も多いのではないでしょうか？  
Apexを書く必要はありますが、ちょっとした開発で返信時にも宛先設定できるようになるのは、嬉しいですね！  

また、実行されたアクションのAPI名も取得できるので、使い勝手はともかく、以下のような活用もできそうだと感じました。
- お客様へメールするためのアクション  
　→宛先にお客様のメールアドレスを設定
- 社内へメールするためのアクション  
　→宛先に社内のメーリングリストを設定

## 参考

- Salesforceヘルプサイト
    - [ケースフィードメールパブリッシャーの [宛先] 項目の値](https://help.salesforce.com/s/articleView?id=000386119&type=1)
    - [ケースの[メールを送信]アクションの考慮事項](https://help.salesforce.com/s/articleView?id=sf.case_interaction_send_email_quick_action_considerations.htm&type=5)
    - [ケースメールのデフォルト値のしくみ](https://help.salesforce.com/s/articleView?id=sf.case_interaction_send_email_default_field_values_matrix.htm&type=5)
    - [QuickActionDefaultsHandler インターフェース](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_interface_QuickAction_QuickActionDefaultsHandler.htm)