Gmail ve NodeJS ile Nodemailer


110

NodeJS kullanarak bir iletişim formu uygulamak için nodemailer kullanmaya çalışıyorum ancak yalnızca yerelde çalışıyor, uzak bir sunucuda çalışmıyor ...

Hata mesajım:

[website.fr-11 (out) 2013-11-09T15:40:26] { [AuthError: Invalid login - 534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.
[website.fr-11 (out) 2013-11-09T15:40:26] 534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787
[website.fr-11 (out) 2013-11-09T15:40:26] 534 5.7.14 54 fr4sm15630311wib.0 - gsmtp]
[website.fr-11 (out) 2013-11-09T15:40:26]   name: 'AuthError',
[website.fr-11 (out) 2013-11-09T15:40:26]   data: '534-5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbvlX\r\n534-5.7.14 V-dFQLgb7aRCYApxlOBuha5ESrQEbRXK0iVtOgBoYeARpm3cLZuUS_86kK7yPis7in3dGC\r\n534-5.7.14 N1sqhr3D2IYxHAN3m7QLJGukwPSZVGyhz4nHUXv_ldo9QfqRydPhSvFp9lnev3YQryM5TX\r\n534-5.7.14 XL1LZuJL7zCT5dywMVQyWqqg9_TCwbLonJnpezfBLvZwUyersknTP7L-VAAL6rhddMmp_r\r\n534-5.7.14 A_5pRpA> Please log in via your web browser and then try again.\r\n534-5.7.14 Learn more at https://support.google.com/mail/bin/answer.py?answer=787\r\n534 5.7.14 54 fr4sm15630311wib.0 - gsmtp',
[website.fr-11 (out) 2013-11-09T15:40:26]   stage: 'auth' }

Denetleyicim:

exports.contact = function(req, res){
    var name = req.body.name;
    var from = req.body.from;
    var message = req.body.message;
    var to = '*******@gmail.com';
    var smtpTransport = nodemailer.createTransport("SMTP",{
        service: "Gmail",
        auth: {
            user: "******@gmail.com",
            pass: "*****"
        }
    });
    var mailOptions = {
        from: from,
        to: to, 
        subject: name+' | new message !',
        text: message
    }
    smtpTransport.sendMail(mailOptions, function(error, response){
        if(error){
            console.log(error);
        }else{
            res.redirect('/');
        }
    });
}

14
google.com/accounts/DisplayUnlockCaptcha (görünürlük için, aşağıda iyi bir yorumcu tarafından yayınlanmıştır). Erişime bir kez izin verin ve nodemailer'ın otomatik olarak oturum açmasına izin verin.
laggingreflex

3
Nodemailer kullanarak gmail üzerinden mail göndermek için her şeyi denedikten sonra, aşağıdaki ayar benim için çalıştı ..
faizanjehangir

Yanıtlar:


136

Bunu şu url'ye giderek çözdüm (posta göndermek istediğim hesapla google'a bağlıyken):

https://www.google.com/settings/security/lesssecureapps

Orada daha az güvenli uygulamaları etkinleştirdim.

Bitti


1
Aferin! işe yarıyor, ancak bunun en iyi fikir olduğunu düşünmüyorum ... İlk e
postamı

bunu etkinleştirmeden yerel ortamda çalışmayacaktır. yerel ortamda çalıştığını ve uzak sunucuda çalışmadığını açıkça belirtti. thaat için çözüm nedir?
Adithya Sai

Gmail hesabınızda
2FA

64

Nodemailer'ın resmi Gmail'e bağlanma kılavuzuna bakın:

https://community.nodemailer.com/using-gmail/

-

Bunu yaptıktan sonra benim için çalışıyor:

  1. Daha az güvenli uygulamaları etkinleştirin - https://www.google.com/settings/security/lesssecureapps
  2. Yeni cihazı / sunucuyu bağlayabilmek için Captcha'yı geçici olarak devre dışı bırakın - https://accounts.google.com/b/0/displayunlockcaptcha

19
2 numara dertlerimi çözdü. Bu bağlantıyı Google'ın hesap ayarlarında hiçbir yerde bulamadım. Teşekkür ederim!
programstinator

1
Burada aynı. Daha önce 1 numarayı yaptım ve localhost üzerinde çalışan e-postalar aldım, üretime geçtim ve hiçbir şey işe yaramadı. # 2 üretim sorunumu çözdü. Teşekkürler
John

49

Kolay Çözüm:

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');

var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  host: 'smtp.gmail.com',
  auth: {
    user: 'somerealemail@gmail.com',
    pass: 'realpasswordforaboveaccount'
  }
}));

var mailOptions = {
  from: 'somerealemail@gmail.com',
  to: 'friendsgmailacc@gmail.com',
  subject: 'Sending Email using Node.js[nodemailer]',
  text: 'That was easy!'
};

transporter.sendMail(mailOptions, function(error, info){
  if (error) {
    console.log(error);
  } else {
    console.log('Email sent: ' + info.response);
  }
});  

Aşama 1:

https://myaccount.google.com/lesssecureapps buraya gidin ve daha az güvenli uygulamalar için etkinleştirin. Bu işe yaramazsa o zaman

Adım 2

https://accounts.google.com/DisplayUnlockCaptcha buraya gidin ve etkinleştirin / devam edin ve ardından deneyin.

benim için 1. adım tek başına işe yaramadı, bu yüzden 2. adıma gitmem gerekti.

Ayrıca nodemailer-smtp-transport paketini kaldırmayı denedim ve şaşırtıcı bir şekilde işe yaradı. ama sonra sistemimi yeniden başlattığımda bana aynı hatayı verdi, bu yüzden gitmem ve daha az güvenli uygulamayı açmam gerekti (işimden sonra devre dışı bıraktım).

sonra eğlence için kapalı (daha az güvenli uygulama) ile denedim ve vola tekrar çalıştı!


1
Adım 1 ve 2 çok yardımcı oldu. teşekkür ederim! Çözümünüzü görmeden ve işe yaramadan önce step1'i denedim ama step2 ile bu bir sihir!
MissStack

"smptTransport bir işlev değildir"
JWiley

Bizimle paylaştığınız her ikisini de denedim ama aynı hatayı tekrar tekrar alıyorum {Hata: connect ETIMEDOUT 74.125.68.108:465, TCPConnectWrap.afterConnect [as oncomplete] (net.js: 1097: 14) errno: ' ETIMEDOUT ', kod:' ECONNECTION ', sistem çağrısı:' bağlan ', adres: '74 .125.68.108', bağlantı noktası: 465, komut: 'CONN'}
Anwar Hussain

@AnwarHussain: Ben de yine aynı hatayı alıyorum
Pappa S

43

Gmail'e bağlanmak için bir XOAuth2 belirteci kullanmalısınız . Endişelenmeyin, Nodemailer bunu zaten biliyor:

var smtpTransport = nodemailer.createTransport('SMTP', {
    service: 'Gmail',
    auth: {
      XOAuth2: {
        user: smtpConfig.user,
        clientId: smtpConfig.client_id,
        clientSecret: smtpConfig.client_secret,
        refreshToken: smtpConfig.refresh_token,
        accessToken: smtpConfig.access_token,
        timeout: smtpConfig.access_timeout - Date.now()
      }
    }
  };

Uygulamanızı kaydettirmek için Google Cloud Console'a gitmeniz gerekecek . Daha sonra kullanmak istediğiniz hesaplar için erişim jetonları almanız gerekir. Bunun için passportjs kullanabilirsiniz .

Kodumda şöyle görünüyor:

var passport = require('passport'),
    GoogleStrategy = require('./google_oauth2'),
    config = require('../config');

passport.use('google-imap', new GoogleStrategy({
  clientID: config('google.api.client_id'),
  clientSecret: config('google.api.client_secret')
}, function (accessToken, refreshToken, profile, done) {
  console.log(accessToken, refreshToken, profile);
  done(null, {
    access_token: accessToken,
    refresh_token: refreshToken,
    profile: profile
  });
}));

exports.mount = function (app) {
  app.get('/add-imap/:address?', function (req, res, next) {
    passport.authorize('google-imap', {
        scope: [
          'https://mail.google.com/',
          'https://www.googleapis.com/auth/userinfo.email'
        ],
        callbackURL: config('web.vhost') + '/add-imap',
        accessType: 'offline',
        approvalPrompt: 'force',
        loginHint: req.params.address
      })(req, res, function () {
        res.send(req.user);
      });
  });
};

9
GMail hesabıyla NodeJS'de E-posta göndermenin daha kolay bir çözümü var mı?
tonymx227


passport.authorize'ın ne yaptığını ve neden kapsama, callbackurl'ye vb. ihtiyacınız olduğunu açıklayabilir misiniz, neden bunu sadece clientId & secret ile yapamıyorsunuz?
İsmail

passport.authorizepassport.authenticategeçerli oturumu güncellemeye çalışmaması dışında benzerdir . Geçmeniz gerekir callbackURLçünkü OAuth el sıkışmasından sonra, anlaşmanın tamamlanabilmesi için Google'ın kullanıcıyı nereye yönlendireceğini bilmesi gerekir.
Laurent Perrin


15

İyi çalıştı:

1- nodemailer'ı kurun , kurulu değilse paketi kurun (cmd yazın):npm install nodemailer

2- https://myaccount.google.com/lesssecureapps adresine gidin ve Daha az güvenli uygulamalara izin ver'i açın .

3- kodu yaz:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'trueUsername@gmail.com',
        pass: 'truePassword'
    }
});

const mailOptions = {
    from: 'any@any.com', // sender address
    to: 'true@true.com', // list of receivers
    subject: 'test mail', // Subject line
    html: '<h1>this is a test mail.</h1>'// plain text body
};

transporter.sendMail(mailOptions, function (err, info) {
    if(err)
        console.log(err)
    else
        console.log(info);
})

4- Keyfini Çıkarın!


11

Bana da aynı sorun oldu. Sistemimi localhost'ta test ettim, sonra sunucuya (farklı bir ülkede bulunan) konuşlandırdım ve ardından sistemi üretim sunucusunda denediğimde bu hatayı gördüm. Bunları düzeltmek için denedim:

  1. https://www.google.com/settings/security/lesssecureapps Etkinleştirdi ama benim çözümüm değildi
  2. https://g.co/allowaccess Sınırlı bir süre için dışarıdan erişime izin verdim ve bu sorunumu çözdü.

2
G.co/allowaccess bağlantı hangi benim için sabit (vardı zaten etkin lesssecureapps) idi - teşekkürler!

10

Benim için bu şekilde çalışıyor, bağlantı noktası ve güvenlik kullanarak (güvenlik ayarları olmadan PHP kullanarak gmail'den e-posta gönderirken sorun yaşadım)

Umarım birine yardım eder.

var sendEmail = function(somedata){
  var smtpConfig = {
    host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL, 
                  // you can try with TLS, but port is then 587
    auth: {
      user: '***@gmail.com', // Your email id
      pass: '****' // Your password
    }
  };

  var transporter = nodemailer.createTransport(smtpConfig);
  // replace hardcoded options with data passed (somedata)
  var mailOptions = {
    from: 'xxxx@gmail.com', // sender address
    to: 'yyyy@gmail.com', // list of receivers
    subject: 'Test email', // Subject line
    text: 'this is some text', //, // plaintext body
    html: '<b>Hello world ✔</b>' // You can choose to send an HTML body instead
  }

  transporter.sendMail(mailOptions, function(error, info){
    if(error){
      return false;
    }else{
      console.log('Message sent: ' + info.response);
      return true;
    };
  });
}

exports.contact = function(req, res){
   // call sendEmail function and do something with it
   sendEmail(somedata);
}

tüm yapılandırmalar burada listelenmiştir (örnekler dahil)


10

Yukarıdaki çözümlerden hiçbiri benim için işe yaramadı. NodeMailer belgelerinde bulunan kodu kullandım . Şöyle görünüyor:

let transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true,
    auth: {
        type: 'OAuth2',
        user: 'user@example.com',
        serviceClient: '113600000000000000000',
        privateKey: '-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...',
        accessToken: 'ya29.Xx_XX0xxxxx-xX0X0XxXXxXxXXXxX0x',
        expires: 1484314697598
    }
}); 

sağol kanka ! :) thissss ---> host: 'smtp.gmail.com', port: 465, güvenli: true, Worked for Me
Praveen Vishnu

@PraveenVishnu Sorun değil, bu yanıtı oylarsanız daha fazla kişi görecek. Onlara da yardımcı olabilir.
Hamid

merhaba, bunun eski bir tanesini biliyorum, ama serviceClient, privateKey ve accessToken'ı nereden aldınız? Teşekkür ederim.
Aljohn Yamaro

@AljohnYamaro Posta hizmeti bunu sağlayacaktır. Benim durumumda bu Gmail idi. Buradan daha fazla bilgi edinebilirsiniz: stackoverflow.com/questions/36214968/…
Hamid


9

Greg T'nin cevabında bahsedilen bu makalede açıklanan en basit yöntemin, hesap için 2FA'yı açtıktan sonra kullanılabilen bir Uygulama Şifresi oluşturmak olduğunu buldum .

myaccount.google.com> Oturum açma ve güvenlik> Google'da oturum açma> Uygulama Şifreleri

Bu size hesap için alternatif bir şifre verir, ardından nodemailer'ı normal bir SMTP hizmeti olarak yapılandırırsınız.

var smtpTransport = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 587,
    auth: {
        user: "username@gmail.com",
        pass: "app password"
    }
});

Google en iyi seçenek olarak Oauth2'yi önerirken, bu yöntem kolaydır ve bu soruda henüz bahsedilmemiştir.

Ek ipucu: Ayrıca, uygulamanızın adını "gönderen" adresine ekleyebileceğinizi ve GMail'in başka bir adres kullanmaya çalıştığınızda olduğu gibi yalnızca hesap e-postasıyla değiştirmediğini öğrendim. yani.

from: 'My Pro App Name <username@gmail.com>'

Her zaman bunu kullan 1. Uygulama şifresini ayarlamak için 2 fabrika doğrulama ayarlamanız gerekir. Daha az güvenli tam tersi.
gdfgdfg

8

nodemailer-smtp-transportCreateTransport içindeki modül kullanılarak çözülür.

var smtpTransport = require('nodemailer-smtp-transport');

var transport = nodemailer.createTransport(smtpTransport({
    service: 'gmail',
    auth: {
        user: '*******@gmail.com',
        pass: '*****password'
    }
}));

4

Express kullanırsanız, çok hoş bir şekilde express-mailersarılır nodemailerve kullanımı çok kolaydır:

//# config/mailer.js    
module.exports = function(app) {
  if (!app.mailer) {
    var mailer = require('express-mailer');
    console.log('[MAIL] Mailer using user ' + app.config.mail.auth.user);
    return mailer.extend(app, {
      from: app.config.mail.auth.user,
      host: 'smtp.gmail.com',
      secureConnection: true,
      port: 465,
      transportMethod: 'SMTP',
      auth: {
        user: app.config.mail.auth.user,
        pass: app.config.mail.auth.pass
      }
    });
  }
};

//# some.js
require('./config/mailer.js)(app);
app.mailer.send("path/to/express/views/some_view", {
  to: ctx.email,
  subject: ctx.subject,
  context: ctx
}, function(err) {
  if (err) {
    console.error("[MAIL] Email failed", err);
    return;
  }
  console.log("[MAIL] Email sent");
});

//#some_view.ejs
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title><%= subject %></title>
  </head>
  <body>
  ... 
  </body>
</html>



4

Bazı nedenlerden dolayı, sadece daha az güvenli uygulama yapılandırmasına izin vermek, captcha olayı bile benim için işe yaramadı. IMAP yapılandırmasını etkinleştiren başka bir adım daha yapmam gerekiyordu:

Google'ın yardım sayfasından: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • Sağ üstte, Ayarlar Ayarlar'ı tıklayın.
  • Ayarlar'ı tıklayın.
  • Yönlendirme ve POP / IMAP sekmesini tıklayın.
  • "IMAP Erişimi" bölümünde, IMAP'i Etkinleştir'i seçin.
  • Değişiklikleri Kaydet'i tıklayın.

3
exports.mailSend = (res, fileName, object1, object2, to, subject,   callback)=> {
var smtpTransport = nodemailer.createTransport('SMTP',{ //smtpTransport
host: 'hostname,
port: 1234,
secureConnection: false,
//   tls: {
//     ciphers:'SSLv3'
// },
auth: {
  user: 'username',
  pass: 'password'
}

});
res.render(fileName, {
info1: object1,
info2: object2
}, function (err, HTML) {

smtpTransport.sendMail({
  from: "mail@from.com",
  to: to,
  subject: subject,
  html: HTML
}
  , function (err, responseStatus) {
      if(responseStatus)
    console.log("checking dta", responseStatus.message);
    callback(err, responseStatus)
  });
});
}

Kodunuza secureConnection türü eklemelisiniz.


2

Nodemailer 0.4.1'in eski bir sürümünü kullanıyordum ve bu sorunu yaşadım. 0.5.15'e güncelledim ve şimdi her şey iyi çalışıyor.

Sonra değişiklikleri yansıtmak için package.json düzenlendi

npm install

3
Bu durum için npm güncellemesi yapmak daha iyidir . Npm güncellemesinin ve npm'nin nasıl farklı yüklendiği hakkında daha fazla bilgi edinmek istiyorsanız - o zaman lütfen bu yanıta bakın - stackoverflow.com/questions/12478679/…
Anthony Akentiev

2

Sadece bunlara katılın: 1- Düşük seviyeli e-postalara izin vermek için Gmail kimlik doğrulaması, istemci tarayıcınızı yeniden başlatmadan önce kabul etmez 2- nodemailer ile e-posta göndermek istiyorsanız ve xouath2 protokolünü kullanmak istemiyorsanız, oraya güvenli bağlantı olarak yazmalısınız: yanlış aşağıdaki gibi

const routes = require('express').Router();
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');



routes.get('/test', (req, res) => {
  res.status(200).json({ message: 'test!' });
});

routes.post('/Email', (req, res) =>{

    var smtpTransport = nodemailer.createTransport({
        host: "smtp.gmail.com",
        secureConnection: false,
        port: 587,
        requiresAuth: true,
        domains: ["gmail.com", "googlemail.com"],
        auth: {
            user: "your gmail account", 
            pass: "your password*"
        }
});  

  var mailOptions = {
      from: 'from@gmail.com',
      to:'to@gmail.com',
      subject: req.body.subject,
      //text: req.body.content,
      html: '<p>'+req.body.content+' </p>'
  };

  smtpTransport.sendMail(mailOptions, (error, info) => {
    if (error) {
        return console.log('Error while sending mail: ' + error);
    } else {
        console.log('Message sent: %s', info.messageId);
    }
    smtpTransport.close();
});  

})

module.exports = routes;

smtpTransport iki kez kullanılıyor, hangisi ne?
Biranchi

Gerçekten çok net Birincisi smtpTransport ayarlarını oluşturmak için ve bu ayarları kullanarak mail göndermek için saniye saniye firebase'de mükemmel çalışıyor
Hamit YILDIRIM

2

ilk kurulum nodemailer

npm install nodemailer  --save

js dosyasına içe aktar

const nodemailer = require("nodemailer");

const smtpTransport = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "example@gmail.com",
        pass: "password"
    },
    tls: {
        rejectUnauthorized: false
    }
});






 const mailOptions = {
        from: "example@gmail.com",
        to: sending@gmail.com,
        subject: "Welcome to ",
        text: 'hai send from me'.
    };


    smtpTransport.sendMail(mailOptions, function (error, response) {
        if (error) {
            console.log(error);
        }
        else {
            console.log("mail sent");
        }
    });

benim uygulamamda çalışıyor

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.