Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
exan
7 лет назад

Получение почты в 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 под свои нужды.

Спасибо за внимание
Подписывайтесь на мой блог, что бы не пропустить новые статьи.

31
0.063 GOLOS
На Golos с May 2017
Комментарии (1)
Сортировать по:
Сначала старые