在salesforce開發中,發送郵件是一個很常見的功能。比如在進入審批流以后的通過和拒絕的操作需要發送郵件給記錄的owner,和其他系統交互以后更改了某些狀態通知相關的User或者Contact等等。可以說,發送郵件在業務上是一個必不可少的環節。
salesforce提供了多種發送郵件的方式,比如SingleEmail,MassEmail,這里主要說一下SingleEmail.
SingleEmail操作位於Messaging.SingleEmailMessage類中,主要有兩種方式發送郵件,一個是可以通過模板,一個是不需要借助模板。這里主要說一下相關主要方法:
- public Void setToAddresses(String[] toAddresses):設置接收人的email地址;
- public Void setCcAddresses(String[] ccAddresses):設置抄送人的email地址;
- public Void setBccAddresses(String[] bccAddresses):設置私密抄送人的email地址;
- public Void setCharset(String characterSet):設置email的內容的編碼;
- public Void setTargetObjectId(ID targetObjectId):當使用email template時,此方法是必須使用的。ID可以為contact/lead/user.默認email會發送此ID。而且使用此方法發送郵件,不會使email limit 加1,所以如果只是給org內部的user或者contact發送,可以使用此種方式減少一些相關限制。
- public Void setSaveAsActivity(Boolean saveAsActivity):如果設置了targetObjectId,則需要對它賦值為false,默認為true;
- public void setTreatTargetObjectAsRecipient(Boolean treatAsRecipient):設置targetObjectId是否作為接收人接收此郵件,默認是true,如果不想將targetObjectId作為接收人,則設置為false;
- public Void setPlainTextBody(String plainTextBody):設置郵件body內容,如果body內容為普通的文本;
- public Void setSubject(String subject):設置郵件標題;
- public void setEntityAttachments(List<String> ids):設置郵件的附件,參數可以傳遞document ids;
- public Void setTemplateId(ID templateId):設置email的template,可以通過模板發送相關郵件,如果使用email的template並且里面沒有相關的format,可以不用設置body和subject;
- public Void setHtmlBody(String htmlBody):設置郵件的body,如果body內容為html內容;
- public Void setWhatId(ID whatId):如果template中使用了merge field,可以指定需要引用的object的ID,比如模板中使用了{!Account.Name},則需要設置whatId項為account的ID;
- public Void setSenderDisplayName(String displayName):設置郵件的發件人的顯示名稱;
- public Void setReplyTo(String replyAddress):設置接收人回復郵件的email地址;
其他方法可以自行查看。下面內容為不使用模板和使用模板demo.
一.不使用郵件模板
1.發送普通文本郵件:此方法會發送郵件給targetObjectId設置的User/Contact/lead對應的email地址
public void sendEmailWithoutEmailTemplateToOrgUsers() { Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); email.setSenderDisplayName('the sender name you want to show'); email.setPlainTextBody('test email text'); email.setSubject('test email subject'); email.setTargetObjectId('00528000002MLtt');//使用此種方式給org內部User/Contact/Lead發郵件,email limit的count不加1 email.setSaveAsActivity(false);//如果設置targetObjectId,則必須設置setSaveAsActivity為false Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
2.發送html格式郵件:發送html格式郵件給toAddresses的user
public void sendEmailWithoutEmailTemplateToExtraUser() { Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); email.setSenderDisplayName('the sender name you want to show'); email.setHtmlBody('<span color="red">測試html body內容</span>'); email.setSubject('test email subject use html'); //addresses which you wanna send to List<String> toAddresses = new List<String>(); toAddresses.add('xx@qq.com'); email.setToAddresses(toAddresses); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
二.使用郵件模板
郵件的template salesforce提供了4種類型方式:Text/HTML (using Letterhead)/Custom (without using Letterhead)/Visualforce
使用模板方式在發送郵件中使用很多,可以在setup->搜索email template即可設置email template.
1.Text類型template,使用merge field:使用merge field,需要在程序中引用相關的template並且設置相關引用的object設置給whatId.
public void sendEmailWithTextTemplateUseMergeField() { EmailTemplate temp = [ SELECT Id, Name, Subject, HtmlValue, Body, BrandTemplateId FROM EmailTemplate WHERE DeveloperName = 'Test_Text_With_Merge_Field' LIMIT 1 ]; Contact con = [SELECT Id FROM Contact where name = 'york zhang']; Goods__c goods = [select Id,GoodsName__c from Goods__c where GoodsName__c != null limit 1]; Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); //set display name,the value will show sender name email.setSenderDisplayName('the sender name you want to show'); //if use template,targetObjectId will be required email.setTargetObjectId(con.Id); //for default,the email will send to targetObject's email, //if you don't want to send target object (user/contact/lead),just setTreatTargetObjectAsRecipient false email.setTreatTargetObjectAsRecipient(false); //if target object id is user or contact,set saveAsActivity false email.setSaveAsActivity(false); //set merge object id only if target object instanceof contact email.setWhatId(goods.Id); //set template id email.setTemplateId(temp.Id); List<String> toAddresses = new List<String>{'xx@qq.com'}; email.setToAddresses(toAddresses); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
2.Text類型template使用format:如果有些地方參數希望程序動態傳入,可以使用format方式傳入,html類型也可以使用,下面不做解釋;
public void sendEmailWithTextTemplateUseFormat() { EmailTemplate temp = [ SELECT Id, Name, Subject, HtmlValue, Body, BrandTemplateId FROM EmailTemplate WHERE DeveloperName = 'Test_Text_With_Format' LIMIT 1 ]; String subjectFormat = String.format(temp.Subject, new List<String>{'test subject title'}); String bodyFormat = String.format(temp.Body,new List<String>{'test param1','test param2'}); Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); Contact con = [SELECT Id FROM Contact where name = 'york zhang']; email.setTargetObjectId(con.Id); email.setSaveAsActivity(false); email.setSubject(subjectFormat); email.setPlainTextBody(bodyFormat); email.setTemplateId(temp.Id); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
3.Html類型template:使用html template寫內容的時候可以將meta倒下來寫好html以后在deploy上去
public void sendEmailWithHtmlTemplateUseFormat() { EmailTemplate temp = [ SELECT Id, Name, Subject, HtmlValue, Body, BrandTemplateId FROM EmailTemplate WHERE DeveloperName = 'Test_Text_With_Html' LIMIT 1 ]; String subjectFormat = String.format(temp.Subject, new List<String>{'test subject title'}); String bodyFormat = String.format(temp.HtmlValue,new List<String>{'test param1','test param2'}); Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); Contact con = [SELECT Id FROM Contact where name = 'york zhang']; email.setTargetObjectId(con.Id); email.setSaveAsActivity(false); email.setSubject(subjectFormat); email.setHtmlBody(bodyFormat); email.setTemplateId(temp.Id); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
4.Visualforce方式:代碼不是萬能的,但是沒有代碼是萬萬不能的,遇到惡心的html不好解決的,可以使用visualforce方式搞定,visualforce方式不可以應用到MassEmail中。其中:
1.頭標簽必須為messaging:emailTemplate;
2.recipientType設置需要引用的是Contact/User/Lead中的哪種,類似email中的setTargetObjectId();
3.relatedToType設置需要引用的其他的object的field,類似email中的setWhatId();
4.使用到User/Contact/Lead字段的地方,使用{!recipient.field_name__c}來代替;
5.使用到其他的object的字段的地方,使用{!relatedTo.field_name__c}來代替;
<messaging:emailTemplate subject="Test Subject Use Visualforce Component" language="{!recipient.Languages__c}" recipientType="Contact" relatedToType="Goods__c"> <messaging:htmlEmailBody> <style type="text/css"> p { border: 3px; background: #cccccc; } </style> <div> this is a visualforce component email template </div> <div> <p>{!$ObjectType.Goods__c.Fields.GoodsName__c.Label} : {!relatedTo.GoodsName__c}</p> <p>{!$ObjectType.Contact.Fields.Name.Label} : {!recipient.Name}</p> </div> </messaging:htmlEmailBody> <messaging:attachment filename="ExportGoods.csv"> <apex:repeat value="{!relatedTo}" var="goods"> {!goods.GoodsName__c} {!goods.GoodsBrand__c} </apex:repeat> </messaging:attachment> </messaging:emailTemplate>
郵件的調用方式和其他的調用方式相同,但是搜索emailtemplate的subject和body會變成空。
public void sendEmailWithVisualforceComponent() { EmailTemplate temp = [ SELECT Id, Name, Subject, HtmlValue, Body, BrandTemplateId FROM EmailTemplate WHERE DeveloperName = 'Test_Email_Template_With_Component' LIMIT 1 ]; //String subjectFormat = String.format(temp.Subject, new List<String>{'test subject title'}); Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); Contact con = [SELECT Id FROM Contact where name = 'york zhang']; Goods__c goods = [select id from Goods__c limit 1]; email.setTargetObjectId(con.Id); email.setSaveAsActivity(false); email.setWhatId(goods.Id); email.setTemplateId(temp.Id); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
使用email template的相關限制可參看:https://help.salesforce.com/articleView?id=merge_fields_email_templates.htm&type=0
總結:本篇主要描述SingleEmailMessaging的使用以及template的用法,篇中有描述錯誤的地方歡迎指出,不懂得地方歡迎留言。