dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

follow us in feedly

[Salesforce]メールのガバナ制限まとめ

すぐ忘れるのでメモ。
Salesforceのメールに関連する制限です。

※※2014/07/09追記※※
こんなの見つけた。

https://na7.salesforce.com/help/pdfs/en/salesforce_app_limits_cheatsheet.pdf

これのEmail Limitsという項はガバナ制限のリファレンスのところに書いてる情報とほぼ同じだけど、見やすい。

ガバナ制限

内容 上限
1 1回のトランザクション
sendEmailメソッドを実行できる回数
10回
2 1日あたりにAPIやApexを使って送信できるメール数(※1) 外部メールアドレス1000件分
3 1日あたりに送信可能なメール数 組織のSalesforceライセンス数
×
1000
4 1回のSingleEmailMessageメソッド
含めることのできるアドレス数(※2)
100個

※1

Using the API or Apex, you can send single emails to a maximum of 1,000 external email addresses per day based on Greenwich Mean Time (GMT).

1,000 external email addresses なので「1000 通」ではなく「外部のメールアドレス1000 件分」が正しいんだと思う。
つまり、1通のメールアドレスの To と Cc にいずれも外部の人を指定した場合、2 件分とカウントされる。

また、あくまでApexなどから実行した場合の制限なので、Salesforce上のメール送信ボタンとかで送信している分にはこの1000通までというリミットは気にしなくてよい。

Single emails sent using the Salesforce application don't count toward this limit. There’s no limit on sending individual emails to contacts, leads, person accounts, and users in your organization directly from account, contact, lead, opportunity, case, campaign, or custom object pages.

※2

You can send 100 emails per SingleEmailMessage

Messaging.SingleEmailMessageとMessaging.MassEmailMessageの違い

Messaging.MassEmailMessageは名前の通り、大量にメールを送信するためのクラス(のよう)なんだけど
調べた限り、使えるメソッドがかなり限定されているので
テンプレートで作成したメールをリードや取引先責任者宛に一括送信したい場合以外は使えなさそう。

以下、具体的な特徴。

  • setTargetObjectIds(List<ID>)(複数形!)メソッドにより送信先を指定する。
    つまり、setToAddressesにより直接メアドをセットすることはできない
  • setSubjectとかsetPlainTextBodyとかも使えない。
    setTemplateIdsでメールテンプレートを指定するだけ

Apex内でメール送信の上限を確認する方法

Messaging.reserveSingleEmailCapacity(Integer)メソッドを使うらしい。
引数に渡した数の分だけメール送信が可能ならば特に何も起きないが、上限を超えていた場合は以下のエラーが発生する。

System.HandledException: The daily limit for the org would be exceeded by this request

try {
    Messaging.reserveSingleEmailCapacity(emailsLeads.size());
} catch (Exception e) {
    System.debug('You have used up your daily allowance of mails');
}

setTargetObjectIdとガバナ制限の関係

If you use SingleEmailMessage to email your organization’s internal users, specifying the user’s ID in setTargetObjectId means the email doesn’t count toward the daily limit. However, specifying internal users’ email addresseses in setToAddresses means the email does count toward the limit.

組織内のユーザに向けてメール送信するなら使ったほうがいいよ!その場合はガバナ制限にカウントされないからね。

ということらしい。

※※2014/07/18追記※※

送信回数にカウントされる条件については、以下の記事が詳しい。

http://help.salesforce.com/apex/HTViewSolution?id=000176908&language=ja

おそらく、上に書いたように

  • setTargetObjectIdを使い、かつIdが組織内ユーザの場合はカウントされない
  • setCcAddresssesとかでToとは別のアドレスを指定した場合はその分カウント
    (例では、setToAddressesとsetCcAddressesで違うアドレスを指定した場合は2回分でカウントされるとのこと)

さらにちょっとした補足

The single and mass email limits don't take unique addresses into account. For example, if you have johndoe@example.com in your email 10 times, that counts as 10 against the limit.

同じアドレスに繰り返しメール送信した場合、送信した分だけカウントされるよ!

という意味でいいかな。

リファレンス

ガバナ制限(English) Salesforce Developers

ガバナ制限(日本語) 英語より情報少ない... http://adnblog.salesforce.co.jp/files/apex_gov_limits_ja.htm

SingleEmailMessage Class Salesforce Developers

Salesforce Developers

Five Points to Remember when Sending Emails with Salesforce