How to send form data with a file attachment to an email address using React

To send form data with a file attachment to an email address using React, you’ll need to follow these steps:

Update and recommended solution (https://learnwithisrak.com/how-to-send-form-data-with-a-file-attachment-to-an-email-using-react/)

  1. Create a React form with input fields for the data you want to collect, including a file input for the file attachment.
  2. Handle the input changes and store the form data in the component’s state.
  3. When the form is submitted, use the fetch API to send the form data, including the file, to a backend server.
  4. On the backend server, use a server-side technology (e.g., Node.js with Express) to receive the form data and send an email with the attachment.

Here’s an example of how to implement this:

Frontend (React):

import React, { useState } from 'react';

function ContactForm() {
  const [formData, setFormData] = useState({
    name: '',
    email: '',
    message: '',
    file: null,
  });

  const handleInputChange = (event) => {
    const { name, value } = event.target;
    setFormData({ ...formData, [name]: value });
  };

  const handleFileChange = (event) => {
    const file = event.target.files[0];
    setFormData({ ...formData, file });
  };

  const handleSubmit = (event) => {
    event.preventDefault();

    const formDataToSend = new FormData();
    formDataToSend.append('name', formData.name);
    formDataToSend.append('email', formData.email);
    formDataToSend.append('message', formData.message);
    formDataToSend.append('file', formData.file);

    fetch('/api/send-email', {
      method: 'POST',
      body: formDataToSend,
    })
      .then((response) => response.json())
      .then((data) => {
        console.log(data); // Optional: Handle the response from the backend
      })
      .catch((error) => {
        console.error(error); // Optional: Handle errors
      });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        name="name"
        placeholder="Your Name"
        value={formData.name}
        onChange={handleInputChange}
      />
      <input
        type="email"
        name="email"
        placeholder="Your Email"
        value={formData.email}
        onChange={handleInputChange}
      />
      <textarea
        name="message"
        placeholder="Your Message"
        value={formData.message}
        onChange={handleInputChange}
      />
      <input type="file" name="file" onChange={handleFileChange} />
      <button type="submit">Submit</button>
    </form>
  );
}

export default ContactForm;

Backend (Node.js with Express and Nodemailer):

You’ll need to set up a backend server to handle the form data and send the email with the attachment. Here’s a simplified example using Node.js, Express, and Nodemailer:

const express = require('express');
const multer = require('multer');
const nodemailer = require('nodemailer');

const app = express();
app.use(express.json());

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/');
  },
  filename: function (req, file, cb) {
    cb(null, Date.now() + '-' + file.originalname);
  },
});
const upload = multer({ storage });

app.post('/api/send-email', upload.single('file'), (req, res) => {
  const { name, email, message } = req.body;
  const file = req.file;

  const transporter = nodemailer.createTransport({
    service: 'Gmail',
    auth: {
      user: '[email protected]', // Replace with your email
      pass: 'your-email-password', // Replace with your email password or app-specific password
    },
  });

  const mailOptions = {
    from: email,
    to: '[email protected]', // Replace with the recipient's email address
    subject: 'New Form Submission',
    text: `Name: ${name}\nEmail: ${email}\nMessage: ${message}`,
    attachments: [
      {
        filename: file.originalname,
        path: file.path,
      },
    ],
  };

  transporter.sendMail(mailOptions, (error, info) => {
    if (error) {
      console.error(error);
      res.status(500).json({ error: 'Error sending email' });
    } else {
      console.log('Email sent:', info.response);
      res.json({ success: 'Email sent successfully' });
    }
  });
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

In this backend example, we use the multer middleware to handle file uploads and the nodemailer library to send the email. Make sure to install these dependencies by running npm install multer nodemailer express in your backend project.

Please replace '[email protected]', 'your-email-password', and '[email protected]' with appropriate values for your email configuration.

Also, ensure that you create an uploads directory in your project root to store the uploaded files.

With this setup, when the form is submitted, the React frontend will send the form data and the file to the backend server. The backend server, in turn, will handle the form data and file attachment and send an email to the specified recipient.

Remember that this is a simplified example, and you may need to add additional validation and error handling to suit your specific requirements.

*** Common error:

  1. Error: ENOENT: no such file or directory
  2. ReferenceError: path is not defined
  3. Invalid login: 534-5.7.9 Application-specific password required. Learn more at 534 5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor jk8-20020a170903330800b001b9dadf8bd2sm2307952plb.190 – gsmtp

1 thought on “How to send form data with a file attachment to an email address using React”

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top