お久しぶりです、こころです。
Apexからの一括メール送信には
”1 組織あたり 1 日に合計 1,000 個の外部メールアドレスまで”
つまり
”アドレス重複を含んで1日1000通まで”
というガバナ制限があります。
1日で閾値ギリギリまでメール配信されそうな要件があり、閾値を超えるとどうなるのか試してみました。
例えば1回に75通Apexからメールを送るとして、
13回送信すると975通になります。
14回目にどうなるのでしょうか?
①エラーになってメールは1通も配信されない
②25通まで配信され1000に達した後は配信されない
③なんと1000通超えて配信完了する
①であって欲しいと思いながらメールの一括送信用メソッドMassEmailMessageのレファレンスを確認すると、
sendEmail メソッドで送信される一括メールメッセージは、送信する組織の 1 日の一括メール制限にカウントされます。この制限値に達すると、MassEmailMessage を使用する sendEmail メソッドへのコールは拒否され、ユーザは MASS_MAIL_LIMIT_EXCEEDED エラーコードを受信します。
とあり、MASS_MAIL_LIMIT_EXCEEDEDの解釈が問題となりそうです。
DeveloperEdition(配信制限数は10通/日)でテストしてみました。
Apexクラス
public class sendMassEmail { public ListcontactIds = new List (); public static void sendMass() { List conObj = [SELECT id, name FROM Contact LIMIT 3];//配信対象件数 List contactIds = new List (); for(Integer i=0; i < conObj.size(); i++){ contactIds.add(conObj[i].Id); } Messaging.MassEmailMessage mail = new Messaging.MassEmailMessage(); mail.setTargetObjectIds(contactIds); mail.setTemplateID('00X10000000NzIC'); //送信メールのテンプレートのID Messaging.sendEmail(new Messaging.MassEmailMessage[] {mail}); } }
ページ
<apex:page controller="sendMassEmail"> <apex:form > <apex:commandButton action="{!sendMass}" value="一括送信"/> </apex:form> </apex:page>
ボタンを1回押すと3通の一括送信メールが送られます。DeveloperEdition組織の一括メール送信制限は10通です。3回ボタン押下で9通配信されますが、4回目で何が起こるでしょう。
※一括メール送信はログインユーザで実行されます。
3回クリックして4回目は、、
キタ!! System.EmailException: SendEmail failed. First exception on row 0; first error: MASS_MAIL_LIMIT_EXCEEDED, Failed to send email: []
のエラーになりました。
デバッグログを確認すると
00:47:08.033 (33768787)|EXCEPTION_THROWN|[42]|System.EmailException: SendEmail failed. First exception on row 0; first error: MASS_MAIL_LIMIT_EXCEEDED, Failed to send email: [] 00:47:08.034 (34189036)|SYSTEM_METHOD_EXIT|[42]|Messaging.sendEmail(LIST<Messaging.Email>) 00:47:08.034 (34251510)|FATAL_ERROR|System.EmailException: SendEmail failed. First exception on row 0; first error: MASS_MAIL_LIMIT_EXCEEDED, Failed to send email: []
4回目の一括配信メールは失敗して送信されませんでした。
(もちろん最初の9通は届きましたが、それ以降は1通も届いていません。)
設定>ログ>メールログファイル よりメールログをリクエストして確認すると、やはり9通です。
というわけで予想通り①でした。
実は検証を仕込んでいる間に、
SendEmailResult オブジェクトで返されるすべてのエラーは、メールが送信されなかったことを表します。
の文字をApexレファレンス中(P294)に見つけてしまって、検証するまでもなく①な気が限りなくしていたのですが、念のため確認してみました。
Sandboxで1000通の制限に対してのテストをしてみましたが、同様に一括メール件数が閾値を超えるリクエストの場合は配信はされません^^
Apexからの一括メール配信を設計する上で参考にしてみてください。