node-fetch 流文件到 nodemailer,然后 nodemailer 将文件作为附件发送

Posted

技术标签:

【中文标题】node-fetch 流文件到 nodemailer,然后 nodemailer 将文件作为附件发送【英文标题】:node-fetch stream file to nodemailer, and then nodemailer to send the file as attachment 【发布时间】:2022-01-16 09:49:24 【问题描述】:

我正在尝试使用 node-fetch 发送文件以及 Nextjs 中状态的其他字段。 目标不是将文件存储在服务器上(即使是暂时的),而是在用户将表单提交到 Nodemailer 时从 Web 浏览器流式传输,然后从 Nodemailer 以附件的形式发送电子邮件以及其他信息。

客户:

const handleFile = (e) => 
let file = e.target.files[0];
let attachment = new FormData();
attachment.append("file", file);

fetch(`route`, 
  method: "POST",
  headers: ,
  body: attachment,
)
  .then((response) => 
    if (response.ok) console.log("Uploaded");
    else console.log("Error");
  )
  .catch((error) => 
    console.log(error);
  );

SMTP:

const nodemailer = require("nodemailer");

async function main(subject, html, to, file) 
  let transporter = nodemailer.createTransport(
   // mail server setup
  );

  let attachment = [];
  if (file) 
    attachment = [
      
        filename: file.file[0].originalFilename,
        path: file.file[0].path,
      ,
    ];
  

  const mailOptions = 
    from: from,
    to: to,
    subject: subject,
    html: html,
    attachments: attachment,
  ;

  try 
    let info = await transporter.sendMail(mailOptions);
    console.log(info);
   catch (error) 
    console.error(error, "fail to send email");
  

API:

const express = require("express");
const router = express.Router();
const multiparty = require("multiparty");
const sendEmail = require("../../utilities/SMTP");

 router.post("/route", (req, res) => 
  var form = new multiparty.Form();
  form.parse(req, function (err, fields, files) 
    sendEmail(
      "Career Attachment",
      contactEmail(fields),
      "to@mail.com",
      files
    );
    res.send("Your Request Sent Successfully");
  );
);

编辑:我可以使用上述代码将文件作为附件流式传输。

需要改进。

【问题讨论】:

【参考方案1】:

你应该使用 formData 并将你的文件附加到它上面,就像下面的代码一样

 let file = e.target.files[0];
 let formData = new FormData();
 formData.append("file", file);
    

如果你想让它是动态的并上传多个文件,你可以像下面这样编写你的函数

   let files = e.target.files;
   let formData = new FormData();
   for (let i = 0; i < files .length; i++) 
      formData.append("file", files [i]);
    
     

【讨论】:

以上是关于node-fetch 流文件到 nodemailer,然后 nodemailer 将文件作为附件发送的主要内容,如果未能解决你的问题,请参考以下文章

将NodeJS流消耗到缓冲区并写入流的正确方法

Node.js 和 Nodemailer:我们可以将 PDF 文档附加到电子邮件中吗?

使用 node-fetch 计算下载百分比的正确方法

使用 Sendgrid/Nodemailer 将 Angular 表单数据发布到 Node.js

如何在nodejs中使用nodemailer进行批量数据发送?

在发布路线上使用 nodemailer 发送电子邮件并使用 passport.authenticate 将用户保存到 mongodb