Получение писем из почтового ящика
В системе 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);
}