salesforce 零基礎學習(六十七)SingleEmailMessage 那點事


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM