Salesforce 邮件发送

371 阅读1分钟

本人在实际业务的开发中,Apex发送邮件主要分2类:一是直接构建邮件类,二是引用邮件模板。第二种情况会用得更多,主要是可配置,没有硬编码的原因。

1.Messaging.SingleEmailMessage 直接构建邮件实体

Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.setToAddresses(new List<String>{'xxx@163.com'});   // 收件人
message.setSubject('邮件主题');
message.setHtmlBody('邮件h5内容');
// message.setCcAddresses(new List<String>{'yyy@163.com'});  // 抄送人
// message.setFileAttachments(List<Messaging.EmailFileAttachment>);   // 携带附件
Messaging.sendEmail(new List<Messaging.Email>{message});

之前开发遇到携带的附件刚好是一个VF页面,只要获取VF Content就可以把它当成附件丢件邮件附件

// 获取VF页面
PageReference page = Page.TestVF;
page.getParameters().put('tid', '123');  // 传参

// 构造邮件附件
List<Messaging.EmailFileAttachment> emailAttachList = new List<Messaging.EmailFileAttachment();
Messaging.EmailFileAttachment emlAtt = new Messaging.EmailFileAttachment();
emlAtt.setFilename('test.xls');
emlAtt.setBody(page.getContent());
emlAtt.setContentType('application/vnd.ms-excel');
emailAttachList.add(emlAtt);

2.通过配置邮件模板,构建邮件实体

(1)在Salesforce后台配置“Classic电子邮件模板”,它支持读取某个对象的所有字段信息,当你构建它时,只需传入记录Id,不过。实际的邮件内容可能涉及到多个对象,好像就行不通了,如果多个对象间有关联可以通过创建“公式字段”间接解决这个问题 image.png

(2)Apex发送邮件

EmailTemplate et = [select Subject,HtmlValue from EmailTemplate WHERE DeveloperName='Test'];
// whoId:UserId, whatId:RecordId
Messaging.SingleEmailMessage message = Messaging.renderStoredEmailTemplate(et.Id, whoId, whatId);  // templateId whoId whatId
message.setSaveAsActivity(false);
message.setUseSignature(false);
// message.setToAddresses(new List<String>{'xxx@163.com'});  // 除了发送给whoId,还可以继续添加收件人
Messaging.sendEmail(new List<Messaging.Email>{message});

3.继第二种方法,做了点小变动

如果不想建字段,直接在配置邮件模板的时候,通过以下方式配置,然后在Apex用String.format()方法填充模板内容,可以理解为前面两种方法的结合。

image.png

EmailTemplate et = [select name,HtmlValue,Subject from EmailTemplate where DeveloperName = 'Test'];

String html = String.format(et.HtmlValue, new List<Object>{'https://www.google.com', 'google'});

Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.setToAddresses(new List<String>{'xxx@163.com'});
message.setSubject(et.Subject);
message.setHtmlBody(html);
Messaging.sendEmail(new List<Messaging.Email>{message});

参考文档:1.Messaging Class