当前位置: 首页 > 面试题库 >

邮件附件媒体类型错误的Gmail API

尹超
2023-03-14
问题内容

我正在尝试通过Javascript客户端中的Gmail API发送包含jpeg文件的邮件。到目前为止,我编写的代码如下:

$.ajax({
  type: "POST",
  url: "https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart",
  headers: {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'multipart/related; boundary="foo_bar_baz"'
  },
  data: data
});

哪里data是一个字符串建立类似的例子在这里找到:

--foo_bar_baz
Content-Type: application/json; charset=UTF-8

{ 
  "raw": "RnJvbTogRW1pbCBUaG9saW4gPGVtdGhvbGluQGdtYWlsLmNvbT4KVG86IEV4YW1wbGUgTmFtZSA8ZW10aG9saW5AZ21haWwuY29tPgpTdWJqZWN0OiBzZHNkCgpzZHNk"
}

--foo_bar_baz
Content-Type: image/jpeg

data:image_jpeg;base64,_9j_4AAQSkZJRgABAQEAYABgAAD_2wBDAAIBAQIBAQICAgICAgIC…bHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3-Pn6_9oADAMBAAIRAxEAPwD-f-iiigD_2Q==

--foo_bar_baz--

我得到的错误是Media type 'image/jpeg' is not supported. Valid media types: [message/rfc822],这是可以理解的,因为[message/rfc822]根据规范,它是媒体的唯一有效的MIME类型,但是上面链接的示例另有说明。

我究竟做错了什么?如果有人能对此有所启示,将不胜感激!


问题答案:

编辑

第一部分代码适用于总大小为mb的附件。如果要使用允许的35 mb的限制,请在答案末尾检查编辑。

在Steve将我推向正确的方向(整个邮件必须在“原始”参数中)之后,我简单地尝试了Python API并查看了由此生成的邮件。

没有附件的邮件

Content-Type: text/plain; charset="UTF-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
to: receiver@gmail.com
from: sender@gmail.com
subject: Subject Text

The actual message text goes here

带附件的邮件

Content-Type: multipart/mixed; boundary="foo_bar_baz"
MIME-Version: 1.0
to: receiver@gmail.com
from: sender@gmail.com
subject: Subject Text

--foo_bar_baz
Content-Type: text/plain; charset="UTF-8"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

The actual message text goes here

--foo_bar_baz
Content-Type: image/jpeg
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="example.jpg"

{JPEG data}

--foo_bar_baz--

因此,我只是围绕此代码编写了代码,并且效果很好!

var reader = new FileReader();
reader.readAsDataURL(attachment);
reader.onloadend = function (e) {
  // The relevant base64-encoding comes after "base64,"
  var jpegData = e.target.result.split('base64,')[1];
  var mail = [
    'Content-Type: multipart/mixed; boundary="foo_bar_baz"\r\n',
    'MIME-Version: 1.0\r\n',
    'to: receiver@gmail.com\r\n',
    'from: sender@gmail.com\r\n',
    'subject: Subject Text\r\n\r\n',

    '--foo_bar_baz\r\n',
    'Content-Type: text/plain; charset="UTF-8"\r\n',
    'MIME-Version: 1.0\r\n',
    'Content-Transfer-Encoding: 7bit\r\n\r\n',

    'The actual message text goes here\r\n\r\n',

    '--foo_bar_baz\r\n',
    'Content-Type: image/jpeg\r\n',
    'MIME-Version: 1.0\r\n',
    'Content-Transfer-Encoding: base64\r\n',
    'Content-Disposition: attachment; filename="example.jpg"\r\n\r\n',

    jpegData, '\r\n\r\n',

    '--foo_bar_baz--'
  ].join('');

  // The Gmail API requires url safe Base64 
  // (replace '+' with '-', replace '/' with '_', remove trailing '=')
  mail = btoa(mail).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');

  $.ajax({
    type: "POST",
    url: "https://www.googleapis.com/gmail/v1/users/me/messages/send",
    headers: {
      'Authorization': 'Bearer ' + accessToken,
      'Content-Type': 'application/json'
    },
    data: JSON.stringify({
      raw: mail
    })
  });
}

编辑

上面的代码有效,但是需要一些更改才能使用最大限制为35 mb。

以标题为 Mail with attachment的邮件 为例,更改后的ajax-request如下所示:

$.ajax({
  type: "POST",
  url: "https://www.googleapis.com/gmail/v1/users/me/messages/send?uploadType=multipart",
  headers: {
    'Authorization': 'Bearer ' + accessToken,
    'Content-Type': 'message/rfc822'
  },
  data: mail
});

Content- Type现在message/rfc822,而不是application/json,网址已经得到了新的参数uploadType=multipart,而且最重要的邮件不再是Base64编码,但在提供rfc822-format。



 类似资料:
  • 我知道已经有一个类似的问题,但它没有解决上述错误。 这是我在API控制器中的PUT操作,在中运行良好: 以下是我的网页上的代码: HTML 打字稿 我的服务是: 我还使用了尝试上述问题的答案,我将我的文件附加到中,但不幸的是,同样的错误。如果媒体类型中没有任何设置,如何修复此问题?

  • 我最近在Heroku上部署了一个Django应用程序,并上传了一些媒体文件,一切似乎都正常,直到昨天我再次尝试访问该应用程序时,才发现它出现了404错误。 你知道为什么会这样吗? settings.py: URL。py公司

  • 我创建了带有媒体查询的响应式HTML电子邮件,但在Gmail/Outlook/Inbox中,媒体查询中的max-width指的是浏览器视口,而不是HTML电子邮件。 所以,在本地主机上,我的邮件切换到700px以下的移动显示,在Gmail/Outlook/Inbox中,这种行为被打破了。 您是否有一个解决方案,使媒体查询视口作为邮件视口,而不是浏览器视口?

  • 问题内容: 我正在使用JSON请求调用REST服务,并且它以错误响应。 请求内容类型设置为。 如果我在请求中不包含JSON对象,则效果很好。我正在使用JSON库。 我尝试使用几个不同的库,但这没什么区别。 有人可以帮我解决这个问题吗? 这是我的代码: 的值为: 问题答案: 不确定原因,但是从中 删除行解决了该问题。

  • 我用JSON请求调用REST服务,它用HTTP 415“不支持的媒体类型”错误进行响应。 请求内容类型设置为。 如果我在请求中不包含JSON对象,它就可以正常工作。我正在使用JSON库。 我试着使用了几个不同的库,但没有什么不同。 有人能帮我解决这个问题吗? 这是我的代码: 是: