node.js - 发送附件节点邮件程序而不将文件存储在服务器中
问题描述
我正在寻找一种使用 nodemailer、multer、express 发送附件的方法,而无需将文件存储在服务器中。
这是我实际的 sendEmai 功能,我想更新它,以便我可以发送附件
exports.sendMail = (req, res) => {
let credentials=await Integration_mail.findOne({
where: {
userId: req.body.userId,
},
})
//decrypt password
var bytes = CryptoJS.AES.decrypt(
credentials.password,
secretconfig.secret
);
var originalPwd = bytes.toString(CryptoJS.enc.Utf8);
let transporter = nodemailer.createTransport({
host: credentials.host_smtp,
port: 587,
secure: false, // upgrade later with STARTTLS
auth: {
user: credentials.user,
pass: originalPwd,
},
});
const { destMail, subject, text } = req.body;
var mailOptions = {
from: credentials.user,
to: destMail,
subject: subject,
text: text,
};
transporter.sendMail(mailOptions, function (error, info) {
if (error) {
return res.status(500).json({ msg: error });
} else {
return res.status(200).json({ msg: 'email sent' });
}
});
})
});
};
感谢您的帮助
解决方案
因此,经过一段时间的研究,我使用表单数据上传文件并仅使用我通过 nodemailer 发送的文件的缓冲区,而无需将其上传到服务器并使用其路径。这是代码:
let transporter = nodemailer.createTransport({
host: host_smtp,
secureConnection: false, // TLS requires secureConnection to be false
port: 587, // port for secure SMTP
tls: {
ciphers: "SSLv3",
},
auth: {
user: credentials.email,
pass: credentials.password,
},
});
const { to, subject, text, cc, bcc } = req.body;
let attachments = [];
if (req.files) {
let files = req.files.file;
//if its an array of files I preferred to not allow uploads > 20Mb
if (Array.isArray(files)) {
size = files.reduce((acc, file) => acc + file.size, 0);
if (size > 20971520)
return res.status(500).json({ message: "files size cannot be greater than 20MB" });
attachments = files.map((file) => ({
filename: file.name,
content: file.data,
encoding: file.encoding,
}));
} else {
if (files.size > 20971520)
return res.status(500).json({ message: "files size cannot be greater than 20MB" });
attachments = [
{
filename: files.name,
content: files.data,
encoding: files.encoding,
},
];
}
}
const mailOptions = {
from: credentials.email,
to: to,
cc: cc,
bcc: bcc,
subject: subject,
html: text,
attachments: attachments,
};
await transporter.sendMail(mailOptions);
这是使用表单数据的请求正文的屏幕截图
这里是官方文档的参考: https ://nodemailer.com/message/attachments/
推荐阅读
- android - 使用 R8 缩小 rxjava3 的异常
- angular - Angular:如何将类型与服务相关联?
- database - Flutter:如何在 Firebase 数据库上执行多重过滤?
- mongodb - 在 MongoDB Compass 中使用 ObjectID 的问题
- html - SQL:读取查询返回的 span HTML 元素内的文本
- elasticsearch - 为 elasticsearch 索引模板设置动态模板属性时可以使用通配符吗?
- amazon-web-services - 如何从 AWS-Task 获取 Docker ID 并将其登录到 SpringBoot 应用程序?
- scala - Databricks SparkException 超过 spark.driver.maxResultSize
- java - 身份验证后的 Spring 调用控制器
- regex - 正则表达式匹配 JSON 列表中的特定键