【问题标题】:send attachement nodemailer wihout storing file in server发送附件nodemailer而不将文件存储在服务器中
【发布时间】:2021-06-09 11:21:58
【问题描述】:

我正在寻找一种使用 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' });
    }
  });
})

});
};

感谢您的帮助

【问题讨论】:

    标签: node.js express multer nodemailer


    【解决方案1】:

    所以经过一段时间的研究,我使用表单数据上传文件并仅使用我通过 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/

    【讨论】:

    • 是的,这可能是最好的方法。 req.file 具有 Buffer 类型,并且 nodemailer 在 attachments 属性中也接受 Buffer 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2012-08-01
    • 1970-01-01
    • 2016-09-26
    • 2015-10-19
    • 2018-02-24
    • 2016-03-30
    相关资源
    最近更新 更多