使用 gmail 的 Nodemailer,无法在字符串 'SMTP' 上创建 属性 'mailer'

Nodemailer using gmail, Cannot create property 'mailer' on string 'SMTP'

我试图将数据从我创建的表单发送到我的 gmail 帐户,当我点击 sumbit 按钮时,我总是得到同样的错误。 我发现了很多关于 nodemailer 的问题,但其中 none 似乎与我遇到的问题相同。

当然,我已经说明了我的 clientId,但只是为此删除了 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)

这是我的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);
    });

nodemailer 已经重新设计,所以旧的代码结构可能会抛出这样的错误。 尝试使用以下结构:

var xoauth2 = require('xoauth2');


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

请查看官方资源了解更多详情:

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

我有类似的问题。 'nodemailer-smtp-transport' 模块解决了它

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

通过 'npm install nodemailer-smtp-transport'

安装 nodemailer-smtp-transport

试试下面的方法:

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

参见:https://nodemailer.com/smtp/oauth2/

目前的问题 今天求助,就是资料改得快了,大哥说的不错 "nodemailer is reworked";

我用这条简单的线来定义运输车:

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

我从这里得到的https://community.nodemailer.com/

这对我有用-

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

请注意,您必须从 google 中打开安全性较低的应用程序。访问 https://myaccount.google.com/lesssecureapps 。打开后,刷新页面以确保它确实打开了(我尝试打开了 4 次)。

这对我有用,请尝试一下

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