According to Mass Email Limits documentation:

You can send an unlimited amount of email to your org’s internal users, which includes portal users.

However, when you go into Setup--> Mass Email Users and try to build a list view, it will throw an error if the list shows more than 500 users.

This makes it effectively impossible to email all internal users... is there a way around this?

2 Answers 2


There's limits on how many mass emails you can send in a single transaction. You'll necessarily need to build multiple list views and then send them in batches. Alternatively, you could write a batch apex class to email users in batches.

  • OK thanks, was hoping they'd have a point-n-click workaround for internal notifications.
    – smohyee
    Sep 20, 2016 at 16:23

If anyone else decides its worth it to them to build a batch apex process for this, here is my template:

//This batch apex class will bypass the 500 recipient limit for emails. Note this does not mean it will bypass the overall daily email limits enforced by SF. 
//This is mainly intended for mass messaging internal and portal users, since SF doesn't have limits on emailing users. 

//MassEmailHandler takes 3 inputs: the ID of the email template you wish to send, a string which refers to a prebuilt SOQL query that returns a list of recipients, and a third optional string to directly input the recipient SOQL query in the case 
//where the entered listName is 'Custom Query'

// Database.executeBatch(new MassEmailHandler({templateID}, 'Test', '')) will email the recipients returned by the 'Test' query. Note that the third parameter is still required even though it isn't used.
// Database.executeBatch(new MassEmailHandler({templateID}, 'Custom Query', 'SELECT ID FROM User WHERE IsActive=true')) demonstrates how to use the third parameter to manually input a Query.

global class MassEmailHandler implements Database.Batchable<sObject>{

   global final ID templateID;
   global final String listName;
   global final string query;

   global MassEmailHandler(ID templateID, string listName, string customquery){

       this.templateID = templateID;
       this.listName = listName;

       //Build your regularly used queries here, and associate them with a listName 

       if(listName == 'Customer Community Users') query = 'SELECT id FROM User WHERE IsActive = True AND UserType = \'PowerCustomerSuccess\'';
       if(listName == 'Test') query = 'SELECT ID FROM User WHERE LastName = \'Mohyee\'';
       if(listName == 'Custom Query') query = customquery;


    global Database.QueryLocator start(Database.BatchableContext BC){
      return Database.getQueryLocator(query);

    global void execute(Database.BatchableContext BC, List<sObject> scope){

        list<ID> recipientIDs = new list<ID>();

        for(sObject obj : scope) recipientIDs.add(obj.ID);

        Messaging.MassEmailMessage mail;

        if(listName == 'Customer Community Users') mail = portalMessage();
        else if(listName == 'Test') mail = testMessage();
        else mail = new Messaging.MassEmailMessage();


        list<Messaging.SendEmailResult> serList = Messaging.sendEmail(new Messaging.MassEmailMessage[]{mail});


    global void finish(Database.BatchableContext BC){


    public Messaging.MassEmailMessage portalMessage(){
        Messaging.MassEmailMessage mail = new Messaging.MassEmailMessage();
        mail.setSenderDisplayName('Verscend Client Portal Admin');
        mail.setDescription('Client Portal Mass Email');

        return mail;

    public Messaging.MassEmailMessage testMessage(){
        Messaging.MassEmailMessage mail = new Messaging.MassEmailMessage();
        mail.setSenderDisplayName('Verscend Client Portal Admin');
        mail.setDescription('Test Email');

        return mail;


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .