Nodemailer dengan Gmail dan NodeJS


110

Saya mencoba menggunakan nodemailer untuk mengimplementasikan formulir kontak menggunakan NodeJS tetapi hanya berfungsi di lokal dan tidak berfungsi di server jarak jauh ...

Pesan kesalahan saya:

[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' }

Pengontrol saya:

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 (untuk visibilitas, diposting oleh pemberi komentar yang bagus di bawah). Cukup izinkan akses sekali dan biarkan nodemailer masuk secara otomatis, itu akan.
laggingreflex

3
Setelah mencoba segalanya untuk mengirim email melalui gmail menggunakan nodemailer, pengaturan berikut berhasil untuk saya ..
faizanjehangir

Jawaban:


136

Saya menyelesaikan ini dengan membuka url berikut (saat terhubung ke google dengan akun tempat saya ingin mengirim email):

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

Di sana saya mengaktifkan aplikasi yang kurang aman.

Selesai


1
Sudah selesai dilakukan dengan baik! ini berfungsi, meskipun menurut saya itu bukan ide terbaik ... Saya mendapat email pertama saya..Thx
ackuser

tanpa mengaktifkan ini bahkan tidak akan berfungsi di lingkungan lokal. dia dengan jelas menyebutkan bahwa itu bekerja di lingkungan lokal dan tidak bekerja di server jauh. apa solusi untuk itu?
Adithya Sai

ini tidak dapat membantu Anda jika Anda memiliki autentikasi 2FA di akun gmail Anda
sasha romanov

63

Lihat panduan resmi nodemailer untuk menghubungkan Gmail:

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

-

Ini bekerja untuk saya setelah melakukan ini:

  1. Aktifkan aplikasi yang kurang aman - https://www.google.com/settings/security/lesssecureapps
  2. Nonaktifkan Captcha untuk sementara sehingga Anda dapat menghubungkan perangkat / server baru - https://accounts.google.com/b/0/displayunlockcaptcha

18
Nomor 2 menyelesaikan kesengsaraan saya. Saya tidak dapat menemukan tautan itu di mana pun di setelan akun Google. Terima kasih!
programmerstinator

1
Sama disini. Saya sebelumnya melakukan # 1 dan mendapat email yang bekerja di localhost, pindah ke produksi dan tidak ada yang berhasil. # 2 memperbaiki masalah saya untuk produksi. Terima kasih
John

49

Solusi Mudah:

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);
  }
});  

Langkah 1:

buka di sini https://myaccount.google.com/lesssecureapps dan aktifkan untuk aplikasi yang kurang aman. Jika ini tidak berhasil maka

Langkah 2

buka di sini https://accounts.google.com/DisplayUnlockCaptcha dan aktifkan / lanjutkan lalu coba.

bagi saya langkah 1 saja tidak berhasil jadi saya harus pergi ke langkah 2.

saya juga mencoba menghapus paket nodemailer-smtp-transport dan yang mengejutkan saya itu berhasil. tetapi kemudian ketika saya me-restart sistem saya, itu memberi saya kesalahan yang sama, jadi saya harus pergi dan mengaktifkan aplikasi yang kurang aman (saya menonaktifkannya setelah bekerja).

kemudian untuk bersenang-senang saya hanya mencobanya dengan off (aplikasi kurang aman) dan vola itu bekerja lagi!


1
Langkah 1 dan 2 sangat membantu. Terima kasih! Saya mencoba langkah 1 sebelum saya melihat solusi Anda dan tidak berhasil tetapi dengan langkah2 itu ajaib!
MissStack

"smptTransport bukanlah sebuah fungsi"
JWiley

Saya mencoba dengan kedua cara Anda berbagi dengan kami tetapi saya mendapatkan kesalahan yang sama berulang kali {Kesalahan: sambungkan ETIMEDOUT 74.125.68.108:465 di TCPConnectWrap.afterConnect [sebagai oncomplete] (net.js: 1097: 14) errno: ' ETIMEDOUT ', kode:' ECONNECTION ', syscall:' connect ', address: '74 .125.68.108', port: 465, command: 'CONN'}
Anwar Hussain

@AnwarHussain: Saya juga mendapatkan kesalahan yang sama lagi
Pappa S

42

Anda harus menggunakan token XOAuth2 untuk terhubung ke Gmail. Jangan khawatir, Nodemailer sudah tahu tentang itu:

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()
      }
    }
  };

Anda harus membuka Google Cloud Console untuk mendaftarkan aplikasi Anda. Kemudian Anda perlu mengambil token akses untuk akun yang ingin Anda gunakan. Anda dapat menggunakan paspor untuk itu.

Begini tampilannya di kode saya:

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
Apakah ada solusi yang lebih mudah untuk mengirim Email di NodeJS dengan akun GMail?
tonymx227


dapatkah Anda menjelaskan apa yang dilakukan passport.authorize dan mengapa Anda membutuhkan scope, callbackurl dan semacamnya, mengapa Anda tidak bisa melakukannya dengan clientId & secret?
Ismail

passport.authorizemirip dengan passport.authenticatekecuali bahwa ia tidak mencoba memperbarui sesi saat ini. Anda harus lulus callbackURLkarena setelah jabat tangan OAuth, Google perlu tahu ke mana harus mengarahkan pengguna sehingga jabat tangan selesai.
Laurent Perrin


15

Bekerja dengan baik:

1- instal nodemailer , paket jika tidak diinstal (ketik cmd):npm install nodemailer

2- Buka https://myaccount.google.com/lesssecureapps dan aktifkan Izinkan aplikasi yang kurang aman .

3- tulis kode:

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- nikmati!


11

Masalah yang sama terjadi pada saya juga. Saya menguji sistem saya di localhost kemudian disebarkan ke server (yang terletak di negara yang berbeda) kemudian ketika saya mencoba sistem di server produksi saya melihat kesalahan ini. Saya mencoba ini untuk memperbaikinya:

  1. https://www.google.com/settings/security/lesssecureapps Mengaktifkannya tetapi itu bukan solusi saya
  2. https://g.co/allowaccess Saya mengizinkan akses dari luar untuk waktu yang terbatas dan ini menyelesaikan masalah saya.

2
The g.co/allowaccess Link adalah apa yang tetap bagi saya (sudah diaktifkan lesssecureapps) - terima kasih!

10

Bagi saya bekerja dengan cara ini, menggunakan port dan keamanan (saya memiliki masalah untuk mengirim email dari gmail menggunakan PHP tanpa pengaturan keamanan)

Saya berharap akan membantu seseorang.

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);
}

semua konfigurasi tercantum di sini (termasuk contoh)


10

Tidak ada solusi di atas yang berhasil untuk saya. Saya menggunakan kode yang ada dalam dokumentasi NodeMailer . Ini terlihat seperti ini:

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
    }
}); 

terimakasih kawan ! :) thissss ---> host: 'smtp.gmail.com', port: 465, secure: true, Worked for Me
Praveen Vishnu

@PraveenVishnu Tidak masalah, jika Anda memberikan suara untuk jawaban ini, lebih banyak orang akan melihatnya. Mungkin bisa membantu mereka juga.
Hamid

hai, saya tahu ini sudah lama, tetapi apakah Anda keberatan dari mana Anda mendapatkan serviceClient, privateKey dan accessToken? Terima kasih.
Aljohn Yamaro

@AljohnYamaro Layanan mail akan menyediakannya. Dalam kasus saya, itu adalah Gmail. Anda dapat membaca lebih lanjut di sini: stackoverflow.com/questions/36214968/…
Hamid


9

Saya menemukan metode paling sederhana, yang dijelaskan dalam artikel ini yang disebutkan dalam jawaban Greg T , adalah membuat Sandi Aplikasi yang tersedia setelah mengaktifkan 2FA untuk akun tersebut.

myaccount.google.com> Masuk & keamanan> Masuk ke Google> Sandi Aplikasi

Ini memberi Anda kata sandi alternatif untuk akun tersebut, kemudian Anda cukup mengkonfigurasi nodemailer sebagai layanan SMTP biasa.

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

Meskipun Google merekomendasikan Oauth2 sebagai opsi terbaik, metode ini mudah dan belum disebutkan dalam pertanyaan ini.

Tip tambahan: Saya juga menemukan Anda dapat menambahkan nama aplikasi Anda ke alamat "dari" dan GMail tidak menggantinya hanya dengan email akun seperti jika Anda mencoba menggunakan alamat lain. yaitu.

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

Selalu menggunakan this1. Anda perlu menyetel autentikasi 2 pabrik untuk menyetel kata sandi aplikasi. Seberang kurang aman.
gdfgdfg

8

Ini diselesaikan menggunakan nodemailer-smtp-transportmodul di dalam createTransport.

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

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

4

Jika Anda menggunakan Express, express-mailerbungkus nodemailerdengan sangat baik dan sangat mudah digunakan:

//# 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

Untuk beberapa alasan, hanya mengizinkan konfigurasi aplikasi yang kurang aman tidak berfungsi untuk saya bahkan untuk hal captcha. Saya harus melakukan langkah lain yang mengaktifkan konfigurasi IMAP:

Dari halaman bantuan google: https://support.google.com/mail/answer/7126229?p=WebLoginRequired&visit_id=1-636691283281086184-1917832285&rd=3#cantsignin

  • Di kanan atas, klik Pengaturan Pengaturan.
  • Klik Pengaturan.
  • Klik tab Penerusan dan POP / IMAP.
  • Di bagian "Akses IMAP", pilih Aktifkan IMAP.
  • Klik Simpan Perubahan.

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)
  });
});
}

Anda harus menambahkan tipe secureConnection di kode Anda.


2

Saya menggunakan versi lama nodemailer 0.4.1 dan mengalami masalah ini. Saya memperbarui ke 0,5.15 dan semuanya berfungsi dengan baik sekarang.

Diedit package.json untuk mencerminkan perubahan kemudian

npm install

3
Lebih baik melakukan pembaruan npm untuk kasus itu. Jika Anda ingin tahu lebih banyak tentang perbedaan npm update dan npm install - silakan lihat jawaban ini - stackoverflow.com/questions/12478679/…
Anthony Akentiev

2

Hadiri saja: 1- Otentikasi Gmail untuk mengizinkan email tingkat rendah tidak menerima sebelum Anda memulai ulang browser klien 2- Jika Anda ingin mengirim email dengan nodemailer dan Anda tidak ingin menggunakan protokol xouath2 di sana Anda harus menulis sebagai koneksi secureconnection: salah seperti di bawah ini

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 digunakan dua kali, yang mana?
Biranchi

Sangat jelas Yang pertama adalah untuk membuat pengaturan smtpTransport dan yang kedua untuk mengirim email dengan menggunakan pengaturan ini bekerja dengan sempurna di firebase sekarang
Hamit YILDIRIM

2

pertama instal nodemailer

npm install nodemailer  --save

impor ke file js

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");
        }
    });

bekerja di aplikasi saya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.