22

I am trying to send the data from the form I created to my gmail account, when clicking the sumbit button I always get the same error. I found a lot of issues about nodemailer, but none of them seem to be the same issue as I am experiencing.

Ofcourse I have stated my clientId but just deleted for this post.

TypeError: Cannot create property 'mailer' on string 'SMTP'
at Mail (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\nodemailer\lib\mailer\index.js:45:33)
   at Object.module.exports.createTransport (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\nodemailer\lib\nodemailer.js:46:14)
   at C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\src\app.js:39:26
   at Layer.handle [as handle_request] (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\layer.js:95:5)
   at next (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\route.js:131:13)
   at Route.dispatch (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\route.js:112:3)
   at Layer.handle [as handle_request] (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\layer.js:95:5)
   at C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:277:22
   at Function.process_params (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:330:12)
   at next (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:271:10)
   at serveStatic (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\node_modules\serve-static\index.js:75:16)
   at Layer.handle [as handle_request] (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\layer.js:95:5)
   at trim_prefix (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:312:13)
   at C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:280:7
   at Function.process_params (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:330:12)
   at next (C:\Users\snowr\Documents\dev\zorgkaartnl\zorgkaartnl\node_modules\express\lib\router\index.js:271:10)

this is my app.js:

// require modules
const express = require('express');
const app = express();
const pug = require('pug');
const fs = require('fs')
const bodyParser = require('body-parser');
const pg = require('pg');
const nodemailer = require('nodemailer');
const xoauth2 = require('xoauth2');


//set view engine and views
app.set('views', 'src/views');
app.set('view engine', 'pug');

app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static('./resources/'));





//display index page
app.get('/', function ( req, res ){
  console.log('Index is displayed on localhost');
    res.render('index');
});

app.post('/zorginstelling/ziekenhuis-olvg-locatie-west-voorheen-sint-lucas-andreas-ziekenhuis-amsterdam-109428/waardeer', function (req, res) {
  var mailOpts, smtpTrans;
  console.log('form word gepost')
  //Setup Nodemailer transport, I chose gmail. 
  smtpTrans = nodemailer.createTransport('SMTP', {
      service: 'Gmail',
      auth: {
        xoauth2: xoauth2.createXOAuth2Generator({
            user: 'kylevantil14@gmail.com',
            clientId: '-' ,
            clientSecret: '-' ,
            refreshToken: '-'
        })
       }
  });

   //Mail options
  mailOpts = {
      from: req.body.rating[name] + ' <' + req.body.rating[email][first] + '>', 
      to: 'kylevantil14@gmail.com',
      subject: 'Test',
      text: req.body.rating[comment] + req.body.rating[questions][behandeling] + req.body.rating[name]
  };

    smtpTrans.sendMail(mailOpts, function (error, response) {
      //Email not sent
      if (error) {
          console.log('There was a problem')
      }
      //Yay!! Email sent
      else {
          console.log('Email sent!')
      }
  });
});



var server = app.listen(4000, function () {
        console.log('Example app listening on port: ' + server.address().port);
    });
Kyle van Til
  • 285
  • 1
  • 3
  • 12

6 Answers6

24

The nodemailer has been reworked, so old code structure could throw such error. Try use the following structure:

var xoauth2 = require('xoauth2');


smtpTrans = nodemailer.createTransport({
  service: 'Gmail', 
  auth: {
    xoauth2: xoauth2.createXOAuth2Generator({
        user: 'kylevantil14@gmail.com',
        //and other stuff

Please, check official resource for more details:

https://community.nodemailer.com/2-0-0-beta/using-oauth2/

MartinsOnuoha
  • 514
  • 5
  • 9
  • Thanks, it solved one problem, but after I kept getting an issue saying my username and password were invalid. But now everything is working with less code. – Kyle van Til Feb 27 '17 at 10:38
  • That's because you need to lower gmail's security parameters, and allow "access for less secure apps" in client settings. Then your application will get access to your mailbox via smt protocol. May be there are another ways to solve this auth issues, but I didn't find them yet. – Alexander Rulezovsky Mar 06 '17 at 16:38
  • I know I already did that, but it seemed that my code was the problem I thought way to complex i guess. – Kyle van Til Mar 16 '17 at 13:12
  • 1
    i am getting same error, can you please help me to resolve it @KylevanTil – ankitkhandelwal185 Jun 29 '17 at 13:44
  • 1
    Can you please add the full code snippet? Also, where do you get the "other stuff"? Thank you. – user1063287 Aug 20 '18 at 11:15
7

The current problem Today for help is the change of information faster, and Alexander was good when he said "nodemailer is reworked";

i use this easy line to define the transporter:

    var smtpTransport = nodemailer.createTransport("smtps://youruser%40gmail.com:"+encodeURIComponent('yourpass#123') + "@smtp.gmail.com:465"); 

i got it from here https://community.nodemailer.com/

Richard Aguirre
  • 543
  • 6
  • 14
3

I had similar problem. 'nodemailer-smtp-transport' module solved it

var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var transport = nodemailer.createTransport(smtpTransport({
    service: 'Gmail',
    auth:{
        xoauth2: xoauth2.createXOAuth2Generator({
            user: 'abc@gmail.com',
   //and other stuff

install nodemailer-smtp-transport by 'npm install nodemailer-smtp-transport'

Saif
  • 41
  • 4
0

This is working for me-

sendEmail: function(account, params) {

    // create reusable transporter object using the default SMTP transport
    var smtpTransport = nodemailer.createTransport({
        service: 'Gmail', // sets automatically host, port and connection security settings
        auth: {
            user: account.user, 
            pass: account.password  
        }
    });

    var toEmail = params.to[0];
    for (var i = 1; i < params.to.length; i++) {
        toEmail += ', ' + params.to[i];
    }

    // setup email data with unicode symbols
    var mailOptions = {
        from: params.from, // sender address
        to: toEmail, // list of receivers
        subject: params.subject, // Subject line
        text: params.text, // plain text body
        html: params.html, // html body
        attachments: params.attachments
    };

    // send mail with defined transport object
    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(); // shut down the connection pool, no more messages.
    });
}

Do Note that you will have to turn on less secure apps from google. Visit https://myaccount.google.com/lesssecureapps . Once turned on, refresh the page just to make sure that it actually got turned on (I got it turned on in 4 attempts).

Varun Kumar
  • 2,543
  • 1
  • 23
  • 22
-1

Try below:

    smtpTrans = nodemailer.createTransport({
        service: 'Gmail', 
        auth: {
            type: 'OAuth2',
            user: 'kylevantil14@gmail.com',
            // and other stuff

See: https://nodemailer.com/smtp/oauth2/

gavriln
  • 19
  • 3
-1

This worked for me please try it

function sendEmailTechnician() {
    // Generate test SMTP service account from gmail
    nodemailer.createTestAccount((err, account) => {
        // create reusable transporter object using the default SMTP transport
        let transporter = nodemailer.createTransport({
            host: 'smtp.gmail.com',
            port: 587,
            secure: false, // true for 465, false for other ports
            auth: {
                user: '', // generated gmail user
                pass: '' // generated gmail account password
            }
        });

        // setup email data with unicode symbols
        let mailOptions = {
            from: 'text <user@gmail.com>', // sender address
            to: 'user@gmail.com', // list of receivers 
            subject: 'text', // Subject line
            text: 'text', // plain text body
            html: '<b>text</b>' // html body
        };

        // send mail with defined transport object
        transporter.sendMail(mailOptions, (error, info) => {
            if (error) {
                return console.log(error);
            }
            console.log('Message sent: %s', info.messageId);
            // Preview only available when sending through an Ethereal account
            console.log('Preview URL: %s', nodemailer.getTestMessageUrl(info));

            // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>
            // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
        });
    });
}
dee.ronin
  • 1,040
  • 12
  • 22