|
05.03.2020, 17:58 | #1 |
Участник
|
Dynamics AX 2012: получить почту и распарсить
Добрый день. Столкнулся с задачей: надо из Ax 2012 R3 получать почту, парсить её, при получении сообщения с определённой темой менять статус документа, если письмо было с вложениями, сохранять их в специальную папку. В итоге, столкнулся с двумя проблемами.
1: Попробовал получать почту, используя решение решение с SysEmailReader - получаю sysEmailMessageReadList, и для каждого объекта sysEmailMessageRead могу получить тему и тело сообщения (см. ниже), но не могу понять, как получить вложения. Попробовал действовать через sysEmailMessageRead.parmContentList(), но получаю пустой SysEmailMessageReadContentList PHP код:
Пробовал перекодировать из UTF8, как в Преобразование строк UTF-8 в ANSI в DAX 2009 (без файловых операций), получаю ту же самую строку. Что-то я делаю не так, но что именно? Буду благодарен за советы. |
|
05.03.2020, 19:54 | #2 |
Боец
|
Обработка из DAX2009 писем в разных почтовых серверах по каким-то общим технологиям
Второй абзац, если с SysEmailReader не выйдет |
|
|
За это сообщение автора поблагодарили: mikki_messer (1). |
06.03.2020, 18:03 | #3 |
Участник
|
Продолжение:
додумался, что перед тем, как перебирать содержимое 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 |
Участник
|
Продолжение:
В общем, после двухдневных плясок с бубном вокруг 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 |
Участник
|
И ещё:
насколько я понимаю, при работе через 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 кириллицей, вложения |
|
|