send email via nodemailer

17.1k Views Asked by At

I try to send email via nodemailer but getting error - TypeError: Cannot read property 'method' of undefined. It looks like sendMail function is not defined. Any advise please? P.S. This code for chatbot hosted on AWS

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

module.exports = function someName() {

// create reusable transporter object using the default SMTP transport
var transporter = nodemailer.createTransport(smtpTransport({
  service: 'gmail',
  auth: {
      user: '[email protected]',
      pass: '*******'
  }
}))

// setup e-mail data with unicode symbols
var mailOptions = {
  from: '"nerd studio" <[email protected]>', // sender address
  to: '[email protected]', // list of receivers
  subject: 'Подтверждение запроса \\ разработак чат-ботов \\ nerd       studio', // Subject line
  text: 'Добрый день! Вы оставили нашему Валере запрос и мы с радостью подтверждаем его получение. В ближайшее время с вами свяжется наш менелдер', // plaintext body
  html: '<b>Добрый день! Вы оставили нашему Валере запрос и мы с радостью подтверждаем его получение. В ближайшее время с вами свяжется наш менелдер</b>' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
  console.log(mailOptions);
  console.log(info);
   if(error){
       return console.log(error);
   }
   console.log('Message sent: ' + info.response);
 });
}
5

There are 5 best solutions below

4
On

I have nodemailer currently working this way: Create a file config/mail.js:

var nodemailer = require('nodemailer');

var transporter = nodemailer.createTransport({
    host: 'yourHost',
    port: 2525, //example
    auth: {
        user: 'yourUser',
        pass: 'yourPass'
    }
});

module.exports = function(params) {
    this.from = 'yourEmail';

    this.send = function(){
        var options = {
            from : this.from,
            to : params.to,
            subject : params.subject,
            text : params.message
        };

        transporter.sendMail(options, function(err, suc){
            err ? params.errorCallback(err) : params.successCallback(suc);
        });
    }
}

And then, anytime I want to send an email:

var Mail = require(path.join(__dirname, '..', '..', 'config', 'mail.js'));

var options = {
    to: '[email protected]',
    subject: 'subject',
    message: 'your message goes here'
}

var mail = new Mail({
    to: options.to,
    subject: options.subject,
    message: options.message,
    successCallback: function(suc) {
        console.log('success');
    },
    errorCallback: function(err) {
        console.log('error: ' + err);
    }
});

mail.send();
2
On

Try this code.First you have to create an app in Google Cloud Console and Enable Gmail API from library.Get the credentials of your app.For that click on Credentials and in the place of Authorized redirect URIskeep this link https://developers.google.com/oauthplayground and save it.Next in another tab open this link https://developers.google.com/oauthplayground/ click on settings symbol on right side.And make a tick on check box(i.e,Use your own OAuth credentials) after this You have to give your clientId and clientSecret.And at the sametime on left side there is a text box with placeholder like Input Your Own Scopes there keep this link https://mail.google.com/ and click on Authorize APIs then click on Exchange authorization code for tokens then you will get your refreshToken and accessToken keep these two in your code.Hope this hepls for you.

    const nodemailer=require('nodemailer');
    const xoauth2=require('xoauth2');
    var transporter=nodemailer.createTransport({
    service:'gmail',
    auth:{
        type: 'OAuth2',
        user:'Your_Email',
    clientId:'Your_clientId',//get this from Google Cloud Console
    clientSecret:'Your_clientSecret',
    refreshToken:'Your_refreshToken',//get this from https://developers.google.com/oauthplayground/
    accessToken:'Your_accessToken'
    },
    });
    var mailOptions={
    from:'<Your_email>',
    to:'Your firends mail',
    subject:'Sample mail',
    text:'Hello !!!!!!!!!!!!!'
    }
    transporter.sendMail(mailOptions,function(err,res){
    if(err){
        console.log('Error');
    }
    else{
    console.log('Email Sent');
    }
    })
0
On

You don't need to install npm nodemailer-smtp-transport, only nodemailer is enough to send email to gmail. But first, go to the https://myaccount.google.com/security google account and scroll down and check Allow less secure apps: ON and keep ON. you will send your gmail email. Here, is the full code -

var nodemailer = require('nodemailer');
app.post('/contactform', function (req, res) {


        var mailOpts, smtpTrans;

        //Setup Nodemailer transport, I chose gmail. Create an application-specific password to avoid problems.
        smtpTrans = nodemailer.createTransport(smtpTransport({
            service: 'gmail',
            //  host:'smtp.gmail.com',
            //  port:465,
            // secure:true,
            auth: {
                user: "[email protected]",
                pass: "xxxxxx"
            }
        }));
        var mailoutput = "<html>\n\
                        <body>\n\
                        <table>\n\
                        <tr>\n\
                        <td>Name: </td>" + req.body.form_name + "<td></td>\n\
                        </tr>\n\
                        <tr>\n\
                        <td>Email: </td><td>" + req.body.form_email + "</td>\n\
                        </tr>\n\
                        <tr>\n\
                        <td>MN: </td>" + req.body.form_phone + "<td></td>\n\
                        </tr>\n\
                        <tr>\n\
                        <td>Messge: </td>" + req.body.form_message + "<td></td>\n\
                        </tr>\n\
                        </table></body></html>";
        //Mail options
        mailOpts = {
            to: "Your_App_Name <[email protected]>",
            subject: req.body.form_subject,
            html: mailoutput
        };

        smtpTrans.sendMail(mailOpts, function (error, res) {
            if (error) {
                // res.send("Email could not send due to error" +error);
                return console.log(error);
            }
        });
        console.log('Message sent successfully!');
            res.render('contact.ejs');
    });
    //console.log(query.sql);

});
0
On

Using Gmail

var nodemailer = require('nodemailer');

// Create the transporter with the required configuration for Gmail
// change the user and pass !
var transporter = nodemailer.createTransport({
    host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL
    auth: {
        user: '[email protected]',
        pass: 'myPassword'
    }
});

// setup e-mail data
var mailOptions = {
    from: '"Our Code World " <[email protected]>', // sender address (who sends)
    to: '[email protected], [email protected]', // list of receivers (who receives)
    subject: 'Hello', // Subject line
    text: 'Hello world ', // plaintext body
    html: '<b>Hello world </b><br> This is the first email sent with Nodemailer in Node.js' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
    if(error){
        return console.log(error);
    }

    console.log('Message sent: ' + info.response);
});

Using Hotmail

var nodemailer = require('nodemailer');

// Create the transporter with the required configuration for Outlook
// change the user and pass !
var transporter = nodemailer.createTransport({
    host: "smtp-mail.outlook.com", // hostname
    secureConnection: false, // TLS requires secureConnection to be false
    port: 587, // port for secure SMTP
    tls: {
       ciphers:'SSLv3'
    },
    auth: {
        user: '[email protected]',
        pass: 'myPassword'
    }
});

// setup e-mail data, even with unicode symbols
var mailOptions = {
    from: '"Our Code World " <[email protected]>', // sender address (who sends)
    to: '[email protected], [email protected]', // list of receivers (who receives)
    subject: 'Hello ', // Subject line
    text: 'Hello world ', // plaintext body
    html: '<b>Hello world </b><br> This is the first email sent with Nodemailer in Node.js' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
    if(error){
        return console.log(error);
    }

    console.log('Message sent: ' + info.response);
});

Alternatively, if your account is hotmail instead of outlook, you can use the buil-in hotmail service using the following transport:

var transport = nodemailer.createTransport("SMTP", {
    service: "hotmail",
    auth: {
        user: "[email protected]",
        pass: "password"
    }
});

Using Zoho

var nodemailer = require('nodemailer');

// Create the transporter with the required configuration for Gmail
// change the user and pass !
var transporter = nodemailer.createTransport({
    host: 'smtp.zoho.com',
    port: 465,
    secure: true, // use SSL
    auth: {
        user: '[email protected]',
        pass: 'myPassword'
    }
});

// setup e-mail data, even with unicode symbols
var mailOptions = {
    from: '"Our Code World " <[email protected]>', // sender address (who sends)
    to: '[email protected], [email protected]', // list of receivers (who receives)
    subject: 'Hello ', // Subject line
    text: 'Hello world ', // plaintext body
    html: '<b>Hello world </b><br> This is the first email sent with Nodemailer in Node.js' // html body
};

// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
    if(error){
        return console.log(error);
    }

    console.log('Message sent: ' + info.response);
});
0
On

I find solution for , How to send email from="userEmail" to="myEmail"? THIS IS TRICK

var nodemailer = require('nodemailer'); router.post('/contacts-variant-2', (req, res, next) => { var name=req.body.name; var email=req.body.email; var message=req.body.message; const output=`
<h3>Contact Details</h3>
<ul>
  <li>Name is : ${req.body.name}</li>
  <li>Email is : ${req.body.email}</li>
</ul>
<h3>Message</h3>
<p>${req.body.message}</p>
`; var transporter = nodemailer.createTransport({ service: 'yahoo', auth: { user: '[email protected]', pass: 'password' } }); var mailOptions = { from:'[email protected]', to:'[email protected]', subject: name, text: 'Your have a new
contact request', html:output }; transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log("errors is somthing "+error); res.send(404); } else { console.log('Email sent: ' + info.response); res.send(200); } }); });