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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 06.11.2012, 16:03   #1  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
DAX2009, чтение почты "в обход" Outlook
Добрый день, коллеги!

Подскажите, кто имеет опыт работы с приемом почты в DAX2009 - можно ли ее получать без установки Outlook? Т.е. какой-то сервис, где можно задать параметры (POP3-сервер, логин-пароль и т.д.), и чтобы получать сообщения согласно этим настройкам.

Из того что мне известно - функциональность класса Mapi, но он работает если есть Outlook. Без Outlook можно использовать SysMailer, где через SMTPRelayServer задаются параметры подключения - но он только на отправку.
Больше ничего найти не удалось.

Понятное дело, что Аксапта разрабатывалась не с целью стать почтовым клиентом Поэтому конечно если никак без Outlook почту не получить - будем его ставить. Но для начала хотелось бы убедиться что действительно других выходов нет.
Старый 06.11.2012, 16:18   #2  
RVS is offline
RVS
Сенбернар
Аватар для RVS
Злыдни
 
696 / 130 (6) +++++
Регистрация: 27.02.2003
Адрес: Королев МО
Чтение почты из MS Dax 2009

Поставьте Outlook. Я - поставил..
__________________
Best Regards,
Roman
Старый 06.11.2012, 16:31   #3  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Неплохо указать какой конкретно используется почтовый сервер
Старый 06.11.2012, 19:21   #4  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от FrolovAndy Посмотреть сообщение
Больше ничего найти не удалось.
Почтовых клиентов, как грязи: http://social.msdn.microsoft.com/sea...0imap%20client
Старый 07.11.2012, 12:32   #5  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
вот так извратиться можно:
Поднимаете где-то в сети внутренний smtp сервер (в винде есть)
На основном настраиваете на него релай для нужного ящика
Полученный набор eml-файлов либо парсите аксой с использованием rfc(номер не помню), либо берете бесплатную библиотеку и на ее основе пишите сервис читающий файлы и передающий данные в аксу.
Старый 07.11.2012, 12:44   #6  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Посмотрел по ссылке - получается что все равно что-то ставить придется. Не Outlook - так CDO (иначе MAPI.Session будет выдавать ошибку COM объекта), или еще какие-то внешние библиотеки подключать.
Т.е. в обычной Аксапте никаких средств нет? Из того что в References также ничего нельзя использовать?

Попробую наверно более конкретно пояснить что мне надо. Исходная инфа:
- pop3-сервер 'pop3.<домен>.ru'
- номер порта для него
- логин
- пароль

Согласно данным параметрам надо подключиться к почтовому ящику логина и прочесть входящую почту. Сразу скажу - в этом деле я ламер, т.к. всегда программировал в стандартном приложении Аксапты, а подобными "извращениями" заниматься не приходилось. Поэтому, если у кого есть варианты готового кода, был бы рад увидеть, потому что даже если известно что с помощью .NET это можно осуществить, то надо еще понять к чему там обращаться и какие методы юзать )
Старый 07.11.2012, 13:39   #7  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
Приём писем Exchange(POP3)-->DAX
или
http://sourceforge.net/projects/hpop/
За это сообщение автора поблагодарили: FrolovAndy (1).
Старый 09.11.2012, 13:46   #8  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Огромное спасибо за DLL, работает! Но... пока что только на клиенте.

Т.е. закинул dll-файл в windows\system32, написал джобик который читает почту с помощью GetMail - работает отлично! Но на AOS-е такое уже не прокатывает, причем ошибка вылетает на new DLL('srvutils.dll'). Пробовал чуть менять, подсовывая другую dll лежащую в той же system32, например new DLL('aepdu.dll') - проходит без ошибки. В чем причина? Может что-то не так делаю?
На всякий случай - клиент на XP, AOS - Server 2008
Старый 09.11.2012, 13:55   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от FrolovAndy Посмотреть сообщение
закинул dll-файл в windows\system32, написал джобик - работает отлично! Но на AOS-е такое уже не прокатывает, причем ошибка вылетает на new DLL('srvutils.dll'). AOS - Server 2008
Винды 32-х или 64-хбитные? А AOS? Вообще... не надо в 2009-й уже Win32 API использовать - есть же .NET См. также Using the DLLFunction kernel class on a 64bit Dynamics AX 2009 AOS
Старый 09.11.2012, 14:16   #10  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Да, похоже что на AOSе 64-битные windows. А на клиенте 32, потому и работает. Правда, в указанное статье написано что ошибка должна на call возникать, а у меня раньше, на new DLL(), причем получается избирательно, не работает только с этой dll, а с другими все в порядке (как они будут работать на call, проверить не могу, т.к. надо знать какие они функции поддерживают).

На клиенте запускать - не вариант, нужно именно на сервере. А как тогда можно с помощью .NET осуществить? Так понимаю что srvutils.dll тут уже бесполезна и нужно что-то принципиально другое? Жалко конечно, она-то как раз подошла бы...
Старый 09.11.2012, 14:46   #11  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
C Net сборкой еще проще, например по ссылке выше берете сборку OpenPop.Net
1. Засовываете ее в GAC на вашем сервере
2. Регистрируете сборку в Ax (AOT - References)
А дальше переписываете на X++ пример отсюда http://hpop.sourceforge.net/exampleFetchAllMessages.php
За это сообщение автора поблагодарили: FrolovAndy (1), Eloy (1).
Старый 09.11.2012, 16:29   #12  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Понял, только сразу вопрос:
Цитата:
Сообщение от handy-comp Посмотреть сообщение
1. Засовываете ее в GAC на вашем сервере
Как это лучше сделать? Попробовал через Администрирование -> Microsoft .NET Framework 2.0 Configuration, там Add an Assembly to the Assembly Cache, выбираю собственно OpenPop.dll (из архива, который скачал по ссылке), и система ругается что The assembly must have a strong name (name, version and public key).
Наверно опять я где-то накосячил? Или может дело в том что dll лежит в "левой" папке (в System32 не положил т.к. прав нет)?

Извиняюсь, ступил кажется - кажется надо было выбирать другую dll, из папки Signed strong name. Сейчас попробую

Последний раз редактировалось FrolovAndy; 09.11.2012 в 16:48. Причина: предположительно найдено решение
Старый 09.11.2012, 17:09   #13  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
Так, в общем в GAC успешно добавил, теперь следующая проблема - сделал Reference OpenPop, запустив клиента на AOSе. Reference создался, но теперь проблема другая - использование сборки компилируется только там, а если например уже на другой машине клиента запускаю, то например такая конструкция OpenPop.Pop3.Pop3Client - не компилится.
Я правильно понимаю, что надо openPop.dll тиражировать на все клиентские машины?
Старый 09.11.2012, 17:21   #14  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Я правильно понимаю, что надо openPop.dll тиражировать на все клиентские машины?
Не обязательно, если код будет работать на сервере, достаточно положить на сервер и на машине где разрабатывать будете.
Да, если сервер 64-bit, GACов 2шт, желательно везде разложить.
Старый 12.11.2012, 12:36   #15  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
О, ну отлично, всё работает, получил то что нужно было! Спасибо!

А вот про это:
Цитата:
Сообщение от handy-comp Посмотреть сообщение
Да, если сервер 64-bit, GACов 2шт, желательно везде разложить.
а как понять что GACа 2 шт.? Я вижу только один, в Windows\Assembly. Ну и самое главное что все и так работает. Наверно, могу не париться по этому поводу?
Старый 12.11.2012, 15:27   #16  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
О, а для работы на отправку почты в DAX2009 уже оказывается есть готовая .NET сборка, все реализуется с использованием System.Net.Mail.SmtpClient!

Все-таки интересно сделано, для отправки почты всё предусмотрено, а вот для получения приходится так или иначе поизвращаться
Старый 12.11.2012, 19:48   #17  
handy-comp is offline
handy-comp
Участник
 
96 / 78 (3) ++++
Регистрация: 27.09.2012
Цитата:
Ну и самое главное что все и так работает. Наверно, могу не париться по этому поводу?
Если код работает и на сервере и на клиенте то все сделано правильно.

Последний раз редактировалось handy-comp; 12.11.2012 в 19:53.
Старый 09.01.2013, 18:25   #18  
Eloy is offline
Eloy
Участник
 
10 / 17 (1) ++
Регистрация: 28.07.2010
Всем спасибо, очень полезная тема оказалась. Разобрался с OpenPop.Net, всё супер работает. Единственное пришлось вложения вытаскивать через рефлексию в AX 2009. Вот рабочий пример, может облегчит жинь кому-то:

X++:
    OpenPop.Pop3.Pop3Client             pop3Client;
    OpenPop.Mime.Message                message;
    OpenPop.Mime.Header.MessageHeader   messageHeader;
    OpenPop.Mime.Header.RfcMailAddress  rfcMailAddress;
    OpenPop.Mime.MessagePart            messagePart;

    System.Type                         type, typeE;
    System.Object                       aList, etr;
    System.Reflection.MethodInfo        methodGetEnumerator, methodMoveNext;
    System.Reflection.PropertyInfo      propertyCount, propertyCurrent;
    System.Object[]                     nil;
    System.IO.FileInfo                  fileInfo;
    FileName                            fileName;

    int                                 i, messageCount, attachmentCount;
    str                                 subject, messageBody, email;
    ;

    pop3Client = new OpenPop.Pop3.Pop3Client();

    try
    {
        // Connect to the server
        pop3Client.Connect(POPServerName, POPPort, false);

        // Authenticate ourselves towards the server
        pop3Client.Authenticate(POPUserName, POPPassword);

        // Get the number of messages in the inbox
        messageCount = pop3Client.GetMessageCount();

        info(strFmt("messageCount: %1", messageCount));

        // We want to download all messages
        for (i = 1; i <= messageCount; i++)
        {
            message = pop3Client.GetMessage(i);
            messageHeader = message.get_Headers();
            subject = messageHeader.get_Subject();
            info(strFmt("Subject: %1", subject));
            rfcMailAddress = messageHeader.get_From();
            email = rfcMailAddress.get_Address();
            info(strFmt("Sender e-mail: %1", email));
            messagePart = message.FindFirstPlainTextVersion();
            messageBody = messagePart.GetBodyAsText();
            info(strFmt("Body: %1", messageBody));

            aList = message.FindAllAttachments();

            type = aList.GetType();
            propertyCount = type.GetProperty("Count");

            nil = new System.Object[0]();

            attachmentCount = propertyCount.GetValue(aList, nil);

            info(strFmt("attachmentCount: %1", attachmentCount));

            methodGetEnumerator = type.GetMethod("GetEnumerator");
            etr = methodGetEnumerator.Invoke(aList, nil);

            typeE = etr.GetType();
            methodMoveNext = typeE.GetMethod("MoveNext");

            while(methodMoveNext.Invoke(etr, nil))
            {
                propertyCurrent = typeE.GetProperty("Current");
                messagePart = propertyCurrent.GetValue(etr, nil);
                fileName = messagePart.get_FileName();
                info(fileName);
                fileInfo = new System.IO.FileInfo(strFmt(@"C:\AxEx\%1", fileName));
                messagePart.Save(fileInfo);
            }

            //pop3Client.DeleteMessage(i);
        }
    }
    catch
    {
        error("Произошла ошибка при загрузке почты!");
    }

    pop3Client.Disconnect();
    pop3Client.Dispose();
    pop3Client = null;
За это сообщение автора поблагодарили: FrolovAndy (1), handy-comp (1).
Старый 19.02.2013, 11:15   #19  
FrolovAndy is offline
FrolovAndy
Участник
 
71 / 45 (2) +++
Регистрация: 13.09.2007
По поводу того как получить вложение - привожу свой код, посмотрите, я его давно уже закодил, сейчас честно говоря уже лень вникать и анализировать, поэтому привожу полностью. Может быть, там то же самое что и у вас, а может и как-то по-другому я сделал )

X++:
public void run()
{
    OpenPop.Pop3.Pop3Client             pop3Client;
    OpenPop.Mime.Message                message;
    OpenPop.Mime.MessagePart            messagePart;
    OpenPop.Mime.Header.MessageHeader   messageHeader;
    OpenPop.Mime.Header.RfcMailAddress  fromAddress;
    System.Net.Mail.SmtpClient          smtpClient;
    System.Net.Mail.MailMessage         mailMessage;
    System.Collections.ArrayList        arrayList;
    System.Collections.IEnumerator      enumerator;
    System.IO.FileInfo                  fileInfo;
    TS_ImportFolderEmailSettings        folderEmailSettings;
    Counter                             attachCount;
    Counter                             messageCount;
    Counter                             ix;
    FileName                            attachFileName;
    str                                 strFromAddress;
    str                                 subject;
    str 20                              subject20;
    str                                 body;
    int                                 posOfNO;
    str                                 fileExtension;
    str                                 fileName;
    boolean                             moveNext;
    GM_ExpImpParameters                 expImpParameters = GM_ExpImpParameters::find();
    ;
    new InterOpPermission(InteropKind::ClrInterop).assert();

    pop3Client = new OpenPop.Pop3.Pop3Client();
    pop3Client.Connect(expImpParameters.Pop3Server, expImpParameters.Pop3Port, false);
    pop3Client.Authenticate(expImpParameters.FromEmailAccount, expImpParameters.FromEmailPassword);

    messageCount = pop3Client.GetMessageCount();

    for (ix = 1; ix <= messageCount; ix ++)
    {
        message = pop3Client.GetMessage(ix);
        messageHeader = message.get_Headers();

        subject = messageHeader.get_Subject();

        posOfNO = strscan(subject, 'NO', 1, strlen(subject));
        if (posOfNO)
        {
            subject = strltrim(strrtrim(strdel(subject, posOfNO, strlen(subject) - posOfNO + 1)));

            // участок кода, чтобы не удалялась почта, являющаяся подтверждением экспорта
            subject20 = subject;
            select firstonly folderEmailSettings
                where folderEmailSettings.EmailSubject == subject20 &&
                      folderEmailSettings.ExportReply  == NoYes::Yes;
            if (folderEmailSettings.RecId)
            {
                continue;
            }
            // <--

            arrayList = message.FindAllTextVersions();
            enumerator = arrayList.GetEnumerator();
            moveNext = enumerator.MoveNext();
            if (moveNext)
            {
                messagePart = enumerator.get_Current();
                body = messagePart.GetBodyAsText();
                body = strltrim(strrtrim(body));

                arrayList = message.FindAllAttachments();
                attachCount = arrayList.get_Count();

                folderEmailSettings = TS_ImportFolderEmailSettings::find(subject, body);
                if (folderEmailSettings.ImpFileFolder)
                {
                    if (this.checkFolder(folderEmailSettings.ImpFileFolder))
                    {
                        if (attachCount == 1)
                        {
                            enumerator = arrayList.GetEnumerator();
                            moveNext = enumerator.MoveNext();
                            if (moveNext)
                            {
                                messagePart = enumerator.get_Current();
                                attachFileName = messagePart.get_FileName();
                                fileExtension = any2str(conpeek(fileNameSplit(attachFileName),3));
                                if (fileExtension == #txt)
                                {
                                    fileInfo = new System.IO.FileInfo(folderEmailSettings.ImpFileFolder +
                                                                      #FilePathDelimiter                +
                                                                      attachFileName);
                                    messagePart.Save(fileInfo);

                                    smtpClient = new System.Net.Mail.SmtpClient(expImpParameters.SmtpServer,
                                                                                expImpParameters.SmtpPort);

                                    fromAddress = messageHeader.get_From();
                                    strFromAddress = fromAddress.get_Address();

                                    mailMessage = new System.Net.Mail.MailMessage(expImpParameters.FromEmail,
                                                                                  strFromAddress);
                                    subject = messageHeader.get_Subject();
                                    mailMessage.set_Subject('RE:' + subject);

                                    smtpClient.Send(mailMessage);
                                }
                                else
                                {
                                    error(strfmt("Тип вложенного файла должен быть %1", #txt));
                                }
                            }
                            else
                            {
                                error("Ошибка вложения сообщения");
                            }
                        }
                        else
                        {
                            error("Неверное количество вложений в сообщении");
                        }
                    }
                }
                else
                {
                    error(strfmt("Не определены настройки импорта для %1 по коду %2", subject, body));
                }
            }
            else
            {
                info("У сообщения отсутствует текст");
            }
        }
        pop3Client.DeleteMessage(ix);
    }

    pop3Client.Disconnect();

    CodeAccessPermission::revertAssert();
}

Оффтоп: Eloy, если не секрет, скажите - ваш никнейм случайно не связан с музыкальной темой?

Последний раз редактировалось FrolovAndy; 19.02.2013 в 11:17.
За это сообщение автора поблагодарили: Ace of Database (3), Spiker (1), pedrozzz (2), handy-comp (1).
Теги
mail, outlook, pop3, получение, почта

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
кнопка "Выбрать отборочную накладную" при обработке накладной по закупке (DAX2009) Bega DAX: Функционал 0 27.07.2010 14:35
Отправка почты через Outlook... lev DAX: Программирование 9 12.12.2008 13:27
DAX2009. Модуль "Управление качеством". Проблема в архитектуре. slava09 DAX: Функционал 8 09.07.2008 16:20
CRM:отправка почты на Outlook fialka DAX: Функционал 2 17.06.2008 16:09
Право доступа к таблице "Только чтение" gudzon DAX: Программирование 1 24.08.2004 16:14

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 23:36.