Ошибка [1.2.359] Работа с Node JS: nodemailer падает в init

  • Автор темы Автор темы Dmitron
  • Дата начала Дата начала

Dmitron

A-Parser Enterprise License
A-Parser Enterprise
Добрый день!
Пытаюсь сделать автоматические ответы на почту через парсер.

Нашел хороший модуль 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
Вот что получаю в логах при падении.

703853872a188cd1b1e4e1729cc168b0.png


Можете ли вы мне как то помочь решить данную проблему или 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;
    }
}
 
4E376AF0-EA1E-41A4-B681-DE42A9962BBD.jpeg

Вы лучшие ребята с отличным комбайнером.
Спасибо!
 
Последнее редактирование:
Вопрос такой, 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)
}
 
Назад
Верх