You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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类并生成邮件

  1. 在Flow中添加「Apex Action」,引用Code39BarcodeGenerator类的generateBase64Code39方法,传入你生成的字符串(如998798474610237811)。
  2. 将返回的Base64字符串存入Flow变量(如base64Barcode)。
  3. 配置「发送邮件」的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:44:54