在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的用法,篇中有描述错误的地方欢迎指出,不懂得地方欢迎留言。

salesforce 零基础学习(六十七)SingleEmailMessage 那点事的更多相关文章

  1. 【转】【Salesforce】salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  2. salesforce 零基础学习(十七)Trigger用法

    看本篇之前可以相应阅读以下Trigger相关文章: 1.https://developer.salesforce.com/page/Trigger_Frameworks_and_Apex_Trigge ...

  3. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

  4. salesforce零基础学习(八十七)Apex 中Picklist类型通过Control 字段值获取Dependent List 值

    注:本篇解决方案内容实现转自:http://mysalesforceescapade.blogspot.com/2015/03/getting-dependent-picklist-values-fr ...

  5. salesforce 零基础学习(六十八)http callout test class写法

    此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...

  6. salesforce零基础学习(九十六)Platform Event浅谈

    本篇参考:https://developer.salesforce.com/blogs/2018/07/which-streaming-event-do-i-use.html https://trai ...

  7. salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见

    项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...

  8. salesforce零基础学习(一百零五)Change Data Capture

    本篇参考: https://developer.salesforce.com/docs/atlas.en-us.232.0.api_streaming.meta/api_streaming/using ...

  9. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

  10. salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件

    在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...

随机推荐

  1. (译)AngularJS1.3.0 开发者指南(四) -- 控制器

    理解Controllers 在AngularJS中, Controller是一个Javascript构造函数, 常常被用来扩展 Angular Scope 对象. 控制器通过 ng-controlle ...

  2. block、inline、inline-block对比

    display:block 1.block元素会独占一行,多个block元素会各种新起一行.默认情况下,block元素宽度自动填满其父元素容器: 2.block元素可以设置width和height属性 ...

  3. Input file 文本框美化

    HTML原生的input file 上传按钮有多(无)不(力)漂(吐)亮(槽)我就不多说了.大家几乎在项目中都会有遇到图片.等文件需要上传的地方,好看的文件上传按钮会使人身心愉悦(我瞎说的).好了不多 ...

  4. 【WC2015】混淆与破解 (Goldreich-Levin 算法)

    这个嘛= =直接贴VFK的题解就行了吧,感觉自己还是差别人太多 http://vfleaking.blog.uoj.ac/blog/104 讲得挺明白了的说,但还是挺难理解的说,中间实现部分简直不要太 ...

  5. [Noi2014]魔法森林( 动态mst lct)

    以前一直觉得lct特别难写,自从学了丽洁姐的lct之后,觉得lct居然能这么短,这个主程序能40行左右解决~~~~ 这道嘛~~虽说能用spfa解决,但还是写下lct吧 把边按a值排序后一条一条插入并维 ...

  6. php分页查询

    1.先把数据库里所有的数据分页显示在页面,并在显示数据的表格上方加上查询表单. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transit ...

  7. 前端跨域方案-跨域请求代理(node服务)

    前端开发人员在本地搭建node服务,调用接口首先走本地服务,然后转发到api站点,node服务代码如下: var express = require('express'), request = req ...

  8. 把时间还给洞察,且看PPT调研报告自动生成攻略

    文/JSong @2017.02.28 在数据分析里面有一句话是说,80%的时间要用于数据清洗和整理,而我觉得理想的状态应该是把更多的把时间花在数据背后的洞察当中.去年11月在简书占了个坑,说要自己写 ...

  9. spring mvc 结合 Hessian 配置

    spring mvc 结合 Hessian 配置 1.先在web.xml中配置 <!-- Hessian配置 --> <servlet> <servlet-name> ...

  10. 基础数据结构-串-KMP算法

    KMP算法用于模式串字符匹配,因为没有提前预习,上课时听得云里雾里,后来回去看了一晚上,翻了一些网上的讲解才理解了.我简单讲一下,我们在一串字符串A里搜索匹配另一段字符串B时,思路最简单方法的就是从第 ...