【问题标题】:How do I send a generated csv file as an email attachment in React如何在 React 中将生成的 csv 文件作为电子邮件附件发送
【发布时间】:2020-04-28 00:37:13
【问题描述】:

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

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

【问题讨论】:

  • 您的问题是您想使用在节点服务器上运行的节点邮件程序,但用于客户端。客户端无法发送电子邮件。您需要创建一个 API 来发送从您的客户端应用程序收到的电子邮件。 CSV 只是逗号分隔的值。只是文字!
  • @ChrisR 那是我的错,我目前确实通过 API 使用 nodemailer 从服务器端发送电子邮件。那么如果 csv 只是一个文本文件,我如何在客户端生成这个文件,然后通过电子邮件发送呢?

标签: reactjs csv nodemailer


【解决方案1】:

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

我的文件.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.
    });

})

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 2011-03-18
    • 1970-01-01
    • 2020-12-05
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-03
    相关资源
    最近更新 更多