如何在Google App Script中更新含多action参数的Mailgun路由?
解决Google Apps Script中Mailgun路由多Action参数的问题
我帮你定位到问题根源了!问题出在Google Apps Script的UrlFetchApp处理数组参数的默认逻辑上。
你看,在curl和Python里,传递多个action参数时,是直接重复action=xxx的键值对,比如:
action=forward%28%22testing%40gmail.com%22%29&action=stop%28%29
但当你在GAS里把数组赋值给action键时,UrlFetchApp会自动把它编码成带[]后缀的格式,变成:
action[]=forward(...)=&action[]=stop()
而Mailgun的API并不识别这种带后缀的参数格式,所以才会报错。
解决方案:手动构建Payload字符串
你需要手动拼接符合API要求的表单数据字符串,而不是用对象来传递参数。修改后的代码如下:
var fwd = "testing@gmail.com"; // 替换成你的目标邮箱 var address = "forward" + "(" + '"' + fwd + '"' + ")"; var stp = "stop()"; // 手动拼接多个action参数,用&分隔,同时编码特殊字符 var payload = "action=" + encodeURIComponent(address) + "&action=" + encodeURIComponent(stp); var base = "https://api.mailgun.net/v3/routes/"; var url = base + routeID; var options = { "method": "put", "payload": payload, "headers": { Authorization: 'Basic ' + Utilities.base64Encode("api:" + MAILGUN_KEY) }, // 明确指定内容类型,和curl请求保持一致 "contentType": "application/x-www-form-urlencoded" }; // 执行请求并查看响应 var response = UrlFetchApp.fetch(url, options); Logger.log(response.getContentText());
为什么这样可行?
- 手动拼接的字符串完全匹配curl请求中的
-d参数格式,每个action参数都重复出现,完美符合Mailgun API的预期。 encodeURIComponent()会自动处理括号、引号、@这类特殊字符,避免出现编码错误导致API解析失败。- 显式设置
contentType让服务器明确知道这是表单编码的数据,和你之前的curl/Python请求逻辑完全对齐。
这样修改后,你的GAS脚本应该就能像Python和curl一样正常更新带有多个action的Mailgun路由了。
内容的提问来源于stack exchange,提问作者7r0n




