logo

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

В системе ELMA существует возможность работы с электронной почтой. Например, в данной статье рассмотрена отправка электронного сообщения.

В текущей статье рассмотрим пример получения электронной почты с помощью библиотеки Aspose.Email.

В примере будут созданы вложения с помощью создания файла из потока.

Для работы необходимо подключить сборки:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 описана в статье "Создание файла из потока". Её нужно вставить в сценарии процесса отдельным методом (как показано в статье "Создание файла из потока").

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//пробуем подключиться
//создаем подключение к серверу 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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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);
      }