如何用ColdFusion的CfHttp配置Mailgun API发送邮件?
解决ColdFusion CfHttp调用Mailgun API的参数传递问题
你的核心问题出在数据传递的位置和格式错误,以下是具体分析和修正方案:
关键结论
- Python里的
data=data对应ColdFusion中**type="body"的<cfhttpparam>,所有请求参数必须放在请求体**中,而非请求头。 - 手动拼接JSON字符串极易引发格式错误,应该用ColdFusion结构体构建数据,再通过
serializeJSON()生成标准JSON。
你的代码问题分析
- 错误将请求数据放入请求头:你把
data放到了名为data的请求头里,Mailgun API只会读取请求体中的参数,因此提示from parameter is missing。 - JSON格式构建错误:手动拼接的
mailgun_variables和data字符串存在转义隐患,且serializeJSON(data)会把已经是字符串的data再次序列化,生成双重转义的无效JSON。
修正后的代码
// 用结构体构建嵌套的Mailgun变量 mailgunVariables = { company_id: 1008, company_contact: "Joe Smith", random_key: "91A303C8-91FB-AA1D-DE07F18782594721" }; // 构建完整的请求参数结构体 mainData = { from: "email@domain.com", to: "email@domain.com", subject: "Subject line", template: "welcome", "o:tag": ["welcome", "welcome-countdown", "welcome-alt", "coldfusion"], // Mailgun要求h:X-Mailgun-Variables的值是JSON字符串,所以单独序列化 "h:X-Mailgun-Variables": serializeJSON(mailgunVariables) };
<cfhttp url="https://api.mailgun.net/v3/domain.com/messages" method="POST" username="api" password="APIKEY" result="response"> <!-- 指定请求内容类型为JSON --> <cfhttpparam type="header" name="Content-Type" value="application/json" /> <!-- 将序列化后的JSON放入请求体 --> <cfhttpparam type="body" value="#serializeJSON(mainData)#" /> </cfhttp>
重要说明
- 结构体构建优势:用ColdFusion原生结构体定义数据,
serializeJSON()会自动处理引号、数组、嵌套结构的格式,避免手动拼接的错误。 - 嵌套JSON字段处理:
h:X-Mailgun-Variables需要传入JSON格式的字符串,因此要对嵌套的mailgunVariables单独执行serializeJSON(),再作为值放入主结构体。 - 验证请求体:可以临时添加
writeDump(serializeJSON(mainData)); abort;查看生成的JSON是否符合Mailgun API要求。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

