Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  8 823
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?
Hva har du satt SMTP_HOST og SMTP_SENDER_EMAIL til?

Anbefaler en tjeneste som f.eks. Mailgun.
Se f.eks. https://github.com/orliesaurus/nodem...lgun-transport.

Mailgun har økt prisene siden sist gang jeg sjekket, men det ser ut som SendGrid fortsatt har en free tier.
Sist endret av Ozma; 22. mai 2023 kl. 14:25.
Trådstarter
38 6
Smtp host er satt til det hosten min har sagt er korrekt og det samme er sender og receiver.

Har testet smtp innstillingene jeg har satt og smtp fungerer. Virker bare ikke som server.js klarer å hente .env fila korrekt da hvis jeg tar bort alt i .env fila så får jeg fortsatt status 200 og bekreftelse på at eposten er sendt
Det kan se ut som du poster til feil url. I frontendkoden din poster du til

Kode

await axios.post('/backend/send-email', values);
Men i express-koden har du definert "/send-email". Så med mindre det er noe oppsett du ikke har med, er det nok å fjerne "backend" fra react-koden.
Sitat av Gameomanic Vis innlegg
Det er ingenting feilmeldinger i Console eller på server.
Så da står jeg litt fast når det ikke kommer feilmeldinger.
Vis hele sitatet...
Hva med 'Email sent successfully'? Vi kan forvente å se dette i loggen i.h.h til linje 36 i server.js isåfall. Det kan være mange årsaker til at man får statuskode 200 til tross for at e-posten aldri blir sendt. Noe av det første jeg ville ha undersøkt her er om .env verdiene / SMTP konfigurasjonen din fungerer.
  • Host, port
  • Brukernavn, PW etc.

Gjør en liten test, og sjekk om du klarer å sende e-post i det hele tatt med bare serveren din. (Gjerne sleng på en console log på .env verdiene, det kan hende at verdiene er riktig men at de ikke blir lest inn skikkelig) Hvis SMTP konfigurasjonen er OK, og du fremdeles ikke klarer å sende mails så ville mitt neste steg vært å sjekke opp i om det er noen brannmur restriksjoner som blokkerer utgående SMTP trafikk fra serveren din, eller om SMTP tilbyderne din har noen spesielle sikkerhets restriksjoner som gjør at du må autentisere appen din på noe vis eller whiteliste server IPen din.
Et annet tips kan være å lage deg en "debug.js" fil som du har på samme sted som server-fila di, som du kjører med "node debug.js" for å sjekke at serverkoden fungerer.

Her er et forslag som printer env-verdiene og sender en mail.

Kode

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

console.log('SMTP VALUES:');
console.log({
  host: process.env.SMTP_HOST,
  port: process.env.SMTP_PORT,
  user: process.env.SMTP_USERNAME,
  pass: process.env.SMTP_PASSWORD,
});
 
// 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;
  }
}

(async () => {
  await sendEmail('Name', 'mail', 'message');
})();
Trådstarter
38 6
Sitat av Yochi Vis innlegg
Det kan se ut som du poster til feil url. I frontendkoden din poster du til

Kode

await axios.post('/backend/send-email', values);
Men i express-koden har du definert "/send-email". Så med mindre det er noe oppsett du ikke har med, er det nok å fjerne "backend" fra react-koden.
Vis hele sitatet...

Node serveren kjører i en mappe på rota som heter /backend, så derfor denne står sånn da jeg ikke fikk opp endpointet /send-email når jeg ikke hadde /backend/send-email



Hosten min har vært inne å sett på oppsettet. Smtp variablene var riktig, ingen restriksjoner noen plass som hindrer sending av epost.

Skal prøve å sette smtp innstillingene rett i server.js fila for å se om den klarer det da. Får jeg epost så klarer den ikke å lese .env fila, får jeg ikke epost så får jeg undersøke litt mer



EDIT: Da har jeg prøvd å endra sånn at SMTP innstillingene er rett i server.js fila.
Dette fungerte ikke.

Får absolutt ingen feilmeldinger noen plass, noe som irriterer meg sykt mye her akkurat nå.
Får heller ikke noen som helst av console.log's i server.js fila.
Så en plass er det feil =/
Sist endret av Gameomanic; 22. mai 2023 kl. 16:41. Grunn: Automatisk sammenslåing med etterfølgende innlegg.
Har du prøvd å teste dette lokalt ved å kjøre "node server.js" (eller hva som er start-kommandoen din). Da vil du få console-meldinger i terminalen din.

Hvilken host bruker du?

Og, om du ikke får noen feilmeldinger må du skalere ned. Lag deg en route som bare returnerer "Hello World" eller noe, også sjekker du at du får kontakt med den fra React. Når det fungerer kan du utvide med mer logikk og finne ut når det feiler.
Sist endret av Yochi; 23. mai 2023 kl. 10:54.
Har du mulighet til å få tilgang til mailserveren?

Da kjører du følgende kommando for å lese de siste linjene i mail-loggen:

Kode

tail -f /var/log/maillog
Så kan du kjøre følgende kommando for å ha oversikt over hva som skjer på mailserveren i det øyeblikket du submitter mailen:

Kode

watch -n0.1 mailq
Ha terminalen oppe ved siden av nettleseren og kjør siste kommando. Trykk submit. Hvis mailen blir forsøkt levert fra skriptet ditt i det hele tatt, så vil du merke det i terminalen. Dette vil være nyttig for deg når du skal feilsøke videre.
Sist endret av Tysteren; 23. mai 2023 kl. 11:32.