AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 05.03.2020, 17:58   #1  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Dynamics AX 2012: получить почту и распарсить
Добрый день. Столкнулся с задачей: надо из Ax 2012 R3 получать почту, парсить её, при получении сообщения с определённой темой менять статус документа, если письмо было с вложениями, сохранять их в специальную папку. В итоге, столкнулся с двумя проблемами.

1: Попробовал получать почту, используя решение решение с SysEmailReader - получаю sysEmailMessageReadList, и для каждого объекта sysEmailMessageRead могу получить тему и тело сообщения (см. ниже), но не могу понять, как получить вложения. Попробовал действовать через sysEmailMessageRead.parmContentList(), но получаю пустой SysEmailMessageReadContentList

PHP код:
contentList sysEmailMessageRead.parmContentList();
       
while (
contentList.moveNext())
{
//даже не заходит сюда

2. Если тема/тело письма написаны кириллицей, получаю "чудные" результаты вроде: =?UTF-8?B?T25lIG1vcmUgcG9wMy3RgtC10YHRgi3RiNC80LXRgdGC?=

Пробовал перекодировать из UTF8, как в Преобразование строк UTF-8 в ANSI в DAX 2009 (без файловых операций), получаю ту же самую строку.

Что-то я делаю не так, но что именно? Буду благодарен за советы.
Старый 05.03.2020, 19:54   #2  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
Обработка из DAX2009 писем в разных почтовых серверах по каким-то общим технологиям

Второй абзац, если с SysEmailReader не выйдет
За это сообщение автора поблагодарили: mikki_messer (1).
Старый 06.03.2020, 18:03   #3  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Продолжение:

додумался, что перед тем, как перебирать содержимое contentList нужно вызвать contentList.reset().

Кириллическая тема письма (sysEmailMessageRead.parmSubject() выводилась нечитаема, т.к. закодирована по стандарту RFC 2047, "на коленке" её получилось прочитать с помощью System.Net.Mail.Attachment, пример ниже:

X++:
System.Net.Mail.Attachment      attachment;
...
attachment = System.Net.Mail.Attachment::CreateAttachmentFromString("", emailSubject);
info(attachment.get_Name());
Продолжаю изыскания.
За это сообщение автора поблагодарили: sukhanchik (3).
Старый 11.03.2020, 14:14   #4  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
Продолжение:

В общем, после двухдневных плясок с бубном вокруг SysEmailReader, было принято решение использовать библиотеки MailKit и MimeKit (гитхаб). К Dynamics AX 2012 R3 она подключилась (компилировали под .NET 4.5), ниже код, чтобы получить все письма из ящика через POP3, получить тему сообщения и сохранить сообщения на диск в формате eml.

Может быть, кому-то пригодится

X++:
    str     currentUID;    
    MailKit.Net.Pop3.Pop3Client pop3Client;    
    MimeKit.MimeMessage message;
    MimeKit.FormatOptions frmt = new MimeKit.FormatOptions();
    System.Threading.CancellationTokenSource src = new System.Threading.CancellationTokenSource();
    System.Threading.CancellationToken      tkn = src.get_Token();
    Int     mailCnt, i;
    ;
    try
    {
        pop3Client = new MailKit.Net.Pop3.Pop3Client();
        pop3Client.Connect(serverURI, portNumber, useSSL, tkn);
        pop3Client.Authenticate(login, passwd, tkn);
                        
        mailCnt = pop3Client.get_Count();
        info(strFmt('Total messages: '+int2str(mailCnt)));
        for(i = 0; i< mailCnt; i++)
        {
            message = pop3Client.GetMessage(i, tkn, null);
            currentUID = pop3Client.GetMessageUid(i, tkn);
            info(message.get_Subject());
            
            message.WriteTo(frmt, strFmt("C:\\DAX\\Mail\\%1.eml", currentUID), tkn);
        }
        
        pop3Client.Disconnect(true, tkn);
    }
    catch
    {
        pop3Client.Disconnect(true, tkn);
        error("Error!");
    }
    info('Done');
Старый 11.03.2020, 18:00   #5  
mikki_messer is offline
mikki_messer
Участник
 
91 / 20 (1) +++
Регистрация: 20.04.2010
Адрес: Ростов-на-Дону
И ещё:

насколько я понимаю, при работе через POP3 нет возможности запросить только новые письма, каждый раз сервер выдаёт все письма, что есть в ящике.

Поэтому, если нужно сохранять письма на сервере, можно поступить примерно так: для каждого скачанного письма формировать хэш его уникального идентификатора и полей заголовка, и проверять, нет ли у нас в таблице обработанных писем такого хэша? Если нет, обрабатывать письмо, если есть переходить к следующему письму.

Почему хэш - потому что этот идентификатор уникален только в пределах набора писем, получаемого с сервера, и если какое-то письмо было удалено после обработки, идентификатор теоретически может быть выдан новому письму повторно.

Пример кода:

X++:
    str     currentUID, messageUID;
    MailKit.Net.Pop3.Pop3Client pop3Client;
    MimeKit.MimeMessage message;
    MimeKit.FormatOptions frmt = new MimeKit.FormatOptions();
    System.Threading.CancellationTokenSource src = new System.Threading.CancellationTokenSource();
    System.Threading.CancellationToken      tkn = src.get_Token();
    Int     mailCnt, i;

    System.Collections.IEnumerable  lst;
    System.Collections.IEnumerator  en;
    ;
    try
    {
        pop3Client = new MailKit.Net.Pop3.Pop3Client();
        pop3Client.Connect(serverURI, portNumber, useSSL, tkn);
        pop3Client.Authenticate(login, passwd, tkn);

        mailCnt = pop3Client.get_Count();

        info(strFmt('Total messages: '+int2str(mailCnt)));

        //получаем набор уникальных идентификаторов писем
        lst = pop3Client.GetMessageUids(tkn);
        en = lst.GetEnumerator();


        for(i = 0; i< mailCnt; i++)
        {
            en.MoveNext();
            //UID в списке идут в том же порядке, что и письма
            currentUID = en.get_Current(); 

            message = pop3Client.GetMessage(i, tkn, null);            

            //вот здесь генерируем хэш, проверяем, наличие хэша в таблице обработанных писем и, если надо, обрабатываем письмо.
        }

        pop3Client.Disconnect(true, tkn);
    }
    catch
    {
        if (pop3Client)
            pop3Client.Disconnect(true, tkn);
        
        error("Error!");
    }
    info('Done');
Теги
email, email кириллицей, вложения

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
emeadaxsupport: AX Performance - Analyzing key SQL Server configuration and database settings Blog bot DAX Blogs 0 28.09.2015 14:11
DAX: A Shift to Effective Demand Forecasting With Microsoft Dynamics AX 2012 R3 Blog bot DAX Blogs 0 16.11.2013 02:13
atinkerersnotebook: Walkthrough & Tutorial Summary Blog bot DAX Blogs 1 09.09.2013 09:11
emeadaxsupport: Translated User Help on TechNet and downloadable New Features lists available! Blog bot DAX Blogs 0 31.01.2013 05:11
DAX: Official Dynamics AX 2012 R2 Content (update) - Where is it, and how can you find out about updates? Blog bot DAX Blogs 0 03.12.2012 11:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:12.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.