使用Gmail API发送的邮件中缺少附件,但仅适用于收件人

时间:2017-02-05 16:55:56

标签: email gmail attachment email-attachments gmail-api

在Javascript中使用Gmail API发送带有HTML正文和~100KB PDF附件的邮件时,附件会正确显示在发件人的Gmail已发送文件夹中的邮件中,但不会显示在收件人的邮件中

API调用是POST

https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=media

发送给API的请求正文是:

{
  "headers": {
    "Authorization": "Bearer authToken-removedForThisPost"
  },
  "method": "POST",
  "contentType": "message/rfc822",
  "contentLength": 134044,
  "payload": "exampleBelow",
  "muteHttpExceptions": true
}

这就是有效载荷的样子:

MIME-Version: 1.0
To: =?utf-8?B?TWlrZSBD?=<recipient@test.com>
CC: =?utf-8?B?TWlrZSBD?=<secondrecipient@gmail.com>
BCC: =?utf-8?B??=<bccrecipient@test.com>
From: =?utf-8?B?TWlrZSBxWXsd2lr?=<sender@test.com>
Subject: =?utf-8?B?subjectLine-removedForThisPost?=
Content-Type: multipart/alternative; boundary=__boundary__

--__boundary__
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

base64EncodedStringHere-removedForThisPost

--__boundary__
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

base64EncodedStringHere-removedForThisPost

--__boundary__
Content-Type: application/pdf; name="File Name.pdf"
Content-Disposition: attachment; filename="File Name.pdf"
Content-Transfer-Encoding: base64

base64EncodedStringHere-removedForThisPost

--__boundary__--

注意:Gmail API Uploading Attachments documentation表示上传简单附件(5MB以下)Content-Length时需要。我做了它,以便我的代码生成PDF附件的总字节数的整数值。但是,我注意到Content-Length未包含在有效负载中。

我尝试将邮件的multipart/alternative内容类型更改为multipart/mixed - 这使得PDF附件正确附加到收件人的邮件,但邮件的HTML正文已呈现作为纯文本(显示HTML标记),还有一个名为noname.html的附加附件,其中包含呈现为HTML的HTML内容。

我需要这样做,以便收件人邮件中的电子邮件同时包含HTML呈现的正文和PDF附件。

更新:我上传了原始电子邮件here的示例。 已发送 消息位于左侧, 已收到 消息位于右侧。

2 个答案:

答案 0 :(得分:2)

只需替换:

Content-Type: multipart/alternative; boundary=__boundary__

有:

Content-Type: multipart/mixed; boundary=__boundary__

这是我用JS编写的全部函数

  

function createMimeMessage_(msg){

     

var nl =“\ n”; var boundary =“ ctrlq_dot_org ”;

     

var mimeBody = [

"MIME-Version: 1.0",
"To: "      + msg.to.email,//+ encode_(msg.to.name) + "<" + msg.to.email + ">",
"Cc: "      + msg.cc.email,
"Bcc: "      + msg.bcc.email,
"From: "    + msg.from.email,//+ encode_(msg.from.name) + "<" + msg.from.email + ">",
"Subject: " + encode_(msg.subject), // takes care of accented characters
"In-Reply-To: " + (msg.reply_to || ""),
"References: " + (msg.reply_to || ""),

"Content-Type: multipart/mixed; boundary=" + boundary + nl,
"--" + boundary,

// "Content-Type: text/plain; charset=UTF-8",
// "Content-Transfer-Encoding: 7bit",
// "Content-Disposition: inline" + nl,
// msg.body.text + nl,
// "--" + boundary,

"Content-Type: text/html; charset=UTF-8",
"Content-Transfer-Encoding: base64" + nl,
new Buffer(msg.body.text).toString('base64') + nl,
     

];

     

for(var i = 0; i&lt; msg.files.length; i ++){

var attachment = [
  "--" + boundary,
  "Content-Type: " + msg.files[i].mimeType + '; name="' + msg.files[i].fileName + '"',
  'Content-Disposition: attachment; filename="' + msg.files[i].fileName + '"',
  "Content-Transfer-Encoding: base64" + nl,
  msg.files[i].bytes
];

mimeBody.push(attachment.join(nl));
     

}

     

mimeBody.push(“ - ”+ boundary +“ - ”); //console.log(mimeBody);

     

返回mimeBody.join(nl);

     

}

答案 1 :(得分:0)

您的问题分为两部分:

  1. 如何获取附件以传递给收件人?
  2. 如何在HTML中同时包含附件和纯文本?

Tiger开发人员(multipart/alternativemultipart/mixed)部分回答了此问题。正如您所指出的,问题是仅执行此操作将阻止您使用替代纯文本。这是因为您要删除multipart/alternative,后者的具体作用是提供该替代方法。

您需要做的是创建第二个边界,然后将纯文本和HTML部分组合在一起。看一看这个同样来自CTRLQ的示例,并注意我包含的altBoundary

function createMimeMessage_(msg) {

  var nl = "\n";
  var boundary = "__ctrlq_dot_org__";
  var altBoundary = "__alt_ctrlq_dot_org__";

  var mimeBody = [

    "MIME-Version: 1.0",
    "To: "      + encode_(msg.to.name) + "<" + msg.to.email + ">",
    "From: "    + encode_(msg.from.name) + "<" + msg.from.email + ">",
    "Subject: " + encode_(msg.subject), // takes care of accented characters

    "Content-Type: multipart/mixed; boundary=" + boundary + nl,
    "--" + boundary,

    "Content-Type: multipart/alternative; boundary=" + altBoundary + nl,
    "--" + altBoundary,

    "Content-Type: text/plain; charset=UTF-8",
    "Content-Transfer-Encoding: base64" + nl,
    Utilities.base64Encode(msg.body.text, Utilities.Charset.UTF_8) + nl,
    "--" + altBoundary,

    "Content-Type: text/html; charset=UTF-8",
    "Content-Transfer-Encoding: base64" + nl,
    Utilities.base64Encode(msg.body.html, Utilities.Charset.UTF_8) + nl,

    "--" + altBoundary + "--"

  ];

  for (var i = 0; i < msg.files.length; i++) {

    var attachment = [
      "--" + boundary,
      "Content-Type: " + msg.files[i].mimeType + '; name="' + msg.files[i].fileName + '"',
      'Content-Disposition: attachment; filename="' + msg.files[i].fileName + '"',
      "Content-Transfer-Encoding: base64" + nl,
      msg.files[i].bytes
    ];

    mimeBody.push(attachment.join(nl));

  }

  mimeBody.push("--" + boundary + "--");

  return mimeBody.join(nl);

}