Jason Byron Beedle
Jason Byron Beedle

Reputation: 73

Send route not being found,

I am trying to use nodemailer to send an email from the contact page. I have built the site with a MERN stack. All the other routes work perfectly fine. I can setup a new user, write a post and login an existing user. The only part where the routes break is when the mail is sent on the contact page.

Below is the middleware:

const app = express();

// Connect Database
connectDB();

// Init Middleware
app.use(express.json());

// Define Routes
app.use('/api/users', require('./routes/api/users'));
app.use('/api/auth', require('./routes/api/auth'));
app.use('/api/profile', require('./routes/api/profile'));
app.use('/api/posts', require('./routes/api/posts'));
app.use('/api/send', require('./routes/api/send'));

Below is the send route:

var express = require('express');
var config = require('config');
var router = express.Router();
var nodemailer = require('nodemailer');
var cors = require('cors');

// @route   POST api/send
// @desc    Send email on contact page
// @access  Public

router.post('/send',(req, res ) => {
    var name = req.body.name
    var email = req.body.email
    var subject = req.body.subject
    var message = req.body.message
    var content = `
    name: ${name} \n 
    email: ${email} \n 
    subject: ${subject} \n 
    message: ${message} `

    var mail = {
      from: name,
      to: receiver, // receiver email,
      subject: subject,
      text: content
    }
    transporter.sendMail(mail, (err, data) => {
      if (err) {
        res.json({
          status: 'fail'
        })

      } else {
        res.json({
         status: 'success'
        })
      }
    })
  });

  module.exports = router;

I get a 404 error when I submit the form on contact page. Below is the contact page:

const ContactForm = () => {
  const [state, setState] = useState({
    name: '',
    email: '',
    subject: '',
    message: ''
  });

  const [result, setResult] = useState(null);

  const sendEmail = event => {
    event.preventDefault();
    axios
      .post('/send', { ...state })
      .then(response => {
        setResult(response.data);
        setState({
          name: '',
          email: '',
          subject: '',
          message: ''
        });
      })
      .catch(() => {
        setResult({
          success: false,
          message: 'Something went wrong. Try again later'
        });
      });
  };

  const onInputChange = event => {
    const { name, value } = event.target;

    setState({
      ...state,
      [name]: value
    });
  };

This is my handler:

const nodemailer = require ('nodemailer');

nodemailer.createTransport({
    host: "smtp.gmail.com", //replace with your email provider
    port: 587,
    auth: {
        user: process.env.email,
        pass: process.env.password
    }
}); 

// verify connection configuration
transporter.verify(function(error, success) {
    if (error) {
      console.log("error at mail send");
    } else {
      console.log("Server is ready to take the messages");
    }
  });

module.exports = transporter

To debug I have tried to change the POST route to (req, res, next) (req, res, send)

Upvotes: 2

Views: 72

Answers (2)

Jason Byron Beedle
Jason Byron Beedle

Reputation: 73

This has been solved by:

Moving the transporter to the send route The route that the server is using was api/send/send on the POST route it should be /

Upvotes: 0

Dinusha Naveen
Dinusha Naveen

Reputation: 170

It seems like you missing transpoter object. You need to create it with nodemailer.createTranspot

const transpoter = nodemailer.createTranspot({
    service: 'gmail',
    auth: {
        user: '[email protected]',
        pass: 'password'
    }
})

then try it.

Upvotes: 1

Related Questions