问题描述
这是我在node.js中编写的以下代码,用于使用gmail api发送带有附件的电子邮件:
This is the following piece of code I have written in node.js for sending email with attachment using gmail api:
我正在使用节点js的request-promise模块将请求发送到该api.
And I am using request-promise module of node js to send request to that api.
let user = await db.model('User').findOne({ _id: userId });
let filepath = fs.readFileSync(req.file.path).toString('base64');
// let filepath = fs.readFileSync(req.file.path);
let from = user.crmOptions.email;
let raw = [
'Content-Type: multipart/mixed; boundary="boundary_mail"\r\n',
'MIME-Version: 1.0\r\n',
"to: ", req.body.to, "\n",
"from: ", from, "\n",
"cc: ", req.body.cc ? req.body.cc : '', "\n",
"bcc: ", req.body.bcc ? req.body.bcc : '', "\n",
"subject: ", req.body.subject, "\n\n",
'--boundary_mail\r\n',
"Content-Type: text/html; charset=\"UTF-8\"\n",
'MIME-Version: 1.0\r\n',
req.body.message,
'--boundary_mail\r\n',
`Content-Type: ${req.file.mimetype}\r\n`,
'MIME-Version: 1.0\r\n',
`Content-Disposition: attachment; filename="${req.file.filename}"\r\n\r\n`,
filepath, '\r\n\r\n',
'--boundary_mail--'
].join('');
const id = 'me';
let options = {
url: "https://www.googleapis.com/upload/gmail/v1/users/" + id + "/messages/send?uploadType=multipart",
method: 'POST',
headers: {
'Authorization': `Bearer ${user.crmOptions.access_token}`,
'Content-Type': 'message/rfc822'
},
body: raw
};
await request(options).then(async body => {
console.log("Body: ", body);
}).catch(err => {
console.log("Error: ", err);
})
发送邮件后,邮件内容会变成这样
Mail content is going like this after sending mail
推荐答案
发送html邮件和附件文件时,它使用multipart/mixed
和multipart/alternative
.请求正文的结构如下.
When html mail and attachment file are sent, it uses multipart/mixed
and multipart/alternative
. The structure of request body is as follows.
- 多份/混合
- 多部分/替代
- html消息
- multipart/mixed
- multipart/alternative
- html message
当时,请求正文中使用了2个边界.
At that time, 2 boundaries are used in the request body.
请如下修改
raw
.let raw = [ 'MIME-Version: 1.0\n', "to: ", req.body.to, "\n", "from: ", from, "\n", "cc: ", req.body.cc ? req.body.cc : '', "\n", "bcc: ", req.body.bcc ? req.body.bcc : '', "\n", "subject: ", req.body.subject, "\n", "Content-Type: multipart/mixed; boundary=boundary_mail1\n\n", "--boundary_mail1\n", "Content-Type: multipart/alternative; boundary=boundary_mail2\n\n", "--boundary_mail2\n", "Content-Type: text/html; charset=UTF-8\n", "Content-Transfer-Encoding: quoted-printable\n\n", req.body.message, "\n\n", "--boundary_mail2--\n", '--boundary_mail1\n', `Content-Type: ${req.file.mimetype}\n`, `Content-Disposition: attachment; filename="${req.file.filename}"\n`, "Content-Transfer-Encoding: base64\n\n", filepath, '\n', '--boundary_mail1--', ].join('');
注意:
- 在此经过修改的脚本中,它假定您当前的脚本可以使用Gmail API发送电子邮件.
- https://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
- http://qcode.co.uk/post/70
例如,当请求正文中包含2个附件文件时,请按照以下说明从
--boundary_mail1
修改为--boundary_mail1--
.请注意是否没有重复的文件名.For example, when 2 attachment files are included in the request body, please modify from
--boundary_mail1
to--boundary_mail1--
as follows. Please be careful whether there are no duplicated filenames.'--boundary_mail1\n', `Content-Type: ${req.file.mimetype}\n`, `Content-Disposition: attachment; filename="${req.file.filename}"\n`, "Content-Transfer-Encoding: base64\n\n", filepath, '\n', '--boundary_mail1--',
收件人:
'--boundary_mail1\n', `Content-Type: mimetype\n`, // mimetype `Content-Disposition: attachment; filename="### filename1 ###"\n`, // filename1 "Content-Transfer-Encoding: base64\n\n", filepath1, '\n', // filepath1 '--boundary_mail1\n', `Content-Type: mimetype\n`, // mimetype `Content-Disposition: attachment; filename="### filename2 ###"\n`, // filename2 "Content-Transfer-Encoding: base64\n\n", filepath2, '\n', // filepath2 '--boundary_mail1--',
这篇关于带有附件的电子邮件无法与gmail API一起正常运行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!
- multipart/alternative
- 多部分/替代