Send Email

ここでは、RayBarcodeを使ってバーコードやQRコードをメールに埋め込んで送信する方法を説明します。GraepCity Barcodeではバーコードの画像を生成できますが、生成したバーコードを保存する機能はないため、その部分の開発が必要です。

ここでは、次の2つの方法を説明します。

  • RayBarcodeで生成したバーコードをPDFファイルに埋め込み、そのPDFファイルをメールの添付ファイルとして送信する。
  • RayBarcodeで生成したバーコードをBASE64文字列に変換し、HTMLメールのIMGタグで表示する。

どちらの方法もSalesforce ClassicとLightning Experienceで使用できます。

メール添付ファイルでのPDFの送信

ここでは、「キャンペーン」の画面に「参加証の送付」ボタンを追加し、ユーザーがそのボタンをクリックしたときにキャンペーンメンバー内の該当者一覧と「メール送信」「PDFのプレビュー」ボタンを表示します。キャンペーンメンバーは「状況」が「登録」になっている、先頭100件です。メール送信の上限に達したかどうかなどのエラー処理は含まれていません。

次のコントローラー(Apexクラス)はQRコードを生成します。

// CreatePDFController.cls
public class attachmentPDF {
    private final CampaignMember campaignmember;
    private String token;
    
    public attachmentPDF(ApexPages.StandardController stdController) {
        this.campaignmember = (CampaignMember)stdController.getRecord();
    }

    // アクセストークンを更新する初期化処理
    public PageReference initialize() {
        // アクセストークンの更新
        gcbc.GcBarcodeGlobalAccessTokenGenerator.UpdateAccessToken();
        // アクセストークンの取得
        String tokenSettings = gcbc__GcBarcodeSetting__c.getInstance(UserInfo.getUserId()).gcbc__AccessToken__c;
        this.token = tokenSettings;
        return null;
    }
    
    // QRコードを生成するURLの取得
    public String getQRCodeImageURL() {
        String token = gcbc__GcBarcodeSetting__c.getInstance(UserInfo.getUserId()).gcbc__AccessToken__c;
        return 'https://gcbarcode.azurewebsites.net/api/Png/qrcode?Width=198&Height=198&value=' + this.campaignmember.Id + '&token=' + token;
    }                                  
}

次のVisualforceページはPDFを生成します。

<!-- attachmentPDF.vfp -->
<apex:page standardController="CampaignMember" extensions="attachmentPDF" renderAs="PDF" applyBodyTag="false" applyHtmlTag="false" showHeader="false" action="{!initialize}">
    <html>
    <head>
    <style>
        @page {
        size: letter;
        @top-center {
        content: "デモ";
        }
        @bottom-center {
        content: "ページ " counter(page) " / " counter(pages);
        }
        }
        .page-break {
        display:block;
        page-break-after:always;
        }
        body {
        font-family: Arial Unicode MS;
        }
    </style>
    </head>
    <body>

    <h1>オレンジ・インテリア オリジナル製品内覧会</h1><br />
    <h2>FN-秋 チャイルド設備 内覧会 参加証</h2>
    <apex:outputText>{!campaignmember.name} 様</apex:outputText>
    <br />
    <p>いつもお世話になっております。</p>
    <p>このたびは、児童福祉施設向け設備の内覧会に、お申し込みいただき、誠にありがとうございます。</p>
    <p>参加証をお送りいたしますので当日は、本ページを印刷するかスマートフォンなどで表示し、</p>
    <p>お名刺1枚と合わせて受付にお渡しください。</p>
    <p>それでは当日お会いできるのを楽しみにしております。</p>
    <p>開催日:2017年10月25日(水) 10:00 ~ 17:00 (受付開始:9:30)</p>
    <p>会場:東京都千代田区000-00 TOKYO ANOTHER SKYビルXXF</p>
    
    <apex:image url="{!QRCodeImageURL}" />
    
    <br />
    <br />
    <p>お問い合わせ先</p>
    <p>オレンジ・シティ株式会社 内覧会事務局</p>
    <p>メール:contact@orange.int.com</p>
    <p>電話:03-1111-1111</p>

    </body>
    </html>
</apex:page>

次のコントローラーはPDFファイルを添付したメールを送信します。 CampaignStandardController

public class sendInvitationByEmailAttachment {
    public List<CampaignMember> cMember {get;private set;}
    private final Campaign campaign;
    
    public sendInvitationByEmailAttachment(ApexPages.StandardController stdController) 
    {
        this.campaign = (Campaign)stdController.getRecord();
        if (null != this.campaign) {
            ID id = this.campaign.Id;
            this.cMember = [SELECT ID, Name, Email, Status, CampaignID From CampaignMember WHERE CampaignID = :id and Status = '登録' limit 100];
        }
        else {
            this.cMember = null;
        }
    }

    public string getSubject() {
        string result = '';
        Id templateId = '00X7F000000DuFo';
        EmailTemplate[] content = [SELECT ID, Name, Subject, Body, HtmlValue, Description FROM EmailTemplate WHERE ID = :templateId LIMIT 1];
        if (content.size() > 0) {
            result = content[0].Subject + ',' + content[0].Body;
        }
        return result;
    }

    public PageReference preview() {
         PageReference pdfPage = Page.attachmentPDF;
         return pdfPage;
    }

    public PageReference send() {
        if (null == this.campaign) return null;
        
        String subject = 'FN-秋 チャイルド設備 内覧会 参加証の送付';
        
        for (CampaignMember m : this.cMember) {
            PageReference pdf = Page.attachmentPDF;
            pdf.getParameters().put('id',(String)m.id);
            pdf.setRedirect(true);
            
            // Take the PDF content
            Blob b = pdf.getContent();
            
            // Create the email attachment
            Messaging.EmailFileAttachment efa = new Messaging.EmailFileAttachment();
            efa.setFileName('attachment.pdf');
            efa.setBody(b);
            
            //Create the email body
            String body = m.Name + ' 様\r\n\r\nいつもお世話になっております。\r\n\r\nこのたびは、児童福祉施設向け設備の内覧会に、お申し込みいただき、誠にありがとうございます。参加証をお送りいたしますので当日は、本ページを印刷するかスマートフォンなどで表示し、お名刺1枚と合わせて受付にお渡しください。それでは当日お会いできるのを楽しみにしております。\r\n\r\n\r\nお問い合わせ先\r\nオレンジ・シティ株式会社 内覧会事務局\r\nメール:contact@orange.int.com\r\n電話:03-1111-1111';
            
            // Sets the paramaters of the email
            String[] ToAddresses = new String[1];
            ToAddresses[0] = m.Email;
            Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage();

            // メールの件名を設定する 
            email.setSubject(subject);
            email.setToAddresses( ToAddresses );
            email.setPlainTextBody( body );
            // email.setTemplateIdは使えない?
            
            email.setFileAttachments(new Messaging.EmailFileAttachment[] {efa});
            
            // メールを送信する
            Messaging.SendEmailResult [] r = 
                Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});   
        }
        return null;
    }
}

次のVisualforceページは、メールの送付先の一覧と送信ボタンを表示します。

<!-- SendEmailAttachmentButtonsPage.vfp -->
<apex:page standardController="Campaign" extensions="sendInvitationByEmailAttachment">
    <apex:pageBlock title="PDF添付による参加証送付">
        <apex:pageBlockTable value="{!cMember}" var="member">
            <apex:column headerValue="名前 " value="{!member.Name}" />
            <apex:column headerValue="メール" value="{!member.Email}" />
            <apex:column headerValue="状況" value="{!member.Status}" />
        </apex:pageBlockTable>
        <apex:form>
            <br/>
            <br/>
            <apex:commandButton value="メールを送信(PDF添付)" action="{!send}"/> 
            <apex:commandButton value="PDFのプレビュー" action="{!preview}" /> 
        </apex:form>
    </apex:pageBlock>

        <apex:outputPanel id="singleScanOutput" layout="block">
        {!Subject}
    </apex:outputPanel>
</apex:page>
  • カスタムボタンの作成
  • ページレイアウトへのカスタムボタンの配置
  • 適切なファイル名

HTMLメールのIMGタグへの埋め込み

  • HTMLメールの内容をメールテンプレートに移動する?
  • バーコードを送信直前に生成できないか。

  • 事前に「QRcodeText__c」のロングテキストエリア型のカスタム項目が必要。

  • カスタムボタン

  • ページレイアウト

public class SendInvitationByHtmlEmail {
    public List<CampaignMember> cMember {get;private set;}
    private final Campaign campaign;
    private String token;
    
    public SendInvitationByHtmlEmail(ApexPages.StandardController stdController) 
    {
        this.campaign = (Campaign)stdController.getRecord();
        if (null != this.campaign) {
            ID id = this.campaign.Id;
            this.cMember = [SELECT ID, Name, Email, Status, CampaignID From CampaignMember WHERE CampaignID = :id and Status = '登録' limit 100];
        }
        else {
            this.cMember = null;
        }
    }

    public PageReference initialize() {
        gcbc.GcBarcodeGlobalAccessTokenGenerator.UpdateAccessToken();
        String tokenSettings = gcbc__GcBarcodeSetting__c.getInstance(UserInfo.getUserId()).gcbc__AccessToken__c;
        this.token = tokenSettings;
        return null;
    }

    public static String getQRCodeBase64(String url) {
        HttpRequest req = new HttpRequest();
        req.setEndpoint(url);
        req.setMethod('GET');
        Http binding = new Http();
        HttpResponse res = binding.send(req);
        Blob image = res.getBodyAsBlob();
        return EncodingUtil.base64Encode(image);
    }
    
    public PageReference sendHTML() {
        if (null == this.campaign) return null;

        String subject = 'FN-秋 チャイルド設備 内覧会 参加証の送付';
        
        for (CampaignMember m : this.cMember) {                 
            String body = '<h1>オレンジ・インテリア オリジナル製品内覧会</h1><h2>FN-秋 チャイルド設備 内覧会 参加証</h2><p>' + m.Name+ ' 様</p><p>いつもお世話になっております。</p></br><p>このたびは、児童福祉施設向け設備の内覧会に、お申し込みいただき、誠にありがとうございます。参加証をお送りいたしますので当日は、本ページを印刷するかスマートフォンなどで表示し、お名刺1枚と合わせて受付にお渡しください。それでは当日お会いできるのを楽しみにしております。</p></br><p>開催日:2017年10月25日(水) 10:00 ~ 17:00 (受付開始:9:30)</p><p>会場:東京都千代田区000-00 TOKYO ANOTHER SKYビルXXF</p><img src="data:image/png;base64,' + m.QRcodeText__c + '" /></br></br><p>お問い合わせ先</p><p>オレンジ・シティ株式会社 内覧会事務局</p><p>メール:contact@orange.int.com</p><p>電話:03-1111-1111</p>';            
            
            // Sets the paramaters of the email
            String[] ToAddresses = new String[1];
            ToAddresses[0] = m.Email;
            Messaging.SingleEmailMessage email = new Messaging.SingleEmailMessage(); 
            email.setSubject(subject);
            email.setToAddresses(ToAddresses);
            email.setHtmlBody(body);
            
            // Sends the email
            Messaging.SendEmailResult [] r = 
                Messaging.sendEmail(new Messaging.SingleEmailMessage[] {email});   
        }
        
        return null;
    }
    
    public PageReference generateQRCode() 
    {
        if (null == this.campaign) return null;

        Map<Id, String> barcodes = new Map<Id, String>();
        for (CampaignMember m : this.cMember) {
           String url = 'https://gcbarcode.azurewebsites.net/api/Png/qrcode?Width=198&Height=198&value='
                + m.Id + '&token=' + this.token;
            String b = SendInvitationByHtmlEmail.getQRCodeBase64(url);
            m.QRcodeText__c = b;
        }
        update this.cMember;

        return null;
    }
}
<!-- SendHtmlEmailButtonsPage.vfp -->
<apex:page standardController="Campaign" extensions="SendInvitationByHtmlEmail" action="{!initialize}">
    <apex:pageBlock title="HTMLメールによる参加証送付">
        <apex:pageBlockTable value="{!cMember}" var="member">
            <apex:column headerValue="名前 " value="{!member.Name}" />
            <apex:column headerValue="メール" value="{!member.Email}" />
            <apex:column headerValue="状況" value="{!member.Status}" />
        </apex:pageBlockTable>
        <apex:form ><br/><br/>
            <apex:commandButton value="送信(HTML埋込)" action="{!sendHTML}" />
            <apex:commandButton value="QRコード生成" action="{!generateQRCode}" />
        </apex:form>
    </apex:pageBlock>
</apex:page>

メールが正しく送信されたかどうかを確認するには、自分あてにもメールを送付するか、またはSalesforceの「設定 > 監視 > ログ > メールログファイル」を確認してください。

Copyright © MESCIUS inc. All rights reserved.