如何使用Gmail API和Javascript发送带有本地附件的电子邮件?
我正在构建一个与Gmail API配合使用的Chrome扩展,我需要发送带有本地文件(使用本地文件路径)作为附件的电子邮件。 我看到有了Gmail API,附件需要进行base64编码,然后您可以将其作为POST请求发送。所以我试了一下:如何使用Gmail API和Javascript发送带有本地附件的电子邮件?,javascript,base64,gmail-api,mime-types,email-attachments,Javascript,Base64,Gmail Api,Mime Types,Email Attachments,我正在构建一个与Gmail API配合使用的Chrome扩展,我需要发送带有本地文件(使用本地文件路径)作为附件的电子邮件。 我看到有了Gmail API,附件需要进行base64编码,然后您可以将其作为POST请求发送。所以我试了一下: // Here i convert the file to base64 const fileToBase64 = (filename, filepath) => { return new Promise(resolve => { va
// Here i convert the file to base64
const fileToBase64 = (filename, filepath) => {
return new Promise(resolve => {
var file = new File([filename], filepath);
var reader = new FileReader();
// Read file content on file loaded event
reader.onload = function(event) {
resolve(event.target.result);
};
// Convert data to base64
reader.readAsDataURL(file);
});
};
//Here i trigger the event, get the auth token and create the mail
$('#test').on('click', function(){
chrome.identity.getAuthToken({interactive: true}, function(token) {
console.log(token);
fileToBase64("pic4.jpg", "C:\Users\Davide\Downloads\pic4.jpg").then(result => {
console.log(result);
var splittedResult = result.split('base64,')[1];
var mail = [
'Content-Type: multipart/mixed; boundary="foo_bar_baz"\r\n',
'MIME-Version: 1.0\r\n',
'From: address1@gmail.com\r\n',
'To: address2@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="pic4.jpg"\r\n\r\n',
//base64 splitted result of previous function
splittedResult, '\r\n\r\n',
'--foo_bar_baz--'
].join('');
// Here i send the mail
$.ajax({
type: "POST",
url: "https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart",
contentType: "message/rfc822",
beforeSend: function(xhr, settings) {
xhr.setRequestHeader('Authorization','Bearer '+ token );
},
data: mail
});
});
结果:我在目标地址收到了一封邮件(我还收到了一份到源地址的副本,idk HOY),但邮件包含一个空附件,其文件名为我选择的文件名(pic4.jpg)(无法打开)
从绝对路径开始的base64编码中似乎出现了错误,是否有解决方法或其他方法?您可以使用XMLHttpRequest().open()从本地路径打开文件,以便将其传递给reader.readAsDataURL()。
参见示例。您可以使用XMLHttpRequest().open()从本地路径打开一个文件,以便将其传递给reader.readAsDataURL()。
请参阅示例。@Diodeus JamesMacFarlane试图拆分base64 url,但无法正常工作,相同的结果..这是FileReader文档中提供的信息:如果不首先删除Base64编码数据。要仅检索Base64编码的字符串,请首先删除数据:*/*;base64,从结果中删除@ziganotschka已经尝试过了,将字符串从“base64”中分离出来,但没有任何更改。。还试图向图像添加相对路径,但它不起作用。@ziganotschka是的,错误就在那里:我用HTML制作了一个输入文件表单,一切正常。我现在应该找到一种从本地路径创建文件的方法,而不使用输入表单(出于安全原因,可能不可能),或者另一种方法上载整个附件。@Diodeus JamesMacFarlane试图拆分base64 url,但它不起作用,相同的结果..这是FileReader文档中提供的信息:如果不首先删除Base64编码数据。要仅检索Base64编码的字符串,请首先删除数据:*/*;base64,从结果中删除@ziganotschka已经尝试过了,将字符串从“base64”中分离出来,但没有任何更改。。还试图向图像添加相对路径,但它不起作用。@ziganotschka是的,错误就在那里:我用HTML制作了一个输入文件表单,一切正常。我现在应该找到一种从本地路径创建文件的方法,而不使用输入表单(出于安全原因,可能不可能),或者另一种上传整个附件的方法。