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

SendGrid动态模板Java调用:自定义主题与内容不显示问题

问题解决:SendGrid动态模板主题及内容不显示

核心问题分析

你的代码存在几个关键问题,导致动态模板无法正确渲染:

  • 无效的Mail构造参数:创建Mail对象时传入了未定义的subject变量,且动态模板模式下,无需在构造器中传入普通文本/HTML内容(这些内容会被模板覆盖,甚至干扰模板渲染)。
  • 缺少模板所需的动态数据:你的模板使用了{{#each content}}循环,但代码中未传递content数组类型的动态数据。
  • 主题设置冲突:同时设置了mail.setSubject()和personalization1.setSubject(),且未将subject作为动态数据传入模板,导致模板中的{{subject}}无法取值。

修正后的代码

import com.sendgrid.Method;
import com.sendgrid.Request;
import com.sendgrid.Response;
import com.sendgrid.SendGrid;
import com.sendgrid.helpers.mail.Mail;
import com.sendgrid.helpers.mail.objects.Email;
import com.sendgrid.helpers.mail.objects.Personalization;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WithMailHelper {
    public static void main(String[] args) throws IOException {
        Email from = new Email("xxxx@xyz.com");
        // 动态模板模式下,Mail构造器无需传入主题和普通内容
        Mail mail = new Mail(from, null, null, null);

        // 设置动态模板ID
        mail.setTemplateId("d-abcdefghijk");

        final Personalization personalization1 = new Personalization();
        personalization1.addTo(new Email("abc@xyz.com", "ABCDEF GHIJK"));
        
        // 传递模板所需的动态数据
        personalization1.addDynamicTemplateData("name", "ABC");
        personalization1.addDynamicTemplateData("city", "XYZ");
        // 传递主题数据,对应模板中的{{subject}}
        personalization1.addDynamicTemplateData("subject", "testing subject thru personalization");
        
        // 构建模板循环需要的content数组
        List<Map<String, String>> contentList = new ArrayList<>();
        Map<String, String> contentItem1 = new HashMap<>();
        contentItem1.put("type", "示例类型1");
        contentItem1.put("value", "示例内容1");
        contentList.add(contentItem1);
        
        Map<String, String> contentItem2 = new HashMap<>();
        contentItem2.put("type", "示例类型2");
        contentItem2.put("value", "示例内容2");
        contentList.add(contentItem2);
        personalization1.addDynamicTemplateData("content", contentList);

        mail.addPersonalization(personalization1);

        SendGrid sg = new SendGrid("SG.KEYVALUEPAIRAPI");
        Request request = new Request();
        try {
            request.setMethod(Method.POST);
            request.setEndpoint("mail/send");
            System.out.println(mail.build());
            request.setBody(mail.build());
            Response response = sg.api(request);
            System.out.println("status code: " + response.getStatusCode());
            System.out.println("response body: " + response.getBody());
            System.out.println("response header : " + response.getHeaders());
        } catch (IOException ex) {
            System.out.println("inside exception" + ex.getMessage());
            throw ex;
        }
    }
}

关键修改说明

  • 简化Mail对象初始化:动态模板模式下,无需传入普通文本/HTML内容,SendGrid会完全使用模板渲染邮件。
  • 补充模板所需动态数据:添加了content数组,匹配模板中的{{#each content}}循环逻辑,确保循环内容能正常渲染。
  • 统一主题传递方式:将subject作为动态模板数据传入,对应模板中的{{subject}}变量,避免设置冲突。
  • 移除冗余Content:删除了mail.addContent()的调用,防止普通内容干扰模板渲染。

内容的提问来源于stack exchange,提问作者Harsha Shivakumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 20:35:42