如何在Salesforce Flow中通过Apex邮件发送Ext39B条形码(无需存图)
解决方案:无需存储图片生成Code39B条形码并通过Flow Apex邮件发送
方案1:Apex直接生成Base64嵌入邮件(推荐)
这个方案不需要将图片存储到Salesforce,直接在Apex中生成Code39B条形码的Base64编码,作为Data URL嵌入邮件HTML,全程在Salesforce内部完成。
步骤1:编写Apex条形码生成类
实现Code39B的编码逻辑,将输入字符串转换为Base64格式的PNG图片Data URL。以下是可复用的示例代码:
public class Code39BarcodeGenerator { // Code39B完整字符编码映射 private static final Map<String, String> CODE39_MAP = new Map<String, String>{ '*' => '100010100', '0' => '101001100', '1' => '110010100', '2' => '100101100', '3' => '110101000', '4' => '100110100', '5' => '110110000', '6' => '101010100', '7' => '111010000', '8' => '101101000', '9' => '111001000', 'A' => '100011010', 'B' => '110001010', 'C' => '100100110', 'D' => '110100100', 'E' => '100110010', 'F' => '110110000', 'G' => '100010011', 'H' => '110010010', 'I' => '100100011', 'J' => '110100010', 'K' => '100011001', 'L' => '110011000', 'M' => '100111000', 'N' => '110111000', 'O' => '100010110', 'P' => '110001100', 'Q' => '100101100', 'R' => '110101100', 'S' => '100110100', 'T' => '110110100', 'U' => '110001001', 'V' => '100100101', 'W' => '110100101', 'X' => '100110101', 'Y' => '110110101', 'Z' => '100011011', '-' => '110001101', '.' => '100100111', ' ' => '110100111', '$' => '100110111', '/' => '110110111', '+' => '100011101', '%' => '110011100' }; public static String generateBase64Code39(String input) { if (String.isBlank(input)) { throw new IllegalArgumentException('输入字符串不能为空'); } // Code39要求首尾添加*作为起始/终止符 String code39Input = '*' + input.toUpperCase() + '*'; List<String> encodedBits = new List<String>(); // 编码每个字符 for (Integer i = 0; i < code39Input.length(); i++) { String charStr = code39Input.substring(i, i+1); if (!CODE39_MAP.containsKey(charStr)) { throw new IllegalArgumentException('不支持的字符:' + charStr); } encodedBits.add(CODE39_MAP.get(charStr)); } // 生成条形码图片并转换为Base64(这里使用简化的图片生成逻辑,可根据需求调整尺寸) Integer barHeight = 60; Integer barWidth = 2; Integer totalWidth = (encodedBits.size() * (9 * barWidth) + (encodedBits.size() - 1) * barWidth); Blob barcodeImage = generateBarcodeImage(encodedBits, barWidth, barHeight, totalWidth); return 'data:image/png;base64,' + EncodingUtil.base64Encode(barcodeImage); } private static Blob generateBarcodeImage(List<String> encodedBits, Integer barWidth, Integer barHeight, Integer totalWidth) { // 使用Apex Graphics API生成条形码图片 PageReference pageRef = new PageReference('/apex/BarcodeRenderer'); pageRef.getParameters().put('bits', String.join(encodedBits, ',')); pageRef.getParameters().put('bw', String.valueOf(barWidth)); pageRef.getParameters().put('bh', String.valueOf(barHeight)); pageRef.getParameters().put('tw', String.valueOf(totalWidth)); return pageRef.getContent(); } }
配套的Visualforce页面BarcodeRenderer用于绘制图片:
<apex:page contentType="image/png" cache="true"> <script type="text/javascript"> var bits = "{!$CurrentPage.parameters.bits}".split(','); var barWidth = parseInt("{!$CurrentPage.parameters.bw}"); var barHeight = parseInt("{!$CurrentPage.parameters.bh}"); var totalWidth = parseInt("{!$CurrentPage.parameters.tw}"); var canvas = document.createElement('canvas'); canvas.width = totalWidth; canvas.height = barHeight; var ctx = canvas.getContext('2d'); ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, totalWidth, barHeight); var x = 0; bits.forEach(function(bitStr) { for (var i = 0; i < bitStr.length; i++) { ctx.fillStyle = bitStr[i] === '1' ? '#000000' : '#ffffff'; ctx.fillRect(x, 0, barWidth, barHeight); x += barWidth; } x += barWidth; // 字符间间隔 }); var dataURL = canvas.toDataURL('image/png'); document.write('<img src="' + dataURL + '" />'); </script> </apex:page>
步骤2:在Flow中调用Apex类并生成邮件
- 在Flow中添加「Apex Action」,引用
Code39BarcodeGenerator类的generateBase64Code39方法,传入你生成的字符串(如998798474610237811)。 - 将返回的Base64字符串存入Flow变量(如
base64Barcode)。 - 配置「发送邮件」的Apex动作,构造HTML格式的邮件内容,嵌入条形码图片:
<p>您好,您的Code39B条形码如下:</p> <img src="{!$Flow.base64Barcode}" alt="Code39B条形码" style="height: 60px;"> <p>其他信息:{!$Flow.otherVariable}</p>
方案2:结合AMPscript与Marketing Cloud模板(需集成)
如果你的组织已使用Salesforce Marketing Cloud,可以通过AMPscript的BarcodeURL函数动态生成条形码,无需存储图片。
步骤1:创建Marketing Cloud邮件模板
在Marketing Cloud中创建包含AMPscript的HTML模板,生成Code39B条形码:
%%[ set @barcodeValue = AttributeValue("BarcodeString") // 参数说明:值、条形码类型、宽度因子、高度、前景色、背景色 set @barcodeUrl = BarcodeURL(@barcodeValue, "code39", 2, 80, "#000000", "#FFFFFF") ]%% <p>您的条形码:</p> <img src="%%=v(@barcodeUrl)=%%" alt="Code39B条形码"> <p>其他信息:%%=AttributeValue("OtherVariable")=%%</p>
步骤2:在Flow的Apex邮件中引用模板
将Marketing Cloud模板同步到Salesforce后,在Flow的Apex邮件动作中设置模板ID,并传入合并字段值:
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); // 设置同步后的Marketing Cloud模板ID mail.setTemplateId('00XXXXXXXXXXXXXXXX'); // 传入条形码字符串和其他变量 Map<String, String> mergeFields = new Map<String, String>{ 'BarcodeString' => '998798474610237811', 'OtherVariable' => '自定义内容' }; mail.setMergeFields(mergeFields); // 设置收件人、相关记录等 mail.setTargetObjectId('005XXXXXXXXXXXXXXX'); mail.setWhatId('001XXXXXXXXXXXXXXX'); Messaging.sendEmail(new List<Messaging.SingleEmailMessage>{mail});
注意事项
- 方案1的Visualforce页面需确保有访问权限,可根据需求调整条形码的尺寸和样式。
- 主流邮件客户端(Outlook、Gmail等)均支持Data URL嵌入图片,兼容性无需担心。
- 方案2需完成Salesforce与Marketing Cloud的集成,确保模板和合并字段同步正常。
内容的提问来源于stack exchange,提问作者pluto_99
相关产品推荐
相关产品推荐

