在HTTP请求中,可以多次指定大多数参数,HTTP支持开箱即用。但是,当使用GoogleApps脚本的类UrlFetchApp时,如何做到这一点呢?
我正在尝试使用Mailgun API发送邮件,并希望附加多个附件。以下是Mailgun API对此的说明:
请注意,您可以多次指定大多数参数,HTTP支持开箱即用。这对于cc、to或附件等参数是有意义的。
以下是一些与其他语言或平台相关的其他类似问题,但这些问题都没有帮助:
这是我的代码,它适用于单个附件。请注意,函数mailgun()的参数与GmailApp的参数完全相同。sendEmail()出于一致性目的:
function mailgun(recipient, subject, body, options){
var params = {
"method":"POST",
"headers": {
"Authorization" : "Basic " + Utilities.base64Encode('api:key-goes-here')
},
"payload": {
"to": recipient,
"subject": subject,
"text": body,
"html": options.htmlBody
},
"muteHttpExceptions": true,
};
if(options.hasOwnProperty("bcc"))
params.payload.bcc = options.bcc;
if(options.hasOwnProperty("cc"))
params.payload.cc = options.cc;
if(options.hasOwnProperty("replyTo"))
params.payload['h:Reply-To'] = options.replyTo;
if(options.hasOwnProperty("name")){
params.payload.from = options.name + ' <' + options.from + '>';
} else {
params.payload.from = options.from;
}
if(options.hasOwnProperty("attachments")){
params.payload.attachment = options.attachments[0];
}
var response = UrlFetchApp.fetch('https://api.mailgun.net/v3/domain.com/messages', params);
var responseCode = response.getResponseCode();
var responseObj = JSON.parse(response.getContentText());
if(responseCode != 200) return 'Mailgun error: '+responseObj.message;
return true;
}
如果我使用此代码,邮件将通过,但没有附件:
if(options.hasOwnProperty("attachments")){
params.payload.attachment = [options.attachments[0],
options.attachments[1]
];
}
Mailgun API说“您可以发布多个附件值”。这有点误导,因为它们本质上意味着“可以多次指定附件参数”来发送多个附件。
由于负载是一个对象,因此使用URLFACHAPP是不可能的,我想唯一的方法是手动构建多部分负载,而不依赖URLFACHAPP的自动生成。
这是有效的Curl请求。需要使用urlFetch模拟此情况:
curl -s --user 'api:key-goes-here' \
https://api.mailgun.net/v3/domain.com/messages \
-F from='Support <support@domain.com>' \
-F to=example@domain.com \
-F subject='Hello' \
-F text='Testing some Mailgun awesomness!' \
-F attachment='@image.png' \
-F attachment='@license.txt' \
我有一个类似的问题,我通过应用以下函数手动将有效负载对象编码为字符串来解决它:
function jsonToUrlencoded(obj) {
var str = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (Array.isArray(obj[key])) {
for (var i=0;i<obj[key].length;i++) {
str.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key][i]));
}
} else {
str.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]));
}
}
}
return str.join("&");
}
我将代码用于http请求,如下例所示:
var payload={
user_ID:2,
action:'editpost',
originalaction:'editpost',
post_author:2,
post_type:'post',
original_post_status:'auto-draft',
'post_category[]':[1,4,32]
};
options={
method:'post',
headers:cookies,
payload:jsonToUrlencoded(payload),
};
var response = UrlFetchApp.fetch(url,options);