2016-10-12 5 views
0

Мое требование - отправить электронное письмо с уведомлением из моего приложения на любой идентификатор электронной почты, например: адрес gmail. Я прошел через некоторые модули, такие как smtp-server, smtp-connection и emailjsКак создать собственный smtp-сервер для отправки уведомлений по электронной почте в Nodejs?

Это то, что у меня есть до сих пор.

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: '[email protected]' 
    } 
    sendEmail(opts,function (err, message) { 
    server.close() 
    }) 
}) 

где sendEmail - это функция, использующая 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) 
    }) 
} 

Но, похоже, клиент не может подключиться к серверу. Он висит.

Я попытался SMTP-подключение, как это первоначально:

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() 

    }) 

Это похоже на работу, но дает этот выход

response: '250 OK: message queued' 

документация SMTP-соединение говорит, что это только очереди сообщения не делает доставить его получатель.

Как я могу достичь своего требования? Я пытаюсь отправить уведомление с настраиваемого почтового сервера, потому что я хочу избежать добавления учетных данных пользователя учетной записи электронной почты в код в виде открытого текста. Я ищу простой почтовый сервер, который можно развернуть, когда уведомление нужно отправить, а затем закрыть.

Я полностью отключаю, не понимая, как работают почтовые серверы? Пожалуйста, дайте некоторые отзывы и лучший подход для решения этой проблемы.

ответ

0

Просто мое мнение, но я думаю, что лучше взять отдельный почтовый сервер. как пример из nodemailer:

var nodemailer = require('nodemailer'); 

// create reusable transporter object using the default SMTP transport 
var transporter = nodemailer.createTransport('smtps://user%40gmail.com:[email protected]'); 

// setup e-mail data with unicode symbols 
var mailOptions = { 
    from: '"Fred Foo ?" <[email protected]>', // sender address 
    to: '[email protected], [email protected]', // 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); 
}); 

Для безопасности:

  • Вы можете использовать отдельный файл для хранения имени пользователя/пароля.

  • Использование может использовать аутентификацию на основе токена. Поэтому вам не нужно сохранять пароль. Примером этого является OAuth. Вместо пароля, который вы аутентифицируете с помощью токена. Этот токен вы получаете от поставщика почтового сервера (например, gmail). Пример использования oauth и nodemailer вы можете найти here.