如何在 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.
});
})
在我的 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.
});
})