无法使用 gmail api node js 发送邮件
Unable to send mail using gmail api node js
我已关注 gmail api 发送电子邮件。我收到错误消息:
"message": "400 - \"{\n \"error\": {\n \"errors\": [\n {\n \"domain\": \"global\",\n \"reason\": \"invalidArgument\",\n \"message\": \"'raw' RFC822 payload message string or uploading message via /upload/* URL required\"\n }\n ],\n \"code\": 400,\n \"message\": \"'raw' RFC822 payload message string or uploading message via /upload/* URL required\"\n }\n}\n\""
这是我为使用 gmail api 和 node.js 发送邮件而编写的一段代码。帮我解决问题。
router.post('/composeMail', async (req, res, next) => {
function makeBody(to, from, subject, message) {
let str = ["Content-Type: text/plain; charset=\"UTF-8\"\n",
"Content-length: 5000\n",
"Content-Transfer-Encoding: message/rfc822\n",
"to: ", to,"\n",
"from: ", from,"\n",
"subject: ", subject,"\n\n",
message
].join('');
console.log("String: ", str);
// let encodedMail = new Buffer(str).toString("base64").replace(/\+/g, '-').replace(/\//g, '_');
let encodedMail = btoa(str).replace(/\+/g, '-').replace(/\//g, '_');
return encodedMail;
}
let raw = makeBody("dinesh.kumar@gmail.com", "dinesh.kumar@gmail.com", "Test mail", "Everything is fine");
let obj = {};
obj.raw = raw;
let body = JSON.stringify(obj);
let option = {
url: "https://www.googleapis.com/gmail/v1/users/userId/messages/send",
method: 'POST',
headers: {
'Authorization': `Bearer ${req.query.access_token}`
},
qs: {
userId: 'me'
},
body: body
};
await request(option).then(body => {
return res.apiOk(body);
}).catch(err => {
return res.apiError(err);
})
});
- 您想通过请求模块使用 Gmail API 发送电子邮件。
如果我的理解是正确的,这个修改怎么样?我认为有几个答案。所以请将此视为其中之一。
修改点:
- 请使用
https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send
作为终点。
- 将值用作字符串。
- 将
'Content-Type': 'message/rfc822'
添加到 headers。
修改后的脚本:
请修改makeBody()
如下。
function makeBody(to, from, subject, message) {
let str = [
"to: ", to, "\n",
"from: ", from, "\n",
"subject: ", subject, "\n\n",
message,
].join('');
return str;
}
请修改option
如下。
let raw = makeBody("dinesh.kumar@gmail.com", "dinesh.kumar@gmail.com", "Test mail", "Everything is fine");
const userId = 'me'; // Please modify this for your situation.
let option = {
url: "https://www.googleapis.com/upload/gmail/v1/users/" + userId + "/messages/send",
method: 'POST',
headers: {
'Authorization': `Bearer ${req.query.access_token}`,
'Content-Type': 'message/rfc822',
},
body: raw,
};
注:
- 此修改后的脚本假定 Gmail API 在 API 控制台启用,并且发送电子邮件所需的范围包含在访问令牌的范围内。
参考:
在我的环境中,我可以确认这个修改后的脚本运行良好。但如果这不是你想要的,我很抱歉。
我已关注 gmail api 发送电子邮件。我收到错误消息:
"message": "400 - \"{\n \"error\": {\n \"errors\": [\n {\n \"domain\": \"global\",\n \"reason\": \"invalidArgument\",\n \"message\": \"'raw' RFC822 payload message string or uploading message via /upload/* URL required\"\n }\n ],\n \"code\": 400,\n \"message\": \"'raw' RFC822 payload message string or uploading message via /upload/* URL required\"\n }\n}\n\""
这是我为使用 gmail api 和 node.js 发送邮件而编写的一段代码。帮我解决问题。
router.post('/composeMail', async (req, res, next) => {
function makeBody(to, from, subject, message) {
let str = ["Content-Type: text/plain; charset=\"UTF-8\"\n",
"Content-length: 5000\n",
"Content-Transfer-Encoding: message/rfc822\n",
"to: ", to,"\n",
"from: ", from,"\n",
"subject: ", subject,"\n\n",
message
].join('');
console.log("String: ", str);
// let encodedMail = new Buffer(str).toString("base64").replace(/\+/g, '-').replace(/\//g, '_');
let encodedMail = btoa(str).replace(/\+/g, '-').replace(/\//g, '_');
return encodedMail;
}
let raw = makeBody("dinesh.kumar@gmail.com", "dinesh.kumar@gmail.com", "Test mail", "Everything is fine");
let obj = {};
obj.raw = raw;
let body = JSON.stringify(obj);
let option = {
url: "https://www.googleapis.com/gmail/v1/users/userId/messages/send",
method: 'POST',
headers: {
'Authorization': `Bearer ${req.query.access_token}`
},
qs: {
userId: 'me'
},
body: body
};
await request(option).then(body => {
return res.apiOk(body);
}).catch(err => {
return res.apiError(err);
})
});
- 您想通过请求模块使用 Gmail API 发送电子邮件。
如果我的理解是正确的,这个修改怎么样?我认为有几个答案。所以请将此视为其中之一。
修改点:
- 请使用
https://www.googleapis.com/upload/gmail/v1/users/userId/messages/send
作为终点。 - 将值用作字符串。
- 将
'Content-Type': 'message/rfc822'
添加到 headers。
修改后的脚本:
请修改makeBody()
如下。
function makeBody(to, from, subject, message) {
let str = [
"to: ", to, "\n",
"from: ", from, "\n",
"subject: ", subject, "\n\n",
message,
].join('');
return str;
}
请修改option
如下。
let raw = makeBody("dinesh.kumar@gmail.com", "dinesh.kumar@gmail.com", "Test mail", "Everything is fine");
const userId = 'me'; // Please modify this for your situation.
let option = {
url: "https://www.googleapis.com/upload/gmail/v1/users/" + userId + "/messages/send",
method: 'POST',
headers: {
'Authorization': `Bearer ${req.query.access_token}`,
'Content-Type': 'message/rfc822',
},
body: raw,
};
注:
- 此修改后的脚本假定 Gmail API 在 API 控制台启用,并且发送电子邮件所需的范围包含在访问令牌的范围内。
参考:
在我的环境中,我可以确认这个修改后的脚本运行良好。但如果这不是你想要的,我很抱歉。