Meteor + Imap
Meteor + Imap как получать письма.
Из личного опыта, чтобы получать по imap письма через фреймворк meteor, сделал следующее
1. Поставил npm ля метеора
2. Установил через npm два пакета imap и mailparser (именно по таким названиям)
3. Использовал вот этот код (чуть изменен, оригинал вот тут cnblogs.com/sskyy/p/3200086.html, обратите внимание на подключение пакетов, у меня чуть другие команды, из оригинала не заработало), плюс добавлена возможность записи в БД, т.к. по умолчанию в оригинале вылетали ошибки (Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.) из-за отсутствия callback функции bindEnvironment, тут это исправлено.
4. После получения НЕ прочитанного письма, оно помечается и становится прочитанным, второй раз в базу уже не попадает
5. Скрип должен лежать в папке server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
/*получение почты по imap*/ var Imap = Meteor.npmRequire('imap') var MailParser = Meteor.npmRequire("mailparser").MailParser var fs = Meteor.npmRequire("fs") var imap = new Imap({ user: 'xxx', password: 'xxx', host: 'xxx', port: 993, tls: true, tlsOptions: { rejectUnauthorized: false } }); function openInbox(cb) { imap.openBox('INBOX', false, cb); } imap.once('ready', Meteor.bindEnvironment(function() { openInbox(Meteor.bindEnvironment(function(err, box) { console.log("open") if (err) throw err; imap.search(['UNSEEN'], Meteor.bindEnvironment(function(err, results) { if (err) throw err; var f = imap.fetch(results, { bodies: '', markSeen: true }); f.on('message', Meteor.bindEnvironment(function(msg, seqno) { var mailparser = new MailParser({ showAttachmentLinks: false, streamAttachments: false }) msg.on('body', Meteor.bindEnvironment(function(stream, info) { stream.pipe( mailparser ); mailparser.on("end",Meteor.bindEnvironment(function( mail){ /*записываем письмо в базу*/ Imaps.insert({ from: mail.from, name: mail.from[0].name, subject: mail.subject, html: mail.html, status: 'open', created_at: mail.date, updated_at: new Date(), read: 0 }); /*тырим вложения >>>*/ mail.attachments.forEach(function(attachment){ fs.writeFile(attachment.fileName, attachment.content, (err) => { if (err) throw err; console.log(attachment.fileName + ' saved!'); }); }); /*fs.writeFile('meeeeeesaaaaag-' + seqno + '-body.html', mail.html, function (err) { if (err) throw err; console.log(seqno + 'saved!'); });*/ console.log(mail); })); })); msg.once('end', function() { console.log(seqno + 'Finished'); }); })); f.once('error', function(err) { console.log('Fetch error: ' + err); }); f.once('end', function() { console.log('Done fetching all messages!'); imap.end(); }); })); })); })); imap.once('error', function(err) { console.log(err); }); imap.once('end', function() { console.log('Connection ended'); }); //imap.connect(); /*проверяем почту раз в 5 минут*/ setInterval(function() { imap.connect()}, 3000000); |
Свежие комментарии