UrlFetchApp:如何多次模拟具有相同名称参数的HTTP帖子

问题描述 投票:1回答:1

在一个HTTP请求中,可以多次指定大多数参数,HTTP开箱即用地支持此参数。但是,使用Google Apps脚本的Class UrlFetchApp怎么办?

我正在尝试使用Mailgun API发送邮件,并希望附加多个附件。这是Mailgun API says about this

请注意,您可以多次指定大多数参数,HTTP开箱即用地支持它。对于cc等参数,或附件。

以下是与其他语言或平台相关的其他一些类似问题,但这些帮助均无效:

这是我的适用于单个附件的代码。请注意,出于一致性目的,函数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说“您可以发布多个附件值”。这有点误导,因为从本质上讲,它们意味着“您可以多次指定附件参数”来发送多个附件。

由于有效载荷是一个对象,使用UrlFetchApp无法实现,我想唯一的方法是手动构建多部分有效载荷,而不必依赖于自动生成UrlFetchApp。

这是有效的Curl请求。需要使用urlFetch模拟此:

curl -s --user 'api:key-goes-here' \
https://api.mailgun.net/v3/domain.com/messages \
-F from='Support <[email protected]>' \
-F [email protected] \
-F subject='Hello' \
-F text='Testing some Mailgun awesomness!' \
-F attachment='@image.png' \
-F attachment='@license.txt' \
http google-apps-script http-headers http-post mailgun
1个回答
0
投票

我有一个类似的问题,我可以通过应用以下函数将有效载荷对象手动编码为字符串来解决:

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("&");
}
© www.soinside.com 2019 - 2024. All rights reserved.