如何以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):这个函数会把<转成<,>转成>,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
相关产品推荐
相关产品推荐

