So I am trying to send data that is inputted from a form in React to an e-mail address.
Everything is working perfectly, except where I try and upload a file and it only sends the text of the path file to the e-mail.
eg, the email will look like this:
From: test
Email: testing@gmail.com
Message: testing
File: C:\fakepath\2020-06-10 18-49-37.mp4
I obviously don't want the text to show up on the e-mail, but a file to be uploaded instead.
Any ideas on how to make this work.
I will post heaps of code below for everyone to check out.
Thanks in advance!
Form.jsx
import React from 'react'
import Axios from 'axios'
class Form extends React.Component {
constructor(props) {
super(props);
super(props);
this.state = {
name: '',
email: '',
message: '',
file: null,
};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState(
{
[event.target.name]: event.target.value,
[event.target.email]: event.target.value,
[event.target.message]: event.target.value,
[event.target.file]: event.target.file,
}
);
}
this.setState({
[name]: value
})
}
handleSubmit(event) {
console.log(this.state)
event.preventDefault();
const data = {
name: this.state.name,
email: this.state.email,
message: this.state.message,
file: this.state.file,
};
Axios.post("api/v1/sendMail", data)
{
alert("Thank you! We will be in touch shortly!")
}
}
render() {
return (
<React.Fragment>
<div className="formContainer centerImg" id="formScale">
<form onSubmit={this.handleSubmit} method="post">
<div className='contact'>
<h2 className="formTitles">YOUR FULL NAME</h2>
<input
name='name'
value={this.state.name}
onChange={this.handleChange}
required />
<h2 className="formTitles">EMAIL ADDRESS</h2>
<input
name='email'
value={this.state.email}
onChange={this.handleChange}
required />
<h2 className="formTitles">UPLOAD FILE</h2>
<input
type='file'
name='file'
value={this.state.file}
onChange={this.handleChange} />
<div id='messageForm'>
<h2 className="formTitles">MESSAGE</h2>
<textarea
name='message'
value={this.state.message}
onChange={this.handleChange}
required />
</div>
<div id='submit-btn'>
<input type='submit' value='SUBMIT' />
</div>
</div>
</form>
</div>
</React.Fragment>
)
}
}
export default Form
(server) index.js
const server = require('./server')
const bodyParser = require("body-parser");
const cookieParser = require("cookie-parser");
server.use(bodyParser.urlencoded({ extended: true }));
server.use(bodyParser.json());
server.use(cookieParser());
const { sendEmail } = require("../server/routes/mail");
server.post("/api/v1/sendMail", (req, res) => {
sendEmail(req.body.name, req.body.email, req.body.message, req.body.file);
});
const port = 3000
server.listen(port, () => {
// eslint-disable-next-line no-console
console.log('Server listening on port', port)
})
mail.js
const mailer = require("nodemailer");
const getEmailData = (name, email, message, file) => {
let data = null;
data = {
from: "Contact Form",
to: "(*correct e-mail here*)",
subject: `Message from the contact form!`,
html: `<b>From:</b> ${name}
<br><br><b>Email:</b> ${email}
<br><br><b>Message:</b> ${message}
<br><br><b>File:</b> ${file}`
}
return data;
}
const sendEmail = (name, email, message, file) => {
const smtpTransport = mailer.createTransport({
service: "Gmail",
auth: {
user: "(correct e-mail here)",
pass: "(correct password here)"
}
})
const mail = getEmailData(name, email, message, file)
smtpTransport.sendMail(mail, function(error, response) {
if(error) {
console.log(error)
} else {
alert( "Thank you! We will be in touch shortly!")
}
smtpTransport.close();
})
}
module.exports = { sendEmail }