使用 Nodemailer 发送 React App 中指定的 PDF
Using Nodemailer to send PDF specified in a React App
我的 React 组件如下所示:
import React from "react";
import { Form, FormGroup, FormText, Input, Label, Button } from "reactstrap";
import axios from "axios";
import ThankYouModal from "./ThankYouModal";
import Header from "./Header";
import Footer from "./Footer";
export default class Contact extends React.Component {
constructor(props) {
super(props);
this.state = {
name: "",
email: "",
message: "",
file: "",
submitted: false,
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.closeThankYouModal = this.closeThankYouModal.bind(this);
}
handleChange = (e) => {
this.setState({ [e.target.name]: e.target.value })
}
async handleSubmit(e) {
e.preventDefault();
const { name, email, message, file } = this.state;
this.setState({ submitted: true, message: "" });
e.target.message = "";
const formPDF = await axios.post("/api/formPDF", {
name,
email,
message,
file
})
}
然后在我的渲染中是:
<FormGroup>
<Label for="file">File</Label>
<Input
type="file"
name="file"
value={this.state.file}
onChange={this.handleChange} />
<FormText color="muted">
File must be sent as a PDF.
</FormText>
</FormGroup>
然后我在“/api/formPDF”上将 nodemailer 设置为 post,我尝试使用 req.body.file 来提取文件名,但是 Javascript 完成了它的工作并且将路径转换为 "C:\fakepath\MyPDFFile.pdf" 并表示无法在该位置找到文件。
我知道我的电子邮件设置正在运行,因为我可以让它成功地发送一封没有附件的电子邮件,我只是在获取正确的路径名时遇到了问题。我考虑过使用 fs 通过节点流式传输数据,但我对如何判断 fs 的查找位置以及文件名是什么有点不知所措。提前致谢。
编辑:这是我的 nodemailer 设置:
app.post("/api/formPDF", (req, res) => {nodemailer.createTestAccount((err, account) => {
const attach = fs.createReadStream("path", req.body.file);
const htmlEmail = `
<h3>Contact Details</h3>
<ul>
<li>Name: ${req.body.name}</li>
<li>Email: ${req.body.email}</li>
</ul>
<h3>Message</h3>
<p>${req.body.message}</p>
`
let transporter = nodemailer.createTransport({
name: *hidden*,
host: *hidden*,
port: 465,
secure: true,
auth: {
user: *hidden*,
pass: *hidden*
}
})
let mailOptions = {
from: *hidden*,
to: *hidden*,
replyTo: req.body.email,
subject: "New Message",
text: req.body.message,
html: htmlEmail,
attachments: [
{
path: attach
}
]
};
transporter.sendMail(mailOptions, (err, info) => {
if (err) {
return console.log(err)
}
})})});
一个。如果您不上传文件,请查看底部的代码,了解如何使用 REACT 和 Axios 上传文件。查看 onChange 处理程序 e.target.files[0],这是将要发送到服务器的文件对象。你不只是发送一个名字。
乙。然后您需要在节点服务器端获取该文件,执行如下操作:https://gist.github.com/paambaati/db2df71d80f20c10857d
C。然后拥有您上传并保存在服务器端的一个或多个文件的路径。然后将它与 NodeMailer 一起使用。
import React from 'react'
import axios, { post } from 'axios';
class SimpleReactFileUpload extends React.Component {
constructor(props) {
super(props);
this.state ={
file:null
}
this.onFormSubmit = this.onFormSubmit.bind(this)
this.onChange = this.onChange.bind(this)
this.fileUpload = this.fileUpload.bind(this)
}
onFormSubmit(e){
e.preventDefault() // Stop form submit
this.fileUpload(this.state.file).then((response)=>{
console.log(response.data);
})
}
onChange(e) {
this.setState({file:e.target.files[0]})
}
fileUpload(file){
const url = 'http://example.com/file-upload';
const formData = new FormData();
formData.append('file',file)
const config = {
headers: {
'content-type': 'multipart/form-data'
}
}
return post(url, formData,config)
}
render() {
return (
<form onSubmit={this.onFormSubmit}>
<h1>File Upload</h1>
<input type="file" onChange={this.onChange} />
<button type="submit">Upload</button>
</form>
)
}
}
export default SimpleReactFileUpload
我的 React 组件如下所示:
import React from "react";
import { Form, FormGroup, FormText, Input, Label, Button } from "reactstrap";
import axios from "axios";
import ThankYouModal from "./ThankYouModal";
import Header from "./Header";
import Footer from "./Footer";
export default class Contact extends React.Component {
constructor(props) {
super(props);
this.state = {
name: "",
email: "",
message: "",
file: "",
submitted: false,
}
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
this.closeThankYouModal = this.closeThankYouModal.bind(this);
}
handleChange = (e) => {
this.setState({ [e.target.name]: e.target.value })
}
async handleSubmit(e) {
e.preventDefault();
const { name, email, message, file } = this.state;
this.setState({ submitted: true, message: "" });
e.target.message = "";
const formPDF = await axios.post("/api/formPDF", {
name,
email,
message,
file
})
}
然后在我的渲染中是:
<FormGroup>
<Label for="file">File</Label>
<Input
type="file"
name="file"
value={this.state.file}
onChange={this.handleChange} />
<FormText color="muted">
File must be sent as a PDF.
</FormText>
</FormGroup>
然后我在“/api/formPDF”上将 nodemailer 设置为 post,我尝试使用 req.body.file 来提取文件名,但是 Javascript 完成了它的工作并且将路径转换为 "C:\fakepath\MyPDFFile.pdf" 并表示无法在该位置找到文件。
我知道我的电子邮件设置正在运行,因为我可以让它成功地发送一封没有附件的电子邮件,我只是在获取正确的路径名时遇到了问题。我考虑过使用 fs 通过节点流式传输数据,但我对如何判断 fs 的查找位置以及文件名是什么有点不知所措。提前致谢。
编辑:这是我的 nodemailer 设置:
app.post("/api/formPDF", (req, res) => {nodemailer.createTestAccount((err, account) => {
const attach = fs.createReadStream("path", req.body.file);
const htmlEmail = `
<h3>Contact Details</h3>
<ul>
<li>Name: ${req.body.name}</li>
<li>Email: ${req.body.email}</li>
</ul>
<h3>Message</h3>
<p>${req.body.message}</p>
`
let transporter = nodemailer.createTransport({
name: *hidden*,
host: *hidden*,
port: 465,
secure: true,
auth: {
user: *hidden*,
pass: *hidden*
}
})
let mailOptions = {
from: *hidden*,
to: *hidden*,
replyTo: req.body.email,
subject: "New Message",
text: req.body.message,
html: htmlEmail,
attachments: [
{
path: attach
}
]
};
transporter.sendMail(mailOptions, (err, info) => {
if (err) {
return console.log(err)
}
})})});
一个。如果您不上传文件,请查看底部的代码,了解如何使用 REACT 和 Axios 上传文件。查看 onChange 处理程序 e.target.files[0],这是将要发送到服务器的文件对象。你不只是发送一个名字。
乙。然后您需要在节点服务器端获取该文件,执行如下操作:https://gist.github.com/paambaati/db2df71d80f20c10857d
C。然后拥有您上传并保存在服务器端的一个或多个文件的路径。然后将它与 NodeMailer 一起使用。
import React from 'react'
import axios, { post } from 'axios';
class SimpleReactFileUpload extends React.Component {
constructor(props) {
super(props);
this.state ={
file:null
}
this.onFormSubmit = this.onFormSubmit.bind(this)
this.onChange = this.onChange.bind(this)
this.fileUpload = this.fileUpload.bind(this)
}
onFormSubmit(e){
e.preventDefault() // Stop form submit
this.fileUpload(this.state.file).then((response)=>{
console.log(response.data);
})
}
onChange(e) {
this.setState({file:e.target.files[0]})
}
fileUpload(file){
const url = 'http://example.com/file-upload';
const formData = new FormData();
formData.append('file',file)
const config = {
headers: {
'content-type': 'multipart/form-data'
}
}
return post(url, formData,config)
}
render() {
return (
<form onSubmit={this.onFormSubmit}>
<h1>File Upload</h1>
<input type="file" onChange={this.onChange} />
<button type="submit">Upload</button>
</form>
)
}
}
export default SimpleReactFileUpload