Loading
Salesforce から送信されるメールは、承認済ドメインからのみとなります続きを読む

EmailHeader.triggerUserEmail は、ケースまたはリードの所有者が Apex コードで変更されたときに送信されるメール通知の送信を阻止しません

公開日: Oct 13, 2022
説明
ケースまたはリードの Apex トリガが Trigger.new で使用可能なレコードの所有者を変更すると、自動的に生成されたメール通知 (ケース/リード割り当て通知) が割り当て者に送信されます。 DMLOptions.EmailHeader.triggerUserEmail を false に設定すると、これを阻止することができないのはなぜですか?

問題を再現する手順:
 
1. テストユーザを作成し、そのメールアドレスにあなたのメールアドレスを設定します。
2. 所有権を変更するためのケースのカスタムチェックボックス「所有権の変更」を作成し、以下のトリガを使用してケースを再度割り当てます。
trigger ChangeOwnership on Case (before insert, before update) { 
Database.DMLOptions dmo = new Database.DMLOptions(); 
dmo.EmailHeader.triggerUserEmail = false; 

for (Case c : Trigger.New){ 
if (c.Change_Ownership__c == true){ 
c.OwnerId='005i0000000QxRg'; // hard code the ID of the test user 
c.Change_Ownership__c = false; 
c.setOptions(dmo); 
} 
} 
}
3. 既存のケースでは、[所有権の変更] チェックボックスをオンにして、triggerUserEmail=false を使用してもメール通知が送信されることに注意してください。

リードの所有権が変更された場合も同様の手順に従うことができます。
解決策
上記の DMLOptions のシナリオが機能しないのは、DML オプションが適用された後に行われた DML 呼び出しにのみ適用されるためです。つまり、insert/update するためのオブジェクトのリストを生成し、そのオブジェクトに DMLOptions を設定する必要があります。

上記のシナリオの回避策として、@future メソッドを次のように使用できます:
 
trigger ChangeOwnership_v2 on Case (before update) { 
List<ID> caseIDs = new List<ID>(); 

for (Case c : Trigger.New){ 
if (c.Change_Ownership__c == true){ 
caseIDs.add(c.Id); 
} 
} 

if(caseIDs.size() > 0) { 
CaseHelper.updateOwnership(caseIDs); 
} 
} 

public class CaseHelper { 

@future 
public static void updateOwnership(List<Id> caseIDs) { 
Database.DMLOptions dmo = new Database.DMLOptions(); 
dmo.EmailHeader.triggerUserEmail = false; 

List<Case> casesToUpdate = [select ownerid, change_ownership__c from case where id in :caseIDs]; 

for(Case c : casesToUpdate) { 
c.OwnerId='005i0000000QxRg'; 
c.Change_Ownership__c = false; 
} 

Database.update(casesToUpdate, dmo); // Actual DML operation is performed instead of implicit update
} 
}

 
ナレッジ記事番号

000385933

 
読み込み中
Salesforce Help | Article