How can I create a custom smtp server to send out notification emails in Nodejs?

淺唱寂寞╮ 提交于 2020-08-08 06:35:14

问题


My requirement is to send a notification email from my application to any email id , eg: a gmail address. I went through some modules like the smtp-server ,smtp-connection and emailjs

This is what I have got till now.

var SMTPServer = require('smtp-server').SMTPServer

var server = new SMTPServer({
  name: 'testDomain.com',
  authOptional: true,
  onAuth: function (auth, session, callback) {
    callback(null, {user: 'sample-user'}) 
  }
})
server.on('error', function (err) {
  console.log('Error %s', err.message)
})

var port = 1234

server.listen(port, function () {
  console.log('SERVER: Listening on port: ' + port)
  var opts = {
    host: '127.0.0.1',
    port: port,
    username: 'testUser',
    password: 'testUser123',
    to: 'someUser@gmail.com'
  }
  sendEmail(opts,function (err, message) {
    server.close()
  })
})

where sendEmail is a function using emailjs.

 function sendEmail(opts,callback) {
  var server = email.server.connect({
    user: opts.username || '',
    password: opts.password || '',
    host: opts.host,
    ssl: false
  })

  server.send({
    text: 'i hope this works',
    from: 'you <'+opts.username+'@testDomain.com>',
    to: ' <'+opts.to+'>',
    subject: 'testing emailjs'
  }, function (err, message) {
     console.log(err || message);
     callback(err, message)
    })
}

But it seems that the client is not able to connect to the server. It is hanging.

I tried smtp-connection like this initially:

var connection = new SMTPConnection({
    port: port,
    host: '127.0.0.1',
    ignoreTLS: true
  })

  connection.connect(function () {
    var envelope = {
       from: opts.username+'@testDomain.com',
       to: opts.to
    }
    var message = "Hello!!!"
    connection.send(envelope, message, function(err,message){
      callback(err,message)
      connection.quit()

    })

This seems to work but gives this output

response: '250 OK: message queued'

the smtp-connection documentation says it only queues the messages doesnt deliver it to the recipient.

How can I achieve my requirement? I am attempting to send the notification from a custom mail server because I want to avoid adding the user credentials of an email account in the code in plaintext. I am looking for a simple mailserver which can be spun up when the notification needs to be sent and then shut down.

Am I completely offtrack, not understanding how mail servers work?? Please give some feedback and a best approach to solve this.


回答1:


Just my opinion but I think its better to take a separate mail server. like the example from nodemailer:

var nodemailer = require('nodemailer');

// create reusable transporter object using the default SMTP transport
var transporter = nodemailer.createTransport('smtps://user%40gmail.com:pass@smtp.gmail.com');

// setup e-mail data with unicode symbols
var mailOptions = {
    from: '"Fred Foo ?" <foo@blurdybloop.com>', // sender address
    to: 'bar@blurdybloop.com, baz@blurdybloop.com', // list of receivers
    subject: 'Hello ✔', // Subject line
    text: 'Hello world ?', // plaintext body
    html: '<b>Hello world ?</b>' // 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);
});

For the security:

  • You can use separate file for storing the username / password.

  • Use can use a Token based authentication. So you don't need to save the password. An example of this is OAuth. Instead of the password you authenticate with a token. This token u get from the mailserver provider (like gmail). An example use of oauth and nodemailer you can find here.



来源:https://stackoverflow.com/questions/40004022/how-can-i-create-a-custom-smtp-server-to-send-out-notification-emails-in-nodejs

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!