web-dev-qa-db-fra.com

NEXT.JS et NODEMAILER, envoyant un email du formulaire de contact

J'ai un problème avec mon formulaire de contact dans Next.js, je n'ai aucune erreur (qui sont affichées), tout a fonctionné jusqu'à déploiement (sur Vercel). J'approche mon formulaire et j'ai statut 200, mais je ne reçois pas mon email sur gmail. De plus, je ne recive pas d'informations supplémentaires. J'ai reçu des courriels, quand j'ai testé mon application sur "dev" et "construire". J'ai également une option "moins sécurisée d'applications" dans le compte Gmail.

Voici mon code dans le prochain.js:

méthode d'extraction en contact.js:

 fetch("/api/contact", {
        method: "POST",
        headers: {
          Accept: "application/json, text/plain, */*",
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          name: mailName,
          email: mailAddress,
          text: mailText,
        }),
      }).then((res) => {
        console.log("Fetch: ", res);
        res.status === 200
        ?
        router.Push("/success")
          : router.Push("/error");

dans API/CONTACT.JS

require("dotenv").config();
const nodemailer = require("nodemailer");

export default (req, res) => {

  const { name, email, text } = req.body;

  const transporter = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: process.env.EMAIL,
      pass: process.env.PASSWORD,
    },
  });

  const mailOption = {
    from: `${email}`,
    to: `${process.env.EMAIL}`,
    subject: `New mail from ${email}`,
    text: `
    ${name} wrote:
    ${text}
    `,
  };

  transporter.sendMail(mailOption, (err, data) => {
    if (err) {
      console.log(err);
    } else {
      console.log("mail send");
    }
  });

  console.log(name, email, text);
  res.send("success");
};

S'il vous plaît aider

3
Maciej

Étant donné que votre code fonctionne bien en local et non dans l'environnement de déploiement, j'ai deux suggestions.

Tout d'abord, assurez-vous de disposer de toutes les variables d'environnement.

Deuxièmement, la façon dont vous avez écrit votre code, cela reviendra toujours au succès car transporter.sendMail est asynchrone et res.send est en dehors de cela.

Changer comme,

transporter.sendMail(mailOption, (err, data) => {
    if (err) {
      console.log(err);
      res.send("error" + JSON.stringify(err));
    } else {
      console.log("mail send");
      res.send("success");
    }
});
1
sidthesloth