如何在 React 中将生成的 csv 文件作为电子邮件附件发送

How do I send a generated csv file as an email attachment in React

在我的 React 应用程序中,我希望能够生成 csv 内容并使用 node-mailer 之类的东西将其作为电子邮件中的附件传递。我发现与此相关的所有问题都建议使用 fs,但我无法使用该客户端,因此我需要一种方法来生成 csv 内容,然后在发送电子邮件后将其作为附件传递。这样做的原因是因为我每次都会动态创建数据,而且永远不会相同,所以我不能在这里使用模板文件。我目前使用 react-csv 来生成我的 csv 文件,但看起来你只能下载文件而不是将内容传递给另一种方法,除非我在他们的文档中遗漏了一些东西。

我看到使用 node-mailer 的唯一问题是它要求您有一个文件路径,而且看起来您不能只将生成的数据用作附件。如果有人能指出我正确的方向,那就太好了。老实说,真的卡在了这个问题上,在 react 中找不到太多关于如何解决这个问题的信息。谢谢!

深入了解 ChrisR 在评论中所说的内容后,我发现使用 node-mailer 我可以将字符串指定为要作为附件传递的内容。在这种情况下,我只是将我的数据格式化为 csv 字符串。通过这样做,我可以使用 .csv 扩展名设置我的文件名并传入数据字符串。这使我可以使用 node-mailer 发送带有 csv 附件的电子邮件。在 papaparse 包的帮助下,我也能够做到这一点。下面列出了代码,以防万一有人需要做类似的事情。

myfile.js

...code above

// this would be called onClick on <button> element
TestEmail(){
        // this would be the data you want to send as attachment
        let temp = [
            {
                "Column 1": "1-1",
                "Column 2": "1-2",
                "Column 3": "1-3",
                "Column 4": "1-4"
            },
            {
                "Column 1": "2-1",
                "Column 2": "2-2",
                "Column 3": "2-3",
                "Column 4": "2-4"
            },
            {
                "Column 1": "3-1",
                "Column 2": "3-2",
                "Column 3": "3-3",
                "Column 4": "3-4"
            },
            {
                "Column 1": 4,
                "Column 2": 5,
                "Column 3": 6,
                "Column 4": 7
            }
        ]

        let to = MYEMAIL;
        let text =
            `<div width="100%",style="text-align:left;">` +
            `<h1 style="text-align:center;">Testing CSV</h1>` +
            `</div >`;

        let data = Papa.unparse(temp);

        $.get("/sendRaw", { to: to, subject: 'Testing CSV', text: text, data: data }, function (data) { });
    }

server.js

... code above

app.get('/sendRaw', (request, response) => {

  var mailOptions = {
    to: request.query.to,
    bcc: request.query.bcc,
    subject: request.query.subject,
    text: request.query.text,
    attachment: request.query.data
  }

  //console.log(mailOptions); Read up on NodeMailer for details.
  smtpTransport.sendMail({  //email options
      from: MYEMAIL
      to: mailOptions.to,
      bcc: MYEMAIL,    // sending to itself
      subject: mailOptions.subject, // subject
      html: mailOptions.text, // body
      attachments: [
        {
          filename: 'test.csv',
          content: mailOptions.attachment,
        }
      ]
    }, function (error, response) {  //callback
      if (error) {
          console.log(error);
      } else {
          console.log("Message sent");
        //console.log("Amount of people getting this email: " + response.accepted.length);
      }

      smtpTransport.close(); // shut down the connection pool, no more messages.  Comment this line out to continue sending emails.
    });

})