2017-02-23 88 views
8

Próbuję wysłać dane z formularza utworzonego na moje konto Gmail, po kliknięciu przycisku sumbit zawsze pojawia się ten sam błąd. Znalazłem wiele problemów dotyczących nodemailer, ale żaden z nich nie wydaje się być ten sam problem, co ja doświadczam.Nodemailer za pomocą Gmaila, Nie można utworzyć właściwości "mailer" na ciąg "SMTP"

Oczywiście Podałem mój clientId, ale właśnie usunięty dla tego postu.

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) 

to moje 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: '[email protected]', 
      clientId: '-' , 
      clientSecret: '-' , 
      refreshToken: '-' 
     }) 
     } 
    }); 

    //Mail options 
    mailOpts = { 
     from: req.body.rating[name] + ' <' + req.body.rating[email][first] + '>', 
     to: '[email protected]', 
     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); 
    }); 

Odpowiedz

11

nodemailer został przerobiony, tak stary struktura kod może rzucić takiego błędu. Spróbuj użyć następującą strukturę:

smtpTrans = nodemailer.createTransport({ 
    service: 'Gmail', 
    auth: { 
    xoauth2: xoauth2.createXOAuth2Generator({ 
    user: '[email protected]', 
    //and other stuff 

Proszę sprawdzić oficjalną zasób więcej szczegółów: https://nodemailer.com/smtp/

+0

Dzięki, rozwiązałam jeden problem, ale po tym, jak ciągle otrzymywałem problem z informacją, że moja nazwa użytkownika i hasło są nieprawidłowe. Ale teraz wszystko działa za mniej kodu. –

+0

To dlatego, że musisz obniżyć parametry zabezpieczeń Gmaila i zezwolić na dostęp do mniej bezpiecznych aplikacji w ustawieniach klienta. Następnie aplikacja uzyska dostęp do skrzynki pocztowej za pośrednictwem protokołu smt. Być może są jeszcze inne sposoby na rozwiązanie problemów auth, ale jeszcze ich nie znalazłem. –

+0

Wiem, że już to zrobiłem, ale wydawało się, że mój kod jest problemem, który uważam za skomplikowany. –

2

miałem podobny problem. 'Nodemailer-SMTP-transportowa' moduł rozwiązany to

var nodemailer = require('nodemailer'); 
var smtpTransport = require('nodemailer-smtp-transport'); 
var transport = nodemailer.createTransport(smtpTransport({ 
    service: 'Gmail', 
    auth:{ 
     xoauth2: xoauth2.createXOAuth2Generator({ 
      user: '[email protected]', 
    //and other stuff 

zainstalować nodemailer SMTP-transport przez 'npm zainstalować nodemailer SMTP-TRANSPORT'

2

Obecny problem Dzisiaj pomoc polega na szybszej zmianie informacji, a Aleksander był dobry, gdy powiedział: "remayailer jest przerobiony";

Używam tego łatwy do zdefiniowania linii transporter:

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

mam go stąd https://community.nodemailer.com/

0

To działa dla mnie-

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

Należy pamiętać, że trzeba będzie włączyć mniej bezpieczne aplikacje z google. Odwiedź https://myaccount.google.com/lesssecureapps. Po włączeniu odśwież stronę, aby upewnić się, że została włączona (mam ją włączoną w 4 próbach).