« 2014年6月 | メイン | 2014年8月 »

2014年7月に作成された記事

2014年7月 8日 (火)

Apex一括メール送信の制限

お久しぶりです、こころです。

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 List contactIds = 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回目で何が起こるでしょう。

※一括メール送信はログインユーザで実行されます。

20140708_14439_2

3回クリックして4回目は、、

20140707_234827_2

キタ!! 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通です。

1

というわけで予想通り①でした。

実は検証を仕込んでいる間に、

SendEmailResult オブジェクトで返されるすべてのエラーは、メールが送信されなかったことを表します。

の文字をApexレファレンス中(P294)に見つけてしまって、検証するまでもなく①な気が限りなくしていたのですが、念のため確認してみました。

Sandboxで1000通の制限に対してのテストをしてみましたが、同様に一括メール件数が閾値を超えるリクエストの場合は配信はされません^^

Apexからの一括メール配信を設計する上で参考にしてみてください。

採用情報

株式会社フレクトでは、事業拡大のため、
・Salesforce/Force.comのアプリケーション開発
・HerokuやAWSなどのクラウドプラットフォーム上
でのWebアプリケーション開発
エンジニア、マネージャーを募集中です。

未経験でも、これからクラウドをやってみたい方、
是非ご応募下さい。

フレクト採用ページへ

会社紹介

  • 株式会社フレクトは、
      ・認定コンサルタント
      ・認定上級デベロッパー
      ・認定デベロッパー
    が在籍している、セールスフォースパートナーです。
    また、heroku partnersにも登録されています。
    herokuパートナー
    株式会社フレクト
    Salesforce/Force.com
    導入支援サービス
    弊社の認定プロフェッショナルが支援致します。
    ・Visualforce/Apexによるアプリ開発
    ・Salesforceと連携するWebアプリ開発
    も承っております。
    セールスフォースご検討の際は、
    お気軽にお問合せください。

Twitter

リファレンス

■Developer's Guide(リファレンス)
・Apex  HTML | PDF | 日本語PDF | ガバナ制限
・Visualforce  HTML | PDF
・Web Services API  HTML | PDF | 日本語PDF
・Bulk API  HTML | PDF
・REST API  HTML | PDF | 日本語PDF
・Metadata API  HTML | PDF
・Migration Tool  HTML | PDF
・AJAX Toolkit  HTML | PDF
・Data Loader PDF | 日本語PDF

■早見表 (日本語)
数式
Apex
Visualforce
Web Services API
Chatter