邮件附件错误的媒体类型Gmail API
Mail attachment wrong media type Gmail API
我试图通过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类型,但上面链接的示例状态相反。
我做错了什么?这将是非常感激,如果有人能阐明这一点!
EDIT
第一段代码适用于总大小为几mb的附件。如果您想使用允许的35 mb限制,请检查答案末尾的编辑。
在Steve给我指明了正确的方向之后(所有邮件都必须在"raw"参数中),我简单地尝试了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的最大限制。
以标题为的邮件为例,邮件带有附件,修改后的ajax请求如下所示:$.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
, url已经获得了一个新的参数uploadType=multipart
,最重要的是邮件不再是Base64编码,而是以rfc822
-格式提供。
文档有点令人困惑,因为上传文档是关于如何使用Google API上传的通用说明,并且示例不太适合gmail。也就是说,有一个更详细的解释如何发送邮件和附件与gmail API涵盖它。
简而言之,在发送原始消息之前,需要在原始消息本身中对附件进行编码。
- 为什么会出现错误;未捕获的类型错误:undefined不是函数;
- 如何在DOM元素上按类型构建此函数
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- Webpack/Rect:遵循egghead.io教程,但出现错误:您可能需要一个合适的加载程序来处理此文件类型
- 如何从querySelectorAll中获取按钮类型
- 如何在输入字段中的按钮的帮助下打开日历,该字段的类型为“=”;日期”;
- 如何将具有文本类型值的var放入jQuery函数中
- javascript解释器如何理解变量的数据类型
- 可变大小的JavaScript字符串如何成为基元类型
- 任何方式使AJAX调用Gmail API,而无需通过JS库
- AngularJS指令只识别双向绑定类型
- 在<输入类型=“;文件“/>
- 从查询字符串参数推断出正确的数据类型
- 未捕获的类型错误:无法读取属性'删除'的未定义
- 为什么不'我们在javascript中使用函数参数的数据类型
- 如何使用jQuery获取进度条的gmail类型
- 邮件附件错误的媒体类型Gmail API
- Gmail类型javascript不允许重复无效字符
- 使用 jquery get 导入 gmail 联系人时(“未捕获的类型错误:无法读取未定义的属性'0')