Добрый день! Пытаюсь сделать автоматические ответы на почту через парсер. Нашел хороший модуль nodemailer написал код, который отлично работает, если запускать через консоль, например node app.js Но вот парсер никак не хочет обрабатывать код и постоянно падает. Сам код Код: const nodemailer = require('nodemailer'); class Parser { constructor() { this.defaultConf = { version: '0.1.17', results: { flat: [ ['title', 'HTML title'], ] }, results_format: '$query: $title\\n', parsecodes: { 200: 1, }, max_size: 200 * 1024, }; } async init(){ let transporter = nodemailer.createTransport({ host: 'smtp.yandex.ru', port: 587, secure: false, auth: { user: '[email protected]', pass: '12345' } }); let mailOptions = { from: '"Hello my friend!" <[email protected]>', to: '[email protected]', subject: 'Hello!', text: 'Hello world?', html: '<b>Hello world?</b>' }; transporter.sendMail(mailOptions); } async *parse(set, results) { return results; } } Само собой я поставил модули в директорию /aparser/files/node_modules Вот что получаю в логах при падении. Можете ли вы мне как то помочь решить данную проблему или a-parser не в силах работать стабильно с nodejs модулями?
В 1.2.359 появилась поддержка модулей работающих по https/tls: [1.2.359] Поддержка https/tls в Node.js модулях Также в этом релизе было исправлено падение при ошибках в инициализации парсера Ваш код немного некорректный, async функции необходимо использовать совместно с await, вот пример инициализации мейлера и отправки письма из init, а также из parse используя ранее созданный объект: Код: const nodemailer = require('nodemailer'); class Parser { constructor() { this.defaultConf = { version: '0.1.19', results: { flat: [ ['title', 'HTML title'], ] }, results_format: '$query: $title\\n', parsecodes: { 200: 1, }, max_size: 200 * 1024, from: '[email protected]', pass: 'pass', to: '[email protected]', }; } async init() { this.transporter = await nodemailer.createTransport({ host: 'smtp.yandex.ru', //port: 587, secure: false, ignoreTLS: true, port: 465, secure: true, auth: { user: this.conf.from, pass: this.conf.pass } }); let mailOptions = { from: `"Hello my friend!" <${this.conf.from}>`, to: this.conf.to, subject: 'Hello from init!', text: 'Hello world?', html: '<b>Hello world?</b>' }; await this.transporter.sendMail(mailOptions); //this.logger.put('Email sent from init()'); //no init logger yet } async *parse(set, results) { let mailOptions = { from: `"Hello my friend!" <${this.conf.from}>`, to: this.conf.to, subject: 'Hello from parse!', text: 'Hello world?', html: '<b>Hello world?</b>' }; await this.transporter.sendMail(mailOptions); this.logger.put('Email sent from parse()'); return results; } }
Вопрос такой, sendMail может отдавать колбэки error, info Делаем такой код Код: transporter.sendMail(mailOptions, (error, info) => { if (error) { this.logger.put(error.response); } this.logger.put('OK'); }); В итоге, если есть ошибка, то мы её и видим, а вот если нет - OK не показывается Почему не выводится ОК при удачной обработке?
не используйте коллбеки, парсер завершает работу раньше чем callback может выполнится. необходимо использовать await + try catch: Код: try { let info = await this.transporter.sendMail(mailOptions); this.logger.put('Email sent from parse(): ' + info.response); } catch(e) { this.logger.put('Sent error: ' + e) }