1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вступайте в наш Telegram чат: https://t.me/a_parser Нас уже 2600+ и мы растем!
    Скрыть объявление

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

Тема в разделе "1.2.360", создана пользователем Dmitron, 17 дек 2018.

  1. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    Добрый день!
    Пытаюсь сделать автоматические ответы на почту через парсер.

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

    [​IMG]

    Можете ли вы мне как то помочь решить данную проблему или a-parser не в силах работать стабильно с nodejs модулями?
     
  2. Forbidden

    Forbidden Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    9 мар 2013
    Сообщения:
    3.336
    Симпатии:
    1.791
    В 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;
        }
    }
    
     
    Dmitron нравится это.
  3. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    4E376AF0-EA1E-41A4-B681-DE42A9962BBD.jpeg

    Вы лучшие ребята с отличным комбайнером.
    Спасибо!
     
    #3 Dmitron, 25 дек 2018
    Последнее редактирование: 25 дек 2018
    Forbidden нравится это.
  4. Dmitron

    Dmitron A-Parser Enterprise License
    A-Parser Enterprise

    Регистрация:
    28 май 2017
    Сообщения:
    143
    Симпатии:
    7
    Вопрос такой, sendMail может отдавать колбэки error, info

    Делаем такой код

    Код:
            transporter.sendMail(mailOptions, (error, info) => {
                if (error) {
                    this.logger.put(error.response);
                }
                this.logger.put('OK');
            });
    В итоге, если есть ошибка, то мы её и видим, а вот если нет - OK не показывается
    Почему не выводится ОК при удачной обработке?
     
  5. Forbidden

    Forbidden Administrator
    Команда форума A-Parser Enterprise

    Регистрация:
    9 мар 2013
    Сообщения:
    3.336
    Симпатии:
    1.791
    не используйте коллбеки, парсер завершает работу раньше чем 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)
    }
    
     
    Dmitron нравится это.

Поделиться этой страницей