Как отправить сгенерированный CSV-файл в виде вложения электронной почты в React? - PullRequest
0 голосов
/ 27 апреля 2020

В своем приложении реагирования я хочу иметь возможность генерировать CSV-контент и передавать его в виде вложения в электронное письмо, используя что-то вроде node-mailer. Все вопросы, которые я нашел, относящиеся к этому, предлагали использовать fs, но я не могу использовать эту клиентскую сторону, поэтому мне нужен способ для генерации содержимого csv и передачи его в качестве вложения после отправки электронного письма. Причина этого в том, что я буду каждый раз динамически создавать данные, и они никогда не будут прежними, поэтому я не могу использовать файлы шаблонов здесь. В настоящее время я использую react-csv для генерации моих CSV-файлов, но похоже, что вы можете только загрузить файл вместо того, чтобы передать содержимое, чтобы сказать другой метод, если я не пропустил что-то в их документации.

Единственная проблема, с которой я сталкиваюсь при использовании node-mailer, заключается в том, что она требует от вас пути к файлу, и не похоже, что вы можете просто использовать сгенерированные данные в качестве вложения. Если бы кто-нибудь мог указать мне правильное направление, это было бы здорово. Честно говоря, действительно застрял на этом, и не могу найти много о том, как решить эту проблему в react. Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2020

Более подробно изучив сказанное ChrisR в комментариях, я смог распознать, что с помощью node-mailer я смогу указать строку в качестве содержимого для передачи в качестве вложения. В этом случае я просто отформатировал бы свои данные в csv строку. Таким образом, я могу установить имя файла с расширением .csv и передать строку данных. Это позволило мне отправить электронное письмо с вложением csv, используя node-mailer. Я смог сделать это с небольшой помощью из пакета 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.
    });

})

...