我一直在尝试使用 Google 的 Gmail API 发送电子邮件,但一直收到以下错误:
API 返回错误:错误:“原始”RFC822 有效负载消息字符串或通过 /upload/* URL 上传消息
我使用 Google 为 NodeJS 提供的启动代码(文档)进行了设置。
const google = require('googleapis');
const googleAuth = require('google-auth-library');
const Base64 = require('js-base64').Base64;
// ...
// create the email string
const emailLines = [];
emailLines.push("From: \"My Name\" <MY_EMAIL@gmail.com>");
emailLines.push("To: YOUR_EMAIL@uw.edu");
emailLines.push('Content-type: text/html;charset=iso-8859-1');
emailLines.push('MIME-Version: 1.0');
emailLines.push("Subject: New future subject here");
emailLines.push("");
emailLines.push("And the body text goes here");
emailLines.push("<b>And the bold text goes here</b>");
const email =email_lines.join("\r\n").trim();
// ...
function sendEmail(auth) {
const gmail = google.gmail('v1');
const base64EncodedEmail = Base64.encodeURI(email);
base64EncodedEmail.replace(/\+/g, '-').replace(/\//g, '_')
console.log(base64EncodedEmail);
gmail.users.messages.send({
auth: auth,
userId: "me",
resource: {
raw: base64EncodedEmail
}
}, (err, response) => {
if (err) {
console.log('The API returned an error: ' + err);
return;
}
console.log(response);
});
}
您可以将其描绘auth
成一个对象:
{
transporter: ...,
_certificateCache: ...,
_certificateExpiry: ...,
_clientId: ...,
_clientSecret: ...,
_redirectUri: ...,
_opts: {},
credentials: {
access_token: ...,
refresh_token: ...,
token_type: 'Bearer',
expiry_date: 1517563087857
}
}
重要的是access_token
.
我已经尝试过这里列出的解决方案:
- StackOverflow:使用 javascript 通过 google api 发送邮件失败
- ExceptionsHub:在nodejs中通过google api发送邮件失败
- StackOverflow:用于在 Node.js 中发送邮件的 Gmail API
但他们都没有工作。但是,当我将编码的字符串复制并粘贴到 Google 自己的文档的 Playground 上时,它可以工作(文档):
因此,我改为使用fetch
请求,它也有效。
fetch(`https://www.googleapis.com/gmail/v1/users/me/messages/send`, {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + `the_access_token_in_auth_obj`,
'HTTP-Version': 'HTTP/1.1',
'Content-Type': 'application/json',
},
body: JSON.stringify({
raw: base64EncodedEmail
})
})
.then((res) => res.json())
.then((res) => console.info(res));
谁能解释为什么会这样?这是一个错误googleapi
还是我错过了什么?