SingleEmailMessage Vs MassEmailMessage
| SINGLE EMAIL | MASS EMAIL | |
|---|---|---|
| Multiple recipients? | Yes | Yes |
| Personalized body? | Yes (single body only) | Yes |
| Special permission needed? | No | Yes, has to be enabled |
| Merge fields? | Yes | Yes |
| Personalized merge fields? | Yes (only one record at a time) | Yes |
| Templates? | Yes | Yes |
| Template possibilities? | Text/HTML/Visualforce/Custom Templates | Text/HTML/Custom Template |
SingleEmailMessage:
Single emails are like regular individual emails that may go to one or more addresses (to/cc/bcc), but each of these emails has the same body
Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.toAddresses = new String[] { 'abc@gmail.com', 'xyz@gmail.com' };
message.optOutPolicy = 'FILTER';
message.subject = 'Opt Out Test Message';
message.plainTextBody = 'This is the message body.';
Messaging.SingleEmailMessage[] messages = new List<Messaging.SingleEmailMessage> {message};
Messaging.SendEmailResult[] results = Messaging.sendEmail(messages);
if (results[0].success)
{
System.debug('The email was sent successfully.');
} else
{
System.debug('The email failed to send: ' + results[0].errors[0].message);
}
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_email_outbound_single.htm
MassEmailMessage:
Mass emails typically go to a large number of addresses (currently capped to 250 per email), with personalized message bodies.
public void SendEmail()
{
List<contact> lstcon=[Select id from contact limit 2];
List<Id> lstids= new List<Id>();
for(Contact c:lstcon)
{
lstids.add(c.id);
}
EmailTemplate et=[Select id from EmailTemplate where name = 'EmailTemplatename' limit 1];
Messaging.MassEmailMessage mail = new Messaging.MassEmailMessage();
mail.setTargetObjectIds(lstIds);
mail.setSenderDisplayName('System Admin');
mail.setTemplateId(et.id);
Messaging.sendEmail(new Messaging.MassEmailMessage[] { mail });
}
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_email_outbound_mass.htm
Related link
https://developer.salesforce.com/page/An_Introduction_To_Email_Services_on_Force.com
Please let us know if this will help you
Thanks
Amit Chaudhary










1) isExecuting Returns true if the current context for the Apex code is a trigger, not a Visualforce page, a Web service, or anexecuteanonymous() API call.
2) isInsert Returns true if this trigger was fired due to an insert operation, from the Salesforce user interface, Apex, or theAPI.
3) isUpdate Returns true if this trigger was fired due to an update operation, from the Salesforce user interface, Apex, or theAPI.
4) isDelete Returns true if this trigger was fired due to a delete operation, from the Salesforce user interface, Apex, or theAPI.
5) isBefore Returns true if this trigger was fired before any record was saved.
6) isAfter Returns true if this trigger was fired after all records were saved.
7) isUndelete Returns true if this trigger was fired after a record is recovered from the Recycle Bin (that is, after an undelete operation from the Salesforce user interface, Apex, or the API.)
8) new Returns a list of the new versions of the sObject records.Note that this sObject list is only available in insert and update triggers, and the records can only be modified in before triggers.
9) newMap A map of IDs to the new versions of the sObject records. Note that this map is only available in before update, after insert, and after update triggers.
10) old Returns a list of the old versions of the sObject records.Note that this sObject list is only available in update and delete triggers.
11) oldMap A map of IDs to the old versions of the sObject records.Note that this map is only available in update and delete triggers.
12) size The total number of records in a trigger invocation, both old and new.
Sample trigger
trigger AccountTrigger on Account( after insert, after update, before insert, before update) { AccountTriggerHandler handler = new AccountTriggerHandler(Trigger.isExecuting, Trigger.size); if( Trigger.isInsert ) { if(Trigger.isBefore) { handler.OnBeforeInsert(trigger.New); } else { handler.OnAfterInsert(trigger.New); } } else if ( Trigger.isUpdate ) { if(Trigger.isBefore) { handler.OnBeforeUpdate(trigger.New ,trigger.Old,Trigger.NewMap,Trigger.OldMap); } else { handler.OnAfterUpdate(trigger.New ,trigger.Old,Trigger.NewMap,Trigger.OldMap); } } }Create one Trigger Handler Class
Create one Trigger Action Class
public without sharing class AccountActions { public static void updateContact ( List<Account> newAccount) { // Add your logic here } }SourcePlease check below post for full example of Trigger
http://amitsalesforce.blogspot.in/2015/06/trigger-best-practices-sample-trigger.html
Please let us know if this will help you.