如何将Mailgun多附件cURL请求转换为Google Apps Script的UrlFetchApp实现
解决方法
核心逻辑
Google Apps Script 的 UrlFetchApp 原生支持 multipart/form-data 编码格式,当你在请求的 payload 中为 attachment 字段传入Blob对象数组时,它会自动生成多个同名的form字段,完全匹配Mailgun要求的多附件传参规则。你之前的尝试错误在于将Blob数组拼接为字符串,直接传递原始Blob数组即可生效。
如果需要自定义附件名称,只需要在获取Blob后调用.setName("自定义文件名.后缀")方法修改Blob名称即可,Mailgun会直接使用该名称作为邮件中展示的附件名。
完整实现代码
// 基础参数配置 const MAILGUN_API_KEY = "你的Mailgun API密钥"; const MAILGUN_DOMAIN = "你的Mailgun域名"; var email = { fromName: "发件人名称", fromEmail: "发件人邮箱", toEmail: "收件人邮箱", subject: "邮件主题", message: "邮件纯文本内容", htmlMessage: "邮件HTML内容", attachments: { file1: "1Xq63awYnOfSeL7fStkn0jWsou", // Google Drive文件ID file2: "1Iy96o9Tw9tvMw7VgZMzCA9mqm" } }; // 构造基础请求参数 var params = { "from": email.fromName + " <" + email.fromEmail + ">", "to": email.toEmail, "subject": email.subject, "replyto": email.fromEmail, "text": email.message, "html": email.htmlMessage, }; // 处理多附件 if (Object.keys(email.attachments).length > 0) { var attachmentBlobs = []; for (const fileKey in email.attachments) { const fileId = email.attachments[fileKey]; const file = DriveApp.getFileById(fileId); const blob = file.getBlob(); // 如需自定义附件名,取消注释下面这行,修改文件名即可 // blob.setName("自定义附件名_" + fileKey + "." + blob.getContentType().split("/")[1]); attachmentBlobs.push(blob); } // 直接把Blob数组赋值给attachment字段即可 params.attachment = attachmentBlobs; } // 发送请求 var response = UrlFetchApp.fetch( "https://api.mailgun.net/v3/" + MAILGUN_DOMAIN + "/messages", { method: "POST", auth: "api:" + MAILGUN_API_KEY, payload: params, // 不要手动设置Content-Type头,让UrlFetchApp自动生成带boundary的正确值 muteHttpExceptions: true // 可选,出错时返回错误信息方便调试 } ); // 打印返回结果方便调试 console.log(response.getResponseCode()); console.log(response.getContentText());
注意事项
- 不要手动给请求设置
Content-Type: multipart/form-data头,UrlFetchApp会自动识别payload中的Blob内容,生成带正确分隔boundary的请求头,手动设置反而会导致编码错误。 - 确保你使用的Google账号对用到的Drive文件有至少查看权限。
- 可以通过
muteHttpExceptions参数开启调试,出错时可以查看Mailgun返回的具体错误信息排查问题。
内容的提问来源于stack exchange,提问作者Radek
相关产品推荐
相关产品推荐

