AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen Alle Foren als gelesen markieren

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 05.03.2020, 17:58   #1  
mikki_messer ist offline
mikki_messer
Участник
 
91 / 20 (1) +++
Registriert seit: 20.04.2010
Ort: Ростов-на-Дону
Dynamics AX 2012: получить почту и распарсить
Добрый день. Столкнулся с задачей: надо из Ax 2012 R3 получать почту, парсить её, при получении сообщения с определённой темой менять статус документа, если письмо было с вложениями, сохранять их в специальную папку. В итоге, столкнулся с двумя проблемами.

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

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

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

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

Что-то я делаю не так, но что именно? Буду благодарен за советы.
Alt 05.03.2020, 19:54   #2  
DSPIC ist offline
DSPIC
Боец
 
1.077 / 1243 (44) ++++++++
Registriert seit: 11.04.2008
Обработка из DAX2009 писем в разных почтовых серверах по каким-то общим технологиям

Второй абзац, если с SysEmailReader не выйдет
This post has been rated by: mikki_messer (1).
Alt 06.03.2020, 18:03   #3  
mikki_messer ist offline
mikki_messer
Участник
 
91 / 20 (1) +++
Registriert seit: 20.04.2010
Ort: Ростов-на-Дону
Продолжение:

додумался, что перед тем, как перебирать содержимое 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());
Продолжаю изыскания.
This post has been rated by: sukhanchik (3).
Alt 11.03.2020, 14:14   #4  
mikki_messer ist offline
mikki_messer
Участник
 
91 / 20 (1) +++
Registriert seit: 20.04.2010
Ort: Ростов-на-Дону
Продолжение:

В общем, после двухдневных плясок с бубном вокруг 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');
Alt 11.03.2020, 18:00   #5  
mikki_messer ist offline
mikki_messer
Участник
 
91 / 20 (1) +++
Registriert seit: 20.04.2010
Ort: Ростов-на-Дону
И ещё:

насколько я понимаю, при работе через 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');
Stichworte
email, email кириллицей, вложения

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 09:08 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.