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

如何以Sendgrid API接受的格式在JSON中嵌入HTML?

解决SendGrid API请求中正确嵌入HTML的问题

我之前也踩过一模一样的坑!核心问题在于你可能一直在手动处理JSON字符串,或者用了错误的转义方式——SendGrid的API需要的是原始的HTML内容,但你尝试的那些方法要么把HTML标签转成了普通文本,要么直接破坏了JSON的格式。

正确姿势:用Go结构体序列化,彻底避免手动拼接JSON

别再自己拼JSON字符串了,用Go的结构体来对应SendGrid的请求格式,然后靠json.Marshal自动处理序列化,这是最稳妥的方式,完全不会出错。

首先定义和SendGrid API匹配的结构体:

package main

import (
	"encoding/json"
	"fmt"
)

// 对应SendGrid的邮件请求结构
type SendGridMailRequest struct {
	Personalizations []Personalization `json:"personalizations"`
	From             EmailAddress      `json:"from"`
	Subject          string            `json:"subject"`
	Content          []Content         `json:"content"`
}

type Personalization struct {
	To []EmailAddress `json:"to"`
}

type EmailAddress struct {
	Email string `json:"email"`
	Name  string `json:"name,omitempty"`
}

type Content struct {
	Type  string `json:"type"`
	Value string `json:"value"`
}

接着用你的HTML模板构建请求并序列化:

func main() {
	// 你的原始HTML模板,不需要任何手动转义
	emailTpl := `<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head><body><h1>Hello from SendGrid!</h1></body></html>`

	// 构建请求结构体
	mailReq := SendGridMailRequest{
		Personalizations: []Personalization{
			{
				To: []EmailAddress{
					{Email: "recipient@example.com", Name: "Recipient Name"},
				},
			},
		},
		From: EmailAddress{
			Email: "sender@example.com",
			Name:  "Sender Name",
		},
		Subject: "Test HTML Email",
		Content: []Content{
			{
				Type:  "text/html", // 这里必须指定为text/html
				Value: emailTpl,    // 直接传入原始HTML,不需要转义
			},
		},
	}

	// 序列化JSON,json.Marshal会自动处理字符串内部的转义(比如HTML里的双引号)
	jsonData, err := json.MarshalIndent(mailReq, "", "  ")
	if err != nil {
		fmt.Println("Error marshaling JSON:", err)
		return
	}

	fmt.Println(string(jsonData))
}

为什么你之前的方法都失败了?

  • html.EscapeString(emailtpl):这个函数会把<转成&lt;,>转成&gt;,SendGrid收到后会把这些当成普通文本显示,完全不会解析成HTML标签。
  • strconv.Quote(emailtpl):这个函数会给整个字符串加上双引号,还会转义内部的双引号,导致JSON里的content.value字段格式彻底错误,SendGrid根本解析不了。
  • 手动用反引号或单引号包裹:JSON规范明确要求字符串必须用双引号,用其他引号会直接触发API的JSON格式错误提示。

额外小提示

如果你的HTML模板里包含双引号(比如<div class="container">),json.Marshal会自动把内部的双引号转义成\",这完全符合JSON规范,SendGrid会正确解析成HTML的属性,不需要你手动处理。

内容的提问来源于stack exchange,提问作者Darian Hickman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:09:10