Проверьте почтовый ящик в цикле, прочитайте электронную почту и создайте PDF - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть код, который читает невидимые электронные письма и создает pdf.

Проблема в том, что;

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

var Imap = require('imap');
const MailParser = require('mailparser').MailParser;
var pdf = require('html-pdf');
var fs = require('fs');
var Promise = require("bluebird");
Promise.longStackTraces();

var imapConfig = {
    user: '*****',
    password: '*****',
    host: 'imap.gmail.com',
    port: 993,
    tls: true
};

var imap = new Imap(imapConfig);
Promise.promisifyAll(imap);

imap.once("ready", execute);
imap.once("error", function(err) {
    log.error("Connection error: " + err.stack);
});

imap.connect();

function execute() {
    imap.openBox("INBOX", false, function(err, mailBox) {
        if (err) {
            console.error(err);
            return;
        }
        imap.search(["UNSEEN"], function(err, results) {
            if(!results || !results.length){console.log("No unread mails");imap.end();return;}

            var f = imap.fetch(results, { bodies: "" });
            f.on("message", processMessage);
            f.once("error", function(err) {
                return Promise.reject(err);
            });
            f.once("end", function() {
                console.log("Done fetching all unseen messages.");
                imap.end();
            });
        });
    });
}
const options = { format: 'A2', width:"19in", height:"17in", orientation: "portrait" };

function processMessage(msg, seqno) {
    console.log("Processing msg #" + seqno);
    // console.log(msg);

    var parser = new MailParser();
    parser.on("headers", function(headers) {
        console.log("Header: " + JSON.stringify(headers));
    });

    parser.on('data', data => {
        if (data.type === 'text') {
            console.log(seqno);
            console.log(data.html);  /* data.html*/
            var test = data.html
            pdf.create(test, options).toStream(function(err, stream){
                stream.pipe(fs.createWriteStream('./foo.pdf'));
            });
        }
     });

    msg.on("body", function(stream) {
        stream.on("data", function(chunk) {
            parser.write(chunk.toString("utf8"));
        });
    });
    msg.once("end", function() {
        // console.log("Finished msg #" + seqno);
        parser.end();
    });
}

Также я пытался использовать setInterval для проверки новых невидимых электронных писем, но получаю

'Ошибка: не аутентифицирована'

Как я могу вытащить новые невидимые электронные письма в цикле и создать pdf из этого электронного письма?

1 Ответ

0 голосов
/ 31 октября 2019

Ваше наблюдение верно. Вы должны опрашивать ваш сервер IMAP (или POP3) на регулярной основе, чтобы не отставать от входящих сообщений. В зависимости от ваших требований, расписание раз в несколько минут является хорошим.

непрерывный опрос или опрос каждую секунду или около того, очень грубо. Оператор сервера IMAP может заблокировать ваше приложение, если вы попытаетесь это сделать: это выглядит как попытка перегрузить сервер.

...