Получение почты в Node.js
Всем добра
Сегодня, я хочу Вам рассказать, как я делал загрузку прайсов с почты в автоматическом режиме. Статья обширная, работа над загрузчиком пока не окончена, поэтому информация будет предоставлена в нескольких статьях. Может кому то будет полезно. А может кто то может дать пару полезных советов - милости прошу в комментарии.
Итак, кратко о задаче - имеется приложение на Delphi 7 с привязкой к Firebird 2.5. Программе более 15 лет - сами представляете, через сколько рук она прошла. База так же прошла по рукам. Сами представляете - какой там кавардак. В данный момент имеется свое приложение по загрузке прайсов. Перво наперво - оно очищает таблицу прайсов, получает все непрочитанные письма и загружает с нужных адресов (по фильтру) письма с вложенными DBF файлами (часть в win-1251 кодировке, а часть в CP866). Как Вы могли понять - в базе всегда актуальная версия прайс листа. Шеф захотел хранить историю для аналитики цен.
Итак, шаг первый - сбор почты.
Меня не устраивало, что софт написан под windows да и еще на старой версии Delphi. Заморачиваться с изменением базы пока не стал - шеф хочет, что бы в момент выхода из его кабинета после совещания все уже было написано - "Это же не сложно - пару строчек?"@
Писать буду на Node.js в основном из-за кроссплатформенности.
Я перебрал несколько вариантов пакетов и подобрал для себя наиболее подходящий вариант mail-listener2 https://github.com/chirag04/mail-listener2
Этот пакет наиболее подходит, но не удовлетворяет всем условиям - поэтому я его форкнул. О изменениях расскажу чуть позже
Для начала установим mail-listener2 себе в проект
npm install mail-listener2 --save
Далее в файле сервера необходимо подключить mail-listener2 к нашему проекту
var MailListener = require("mail-listener2");
У себя же я создал папку lib и в нее положил исходники, поэтому подключаю так:
var MailListener = require("./lib/mail-listener2");
Далее необходимо создать экземпляр mail-listener:
var mailListener = new MailListener({
username: "imap-username",
password: "imap-password",
host: "imap-host",
port: 993,
tls: true,
connTimeout: 10000,
authTimeout: 5000,
debug: console.log,
tlsOptions: { rejectUnauthorized: false },
mailbox: "INBOX",
searchFilter: ["UNSEEN", "FLAGGED"],
markSeen: true,
fetchUnreadOnStart: true,
mailParserOptions: {streamAttachments: true},
attachments: true,
attachmentOptions: { directory: "attachments/" }
});
Детальной информации о конфиге я не нашел, поэтому пришлось действовать методом проб и ошибок. Опишу некоторые из них. С параметрами username, password, host, port, tls, connTimeout, authTimeout я думаю и так все понятно.
tlsOptions
- соответственно настройки tsl - список всех настроек с описанием на английском языке можно посмотреть тут -
https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener
mailbox: "INBOX"
- Место в ящике, где будем искать письма.
searchFilter: ["UNSEEN", "FLAGGED"]
- Фильтрация сообщений - можно указать "ALL", что бы получить все письма. Так же можно указать дату. Например так searchFilter: ["UNSEEN", ['SINCE', new Date().toString()]]
говорит о том, что я хочу получить все не прочитанные письма за сегодня.
markSeen: true
- этот параметр указывает на то, что бы помечать полученные письма как прочтенные.
fetchUnreadOnStart: true,
- Этот параметр говорит о том, что при запуске скрипта произойдет авто получение всех непрочитанных писем. По умолчанию - false.
mailParserOptions: {streamAttachments: true}
mail-listener2 основан на другом пакете - mailparser - это параметры, передаваемые для работы с mailparser - подробнее можно узнать в доке. Скажу лишь, у себя в проекте я использую {streamAttachments: false}.
attachments: true,
- указываем, что нужно сохранять вложения
attachmentOptions: { directory: "attachments/" }
- настройки для сохранения вложений - тут мы указываем директорию для сохранения
Для активации приложения используем mailListener.start();
С настройками и запуском более или менее разобрались, приступим к событиям.
Пример обработчика событий:
mailListener.on("server:connected", function(){
console.log("imapConnected");
});
Событие "server:connected" происходит, когда mail-listener2 подключился к почтовому серверу
Событие "server:disconnected" происходит, когда mail-listener2 отключился от почтового сервера
Событие "error" происходит, при какой либо ошибке - код ошибки и ее описание находится в первом параметре callback функции - пример:
mailListener.on("error", function(err){
console.log(err);
});
Событие "mail" происходит, когда получено новое письмо - пример обработчика:
mailListener.on("mail", function(mail, seqno, attributes){
// В объекте mail есть поле attachments с вложениями - можно настроить обработку тут
console.log("emailParsed", mail);
});
Событие "attachment" происходит, когда получено вложение - в callback функции приходит объект attachment со всей информацией о файле - пример:
mailListener.on("attachment", function(attachment){
console.log(attachment.path);
});
Итак, что мы имеем - приложение, следящее за почтовым ящиком и собирающее файлы из вложений. Для нашей задачи этого мало - поэтому в следующей статье я расскажу Вам как я модифицировал библиотеку mail-listener2 под свои нужды.
Спасибо за внимание
Подписывайтесь на мой блог, что бы не пропустить новые статьи.