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
相关产品推荐
相关产品推荐

