在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地址

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

  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});
    }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

2.發(fā)送html格式郵件:發(fā)送html格式郵件給toAddresses的user

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

    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});
    }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

二.使用郵件模板

郵件的template  salesforce提供了4種類型方式:Text/HTML (using Letterhead)/Custom (without using Letterhead)/Visualforce

使用模板方式在發(fā)送郵件中使用很多,可以在setup->搜索email template即可設(shè)置email template.

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

1.Text類型template,使用merge field:使用merge field,需要在程序中引用相關(guān)的template并且設(shè)置相關(guān)引用的object設(shè)置給whatId.

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

 

 

 

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

    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});
    }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

2.Text類型template使用format:如果有些地方參數(shù)希望程序動(dòng)態(tài)傳入,可以使用format方式傳入,html類型也可以使用,下面不做解釋;

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

    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});
    }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

3.Html類型template:使用html template寫內(nèi)容的時(shí)候可以將meta倒下來(lái)寫好html以后在deploy上去

 iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

    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});

    }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

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)代替;

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

<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>

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

郵件的調(diào)用方式和其他的調(diào)用方式相同,但是搜索emailtemplate的subject和body會(huì)變成空。

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

    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});
    }

iOS培訓(xùn),Swift培訓(xùn),蘋果開發(fā)培訓(xùn),移動(dòng)開發(fā)培訓(xùn)

使用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)贊~