ここでは、RayBarcodeを使ってバーコードやQRコードをメールに埋め込んで送信する方法を説明します。GraepCity Barcodeではバーコードの画像を生成できますが、生成したバーコードを保存する機能はないため、その部分の開発が必要です。
ここでは、次の2つの方法を説明します。
どちらの方法もSalesforce ClassicとLightning Experienceで使用できます。
ここでは、「キャンペーン」の画面に「参加証の送付」ボタンを追加し、ユーザーがそのボタンをクリックしたときにキャンペーンメンバー内の該当者一覧と「メール送信」「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>
バーコードを送信直前に生成できないか。
事前に「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.