logo

Получение писем из почтового ящика

В системе 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:

Примечание
Приведенный ниже код актуален только для системы версии ниже 3.10.x
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);
      }