Получение писем из почтового ящика
В системе ELMA существует возможность работы с электронной почтой. Например, в данной статье рассмотрена отправка электронного сообщения.
В текущей статье рассмотрим пример получения электронной почты с помощью библиотеки Aspose.Email.
В примере будут созданы вложения с помощью создания файла из потока.
Для работы необходимо подключить сборки:
using System.IO; using Aspose.Email.Imap; using EleWise.ELMA.Files; using EleWise.ELMA.Logging; using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Runtime.Managers;
using EleWise.ELMA.Services; using Aspose.Email.Imap; using Aspose.Email.Pop3; using EleWise.ELMA.Files; using EleWise.ELMA.Logging; using EleWise.ELMA.Model.Common; using EleWise.ELMA.Model.Entities; using EleWise.ELMA.Model.Entities.ProcessContext; using EleWise.ELMA.Model.Managers; using EleWise.ELMA.Model.Services; using EleWise.ELMA.Model.Types.Settings; using EleWise.ELMA.Runtime.Managers; using EleWise.ELMA.Services;
В данном примере подключение происходит по протоколу IMAP. Для этого необходимо указать адрес сервера, почтовый ящик, пароль и порт для подключения. В примере эти данные хранятся в соответствующих контекстных переменных. После получения писем будет создан блок с:
- темой письма;
- отправителем письма;
- телом письма;
- вложениями письма.
Контекстные переменные с типом Строка: context.Server, context.Address, context.Password.
P_Process_Pisjma – это имя класса блока, который заполняется письмами.
Свойства блока:
- Sender – отправитель, тип Строка;
- Subject – тема сообщения, тип Строка;
- Body – текст письма, тип Текст;
- Vlozheniya – тип Вложение (Объект), связь Многие-ко-многим.
Имя класса P_Process_Pisjma взято для примера, имя класса блока строится из имени процесса и имени самого блока (P_Process - имя класса процесса, Pisjma - имя блока).
Функция CreateBinaryFile описана в статье "Создание файла из потока". Её нужно вставить в сценарии процесса отдельным методом (как показано в статье "Создание файла из потока").
//пробуем подключиться //создаем подключение к серверу 143 - это порт для подключения ImapClient client = new ImapClient(context.Server, 143, context.Address, context.Password); try { //выбираем нужную папку, папка по умолчанию "Входящие" выбирается следующим образом: client.SelectFolder(ImapFolderInfo.InBox); //если потребуется, например, выбрать папку ELMA, то //client.SelectFolder("ELMA"); //получаем список писем var mailList = client.ListMessages(); foreach (var mail in mailList) { //если письмо не прочитано if (!mail.IsRead) { //получаем номер письма var mailNum = mail.SequenceNumber; //загружаем письмо по номеру var message = client.FetchMessage(mailNum); //создаем запись блока на основе письма var newElement = InterfaceActivator.Create<P_Process_Pisjma>(); newElement.Sender = message.From.Address; newElement.Subject = message.Subject; newElement.Body = message.Body; //если есть вложения, добавляем и их if (message.Attachments.Any()) { for (int i = 0; i < message.Attachments.Count; i++) { string attName = message.Attachments[i].Name; //создаем вложение ELMA var newAtt = InterfaceActivator.Create<EleWise.ELMA.Common.Models.Attachment>(); //загружаем вложение по номеру письма и имени вложения var mailAtt = client.FetchAttachment(mailNum, attName); //создаем файл из потока newAtt.File = CreateBinaryFile(mailAtt.ContentStream, attName); //и заполняем стандартные свойства вложения newAtt.CreationAuthor = context.WorkflowInstance.Initiator; newAtt.CreationDate = DateTime.Now; newAtt.Save(); newElement.Vlozheniya.Add(newAtt); } } newElement.Save(); context.Pisjma.Add(newElement); } } //отключаемся от сервера client.Dispose(); } catch (Exception ex) { //client.Disconnect(); Logger.Log.Error(ex.Message); }
Подключение и дальнейшая работа по другим протоколам практически идентична описанному выше. Например, используя POP3:
Pop3Client client = new Pop3Client(context.Server, 143, context.Address, context.Password); try { var mailList = client.ListMessages(); foreach(var mail in mailList) { var mailNum = mail.SequenceNumber; var message = client.FetchMessage(mailNum); var newElement = InterfaceActivator.Create<P_PolucheniePochty_Pisjma>(); context.Pisjma.Add(newElement); newElement.Sender = message.Sender.Address; newElement.Subject = message.Subject; newElement.Body = message.Body; if(message.Attachments.Any()) { for (int i = 0; i < message.Attachments.Count; i++) { string attName = message.Attachments[i].Name; var newAtt = InterfaceActivator.Create<EleWise.ELMA.Common.Models.Attachment>(); newAtt.File = CreateBinaryFile(message.Attachments[i].ContentStream, attName); newAtt.CreationAuthor = context.WorkflowInstance.Initiator; newAtt.CreationDate = DateTime.Now; newAtt.Save(); newElement.Vlozheniya.Add(newAtt); } } } client.Disconnect(); } catch(Exception ex) { client.Disconnect(); Logger.Log.Error(ex.Message); }