在salesforce開發(fā)中,發(fā)送郵件是一個(gè)很常見的功能。比如在進(jìn)入審批流以后的通過和拒絕的操作需要發(fā)送郵件給記錄的owner,和其他系統(tǒng)交互以后更改了某些狀態(tài)通知相關(guān)的User或者Contact等等??梢哉f,發(fā)送郵件在業(yè)務(wù)上是一個(gè)必不可少的環(huán)節(jié)。
salesforce提供了多種發(fā)送郵件的方式,比如SingleEmail,MassEmail,這里主要說一下SingleEmail.
SingleEmail操作位于Messaging.SingleEmailMessage類中,主要有兩種方式發(fā)送郵件,一個(gè)是可以通過模板,一個(gè)是不需要借助模板。這里主要說一下相關(guān)主要方法:
public Void setToAddresses(String[] toAddresses):設(shè)置接收人的email地址;
public Void setCcAddresses(String[] ccAddresses):設(shè)置抄送人的email地址;
public Void setBccAddresses(String[] bccAddresses):設(shè)置私密抄送人的email地址;
public Void setCharset(String characterSet):設(shè)置email的內(nèi)容的編碼;
public Void setTargetObjectId(ID targetObjectId):當(dāng)使用email template時(shí),此方法是必須使用的。ID可以為contact/lead/user.默認(rèn)email會(huì)發(fā)送此ID。而且使用此方法發(fā)送郵件,不會(huì)使email limit 加1,所以如果只是給org內(nèi)部的user或者contact發(fā)送,可以使用此種方式減少一些相關(guān)限制。
public Void setSaveAsActivity(Boolean saveAsActivity):如果設(shè)置了targetObjectId,則需要對(duì)它賦值為false,默認(rèn)為true;
public void setTreatTargetObjectAsRecipient(Boolean treatAsRecipient):設(shè)置targetObjectId是否作為接收人接收此郵件,默認(rèn)是true,如果不想將targetObjectId作為接收人,則設(shè)置為false;
public Void setPlainTextBody(String plainTextBody):設(shè)置郵件body內(nèi)容,如果body內(nèi)容為普通的文本;
public Void setSubject(String subject):設(shè)置郵件標(biāo)題;
public void setEntityAttachments(List<String> ids):設(shè)置郵件的附件,參數(shù)可以傳遞document ids;
public Void setTemplateId(ID templateId):設(shè)置email的template,可以通過模板發(fā)送相關(guān)郵件,如果使用email的template并且里面沒有相關(guān)的format,可以不用設(shè)置body和subject;
public Void setHtmlBody(String htmlBody):設(shè)置郵件的body,如果body內(nèi)容為html內(nèi)容;
public Void setWhatId(ID whatId):如果template中使用了merge field,可以指定需要引用的object的ID,比如模板中使用了{(lán)!Account.Name},則需要設(shè)置whatId項(xiàng)為account的ID;
public Void setSenderDisplayName(String displayName):設(shè)置郵件的發(fā)件人的顯示名稱;
public Void setReplyTo(String replyAddress):設(shè)置接收人回復(fù)郵件的email地址;
其他方法可以自行查看。下面內(nèi)容為不使用模板和使用模板demo.
一.不使用郵件模板
1.發(fā)送普通文本郵件:此方法會(huì)發(fā)送郵件給targetObjectId設(shè)置的User/Contact/lead對(duì)應(yīng)的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內(nèi)部User/Contact/Lead發(fā)郵件,email limit的count不加1 email.setSaveAsActivity(false);//如果設(shè)置targetObjectId,則必須設(shè)置setSaveAsActivity為false Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{email}); }
2.發(fā)送html格式郵件:發(fā)送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">測(cè)試html body內(nèi)容</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
使用模板方式在發(fā)送郵件中使用很多,可以在setup->搜索email template即可設(shè)置email template.
1.Text類型template,使用merge field:使用merge field,需要在程序中引用相關(guān)的template并且設(shè)置相關(guān)引用的object設(shè)置給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:如果有些地方參數(shù)希望程序動(dòng)態(tài)傳入,可以使用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寫內(nèi)容的時(shí)候可以將meta倒下來(lái)寫好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方式:代碼不是萬(wàn)能的,但是沒有代碼是萬(wàn)萬(wàn)不能的,遇到惡心的html不好解決的,可以使用visualforce方式搞定,visualforce方式不可以應(yīng)用到MassEmail中。其中:
1.頭標(biāo)簽必須為messaging:emailTemplate;
2.recipientType設(shè)置需要引用的是Contact/User/Lead中的哪種,類似email中的setTargetObjectId();
3.relatedToType設(shè)置需要引用的其他的object的field,類似email中的setWhatId();
4.使用到User/Contact/Lead字段的地方,使用{!recipient.field_name__c}來(lái)代替;
5.使用到其他的object的字段的地方,使用{!relatedTo.field_name__c}來(lái)代替;
<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>
郵件的調(diào)用方式和其他的調(diào)用方式相同,但是搜索emailtemplate的subject和body會(huì)變成空。
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的相關(guān)限制可參看:https://help.salesforce.com/articleView?id=merge_fields_email_templates.htm&type=0
總結(jié):本篇主要描述SingleEmailMessaging的使用以及template的用法,篇中有描述錯(cuò)誤的地方歡迎指出,不懂得地方歡迎留言。
作者:zero
博客地址:http://www.cnblogs.com/zero-zyq/
本文歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接
個(gè)人下載了一些相關(guān)學(xué)習(xí)的PDF文件,如果需要下載請(qǐng)?jiān)L問百度云 點(diǎn)擊此處訪問 密碼:jhuy
如果文章的內(nèi)容對(duì)你有幫助,歡迎點(diǎn)贊~