0

我有一个代码可以读取看不见的电子邮件并创建 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?

4

1 回答 1

0

你的观察是正确的。您必须定期轮询您的 IMAP(或 POP3)服务器以跟上传入的消息。根据您的要求,每隔几分钟安排一次就可以了。

连续轮询,或每隔一秒左右轮询,是非常粗鲁的。如果您尝试这样做,IMAP 服务器的操作员可能会阻止您的应用程序:在他们看来,这就像试图使服务器过载。

于 2019-10-31T08:58:56.793 回答