View Single Post
Hei folkens.

Jeg holder på å lærer React. Har lært en del om React og skal begynne å "utvide" horisonten litt ved å sette opp en node server for håndtering av sending av Epost med SMTP via et kontaktskjema.

Satt opp noe ganske enkelt:

Kode

import React from 'react';
import { Formik, Field, ErrorMessage, Form } from 'formik';
import * as Yup from 'yup';
import axios from 'axios';
import './../styles/contact.css';

const ContactForm = () => {
  // Define validation schema using Yup
  const validationSchema = Yup.object().shape({
    name: Yup.string().required('Name is required'),
    email: Yup.string().email('Invalid email').required('Email is required'),
    message: Yup.string().required('Message is required'),
  });

  // Handle form submission
  const handleSubmit = async (values, { setSubmitting }) => {
    try {
      await axios.post('/backend/send-email', values);
      alert('Email sent successfully');
    } catch (error) {
      console.error(error);
      alert('An error occurred while sending the email');
    } finally {
      setSubmitting(false);
    }
  };

  return (
    <Formik
      initialValues={{ name: '', email: '', message: '' }}
      validationSchema={validationSchema}
      onSubmit={handleSubmit}
    >
      {({ isSubmitting }) => (
        <Form className="contact-form">
          <div className="form-group">
            <label htmlFor="name">Name:</label>
            <Field type="text" id="name" name="name" />
            <ErrorMessage name="name" component="div" className="error-message" />
          </div>

          <div className="form-group">
            <label htmlFor="email">Email:</label>
            <Field type="email" id="email" name="email" />
            <ErrorMessage name="email" component="div" className="error-message" />
          </div>

          <div className="form-group">
            <label htmlFor="message">Message:</label>
            <Field as="textarea" id="message" name="message" />
            <ErrorMessage name="message" component="div" className="error-message" />
          </div>

          <button type="submit" disabled={isSubmitting}>
            Submit
          </button>
        </Form>
      )}
    </Formik>
  );
};

export default ContactForm;
Dette er da contactForm.jsx fila jeg har. Helt basic kjedelig kontaktskjema jeg satt opp for testing.

Kode

require('dotenv').config({ path: './backend/.env' });
const express = require('express');
const app = express();
const path = require('path');
const nodemailer = require('nodemailer');

console.log('Server is running');

// Create a transporter using your SMTP settings
const transporter = nodemailer.createTransport({
  host: process.env.SMTP_HOST,
  port: process.env.SMTP_PORT,
  secure: true,
  auth: {
    user: process.env.SMTP_USERNAME,
    pass: process.env.SMTP_PASSWORD,
  },
  logger: true, // Enable logging
  debug: true, // Enable debug output
});

async function sendEmail(name, email, message) {
  try {
    // Send the email
    const info = await transporter.sendMail({
      from: process.env.SMTP_SENDER_EMAIL,
      to: process.env.SMTP_RECIPIENT_EMAIL,
      subject: 'New contact from submission',
      text: `
        Name: ${name}
        Email: ${email}
        Message: ${message}
      `,
    });

    console.log('Email sent successfully');
    console.log('Debug:', info.messageId, transporter.getLastMessage());
  } catch (error) {
    console.error('Error sending email:', error);
    throw error;
  }
}

app.use(express.json());
app.use(express.urlencoded({ extended: true }));

app.post('/send-email', (req, res) => {
  console.log('Sending Email');
  // Retrieve the form data from the request body
  const { name, email, message } = req.body;

  // Call the sendEmail function with the form data
  sendEmail(name, email, message)
    .then(() => {
      // Send a response back to the client-side (React) app
      res.json({ message: 'Email sent successfully' });
    })
    .catch((error) => {
      console.error('Error sending email:', error);
      res.status(500).json({ message: 'An error occurred while sending the email' });
    });
});

// Serve React app
app.get('*', (req, res) => {
  res.sendFile(path.resolve(__dirname, '../', 'index.html'));
});

const server = app.listen(3001, () => {
  console.log('Server started on port 3001');
});

process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled Promise Rejection:', reason);
});

process.on('SIGTERM', () => {
  server.close(() => {
    console.log('Server terminated');
    process.exit(0);
  });
});

Her er da server.js fila som ligger i mappen /backend/ på root.

Problemstilling:

Når jeg trykker "Submit" på skjema trigges en alert som sier "Email sent successfully" og en Status 200 med enpoint /backend/send-email vises i Network tab i dev tools med POST og riktig info i Request tabben.

Problemet er at det ikke kommer noen Epost.
Har sjekket at SMTP'en fungerer med infoen jeg har. Det er ingenting feilmeldinger i Console eller på server.

Så da står jeg litt fast når det ikke kommer feilmeldinger.
Har sittet her i 2 dager for å prøve å finne ut hva det er som kan forårsake dette uten hell.

Host leverandøren min har også sjekket, men de finner ingen feilmeldinger på server i noen som helst logger for server eller epost.


Noen her som er dreven i React / Node som kan ta en kikk og se om de ser noen feil?