web-dev-qa-db-fra.com

Identifiants manquants pour le nodemailer "PLAIN"

J'essaie d'utiliser nodemailer dans mon formulaire de contact pour recevoir des commentaires et les envoyer directement à un e-mail. Voici le formulaire ci-dessous.

<form method="post" action="/contact">
      <label for="name">Name:</label>
      <input type="text" name="name" placeholder="Enter Your Name" required><br>
      <label for="email">Email:</label>
      <input type="email" name="email" placeholder="Enter Your Email" required><br>
      <label for="feedback">Feedback:</label>
      <textarea name="feedback" placeholder="Enter Feedback Here"></textarea><br>
      <input type="submit" name="sumbit" value="Submit">
</form>

Voici à quoi ressemble la demande côté serveur

app.post('/contact',(req,res)=>{
let transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: '[email protected]',
        password: 'password'
    }
});
var mailOptions = {
    from: req.body.name + '&lt;' + req.body.email + '&gt;',
    to: '[email protected]',
    subject: 'Plbants Feedback',
    text: req.body.feedback 
};
transporter.sendMail(mailOptions,(err,res)=>{
    if(err){
        console.log(err);
    }
    else {

    }
});

Je reçois l'erreur Missing credentials for "PLAIN". Toute aide est appréciée, merci beaucoup.

10
igolo

J'ai pu résoudre ce problème en utilisant le numéro 3, Configurer l'authentification 3LO, exemple de la documentation nodemailer (lien: https://nodemailer.com/smtp/oauth2/ ). Mon code ressemble à ceci:

let transporter = nodemailer.createTransport({
    Host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: '[email protected]',
        clientId: '000000000000-xxx0.apps.googleusercontent.com',
        clientSecret: 'XxxxxXXxX0xxxxxxxx0XXxX0',
        refreshToken: '1/XXxXxsss-xxxXXXXXxXxx0XXXxxXXx0x00xxx',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x'
    }
});

Si vous avez regardé l'exemple dans le lien que j'ai indiqué ci-dessus, vous pouvez voir qu'il y a une propriété 'expires' mais dans mon code je ne l'ai pas incluse et cela fonctionne toujours très bien.

Pour obtenir le clientId, clientSecret, refreshToken et accessToken, je viens de regarder cette vidéo https://www.youtube.com/watch?v=JJ44WA_eV8E .

Je ne sais pas si cela vous est encore utile.

14
thegreathypocrite

Le service de messagerie de l'application Gmail/Google nécessite OAuth2 pour l'authentification. Le mot de passe en texte brut nécessitera la désactivation manuelle des fonctions de sécurité sur le compte Google.

Pour utiliser OAuth2 dans Nodemailer, reportez-vous à: https://nodemailer.com/smtp/oauth2/

Exemple de code:

var email_smtp = nodemailer.createTransport({      
  Host: "smtp.gmail.com",
  auth: {
    type: "OAuth2",
    user: "[email protected]",
    clientId: "CLIENT_ID_HERE",
    clientSecret: "CLIENT_SECRET_HERE",
    refreshToken: "REFRESH_TOKEN_HERE"                              
  }
});

Et si vous souhaitez toujours utiliser un mot de passe en texte brut, désactivez la connexion sécurisée sur votre compte Google et utilisez comme suit:

var email_smtp = nodemailer.createTransport({      
  Host: "smtp.gmail.com",
  auth: {
    type: "login", // default
    user: "[email protected]",
    pass: "PASSWORD_HERE"
  }
});
4
Jeffrey Roshan

Tu as

auth: {
    user: '[email protected]',
    password: 'password'
}

Mais tu devrais écrire ceci

auth: {
    user: '[email protected]',
    pass: 'password'
}

Renommez simplement le mot de passe pour passer.

2
Victor Fazer