27.08.2009, 11:40 | #1 |
int 20h
|
Чтение почты из MS Dax 2009
Добрый день всем.
Есть задача чтения почты из MS Exchange в 2009 аксапте и разобрка ее. Ну скажем заполнение таблички из письма. Кто нибудь сталкивался с подобным. Какие системные классы или WinApi функции можно использовать? Буду рад любым наводкам. Спасибо.
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
27.08.2009, 13:39 | #2 |
Участник
|
В модуле CRM есть синхронизация с Outlook. В принципе, можно попробовать через нее. Посмотрите, как реализована отправка писем в классе smmOutlookEmail.
__________________
Денис Балуев. |
|
27.08.2009, 13:52 | #3 |
int 20h
|
Спасибо но нет. Там синхронизация с клиентом. А мне надо напрямую вытаскивать с сервера Exchange
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
|
За это сообщение автора поблагодарили: (-1). |
27.08.2009, 14:17 | #4 |
Administrator
|
Тогда это не к Аксапте - это скорее действительно к WinAPI. Идеология MS состоит в том, что почтовый клиент (MS Outlook) уже стоит и есть программный интерфейс управления (MAPI) действиями этого клиента.
А тут, фактически, Вы хотите написать сами почтового клиента (хоть и простейшего). В Аксапте ничего такого Вы не найдете. Вам придется добавить (если уж Вы захотите решить задачу) N нужных (каких - нужно копать) для этого WinAPI-функций (данные которых надо будет еще аккуратно преобразовать к X++) и код взаимодействия между ними.
__________________
Возможно сделать все. Вопрос времени |
|
27.08.2009, 15:07 | #5 |
int 20h
|
Нашел ссылку Получение почты в Ах.
Попробую реализовать также как в описано в джобе.
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
27.08.2009, 16:22 | #6 |
Administrator
|
О... а я как-то пропустил сей джобик....
__________________
Возможно сделать все. Вопрос времени |
|
28.08.2009, 01:29 | #7 |
Гость
|
чтение почты... я поначалу подумал, что ты хочешь, чтобы аксапта тебе вслух зачитывала письма
|
|
28.08.2009, 10:52 | #8 |
int 20h
|
но не то ))
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
14.09.2009, 22:47 | #9 |
int 20h
|
Всем доброго времени суток.
В принципе разобрался как читать Exchange из аксы используя CDO Message. Вот только никак не могу понять как в CDO Message получить адрес отправителя и получателя. Копал в направлении использования X++: str From() { COMVariant fromAdr; ; fromAdr = message.sender(); // или вот этот // fromAdr = message.Recipients(); return fromAdr.bStr(); }
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
14.09.2009, 22:55 | #10 |
Боец
|
Цитата:
Сообщение от zZ_TOP_Zz
Всем доброго времени суток.
В принципе разобрался как читать Exchange из аксы используя CDO Message. Вот только никак не могу понять как в CDO Message получить адрес отправителя и получателя. Копал в направлении использования X++: str From() { COMVariant fromAdr; ; fromAdr = message.sender(); // или вот этот // fromAdr = message.Recipients(); return fromAdr.bStr(); } как получить адрес отправителя (SysOutlookApplication)? |
|
15.09.2009, 10:41 | #11 |
int 20h
|
Спасибо за ответ, но это малость не то.
Я не использую Outlook для чтения почты я читаю напрямую с Exchange аксаптой и записываю определенные поля в табличку. Тему письма получил, тело письма тоже, вложения также не вопрос, но вот как вытащить адреса отправителя и получателя никак не могу понять... Любые методы что я использую выдают ошибку типа: --------------------------- Microsoft Dynamics AX Debugger --------------------------- Ошибка времени выполнения: COMVariant Объект не имеет метода "Address". и т.д.
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
15.09.2009, 13:43 | #12 |
Участник
|
Судя по историям успешных внедрений некоторые используют Office SharePoint Server:
"By deploying and linking Exchange Server 2007 and Office SharePoint Server 2007 alongside Retail Chain Manager for Microsoft Dynamics AX, Expert Group can now quickly and reliably distribute consolidated business information to its entire franchise network" (http://www.microsoft.com/dynamics/en...yid=4000004840). Как я понял, в Майкрософте для версии Dax 2009 делают в ставку на интеграцию Microsoft Dynamics AX и Microsoft Office Communication Server 2007: "Benefits of combining Microsoft Dynamics AX and Microsoft Office Communication Server 2007 Fuels business productivity. Contact fellow employees, partners, and customers, quickly and easily, without leaving the context of the Microsoft Dynamics AX screen. If the person you're contacting is also using Microsoft unified communications, data about the conversation can be transmitted, creating a rich contextual user experience. Fits with your systems. Customers are able to maximize their investments in Microsoft technologies, and to make use of that investment inside their business management solutions. Familiar to your people. As with other Microsoft Office products, Office Communicator 2007 R2 is designed to be familiar and easy to use. The software-based unified communications approach puts the presence information right next to a person's name and displays their full name and availability. This uniform user experience lowers the learning curve and helps enhance productivity. Software requirements The following software is required to implement the Collaborative Contact Center solution: Microsoft Dynamics AX 2009 Microsoft Office Communications Server 2007 R2 Microsoft Office Communicator 2007 R2 (http://www.microsoft.com/dynamics/en...ct-center.aspx) Наверное, это более правильное решение: 1) В этой интеграции есть возможность учета, настройки, использования, контроля и т.д. почти всех каналов общения с контрагентами (голос, письма, чат, конференции). Этого функционала достаточно для обсуждения и решения совместных вопросов. 2) Затем при доступе контрагентов через свою роль и прав на корпоративный портал Dax 2009 предоставляется возможность реализовывать часть этих решений (например, через создание заказов на продажу, участие в опросах и анкетировании, получение отчетов и выписок). Мне этот подход предоставляется более продуктивным, чем просто импорт писем из Exchange Server. Ведь потом надо будет эти письма "разбирать" по темам-заголовкам, как-то анализировать содержание и т.д (то есть надстраивать функционал Аутлука). А вложенные документы (часто заявки на покупку, договора, подтверждение и т.п.) - горе! С этим хозяйством тоже надо будет что-то делать ("разбирать", сохранять, переносить инфу в саму Аксапту). То есть, вместо обработки вложенных документов кажется лучше использовать ЕР |
|
15.09.2009, 14:15 | #13 |
int 20h
|
Может оно так и надо по поводу Шарика и ЕР...но моя задача написать обработчик почты, который будет выполнятся в пакетном режиме и проверять определенный ящик на сервере Exchange (подключение и вытаскивание почты из оутлука не рассматривается), в который будут приходить определенно сформированным образом письма, их то и необходимо обработать и затащить в аксапту. Атач прикрепим при помощи Docu* к табличке регистраций почты. Саму табличку заполним разобрав письмо.
От Кому Тема Тело Вложение Время получения Далее на основе этой таблички будет происходить ряд действий в системе. Вопрос как получить адреса ОТ и КОМУ
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
15.09.2009, 16:33 | #14 |
Участник
|
Думаю что нашел то, что вам нужно.
Еще хочу сразу порекомендовать всем, кто хочет работать через COM или WinAPI из 4.0, 2009 с майкрософтовским софтом: НЕ НАДО Есть .NET - намного более интегрированное с АХ средство, лучше документированное и проще в обращении. Приведу кусок кода C#, который немного описывает нужную Вам структуру, а потом ссылку на источник, где достаточно подробно описано все. X++: Create an e-mail message and set the properties that describe the message.MessageType message = new MessageType(); message.Subject = "Daily Report"; message.Body = new BodyType(); message.Body.BodyType1 = BodyTypeType.Text; message.Body.Value = "(1) Handled customer issues, (2) Saved the world."; message.Sender = new SingleRecipientType(); message.Sender.Item = new EmailAddressType(); message.Sender.Item.EmailAddress = "user1@example.com"; message.ToRecipients = new EmailAddressType[1]; message.ToRecipients[0] = new EmailAddressType(); message.ToRecipients[0].EmailAddress = "user2@example.com"; message.Sensitivity = SensitivityChoicesType.Normal; Там по дереву уже копайте...
__________________
http://www.axdevposts.blogspot.com Пришел, уведел.... отойди, дай другому увидеть! Последний раз редактировалось plumbum; 15.09.2009 в 16:38. |
|
|
За это сообщение автора поблагодарили: blokva (1), zZ_TOP_Zz (1). |
15.09.2009, 17:47 | #15 |
Пенсионер
|
Нет аксы под рукой а может попробуйте:
X++: fromAdr = message.From(); toAddr = message.To() // и т.д.
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ Последний раз редактировалось blokva; 15.09.2009 в 17:50. |
|
16.09.2009, 10:19 | #16 |
int 20h
|
Цитата:
Хорошая попытка я пробовал она не работает Выдает ошибку Ошибка времени выполнения: COMVariant Объект не имеет метода "То". и т.д.
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
16.09.2009, 10:35 | #17 |
Пенсионер
|
Цитата:
Посмотрел тот мой джоб, таки message есть COM объект. X++: CDOMessages = f2.Messages(); # mmm = COM::createFromVariant(CDOMessages); # intparm = mmm.Count(); # s1 = intparm.int(); # col = new COMEnum2Variant(mmm); # info('Всего писем: ' + int2str(s1)); # mess = col.getFirst(); # for (i=1; i <= s1; i++) # { # mmm = COM::createFromVariant(mess); # ccc = mmm.Subject(); # info(ccc.bStr()); # mess = col.getNext(); # } X++: for (i=1; i <= s1; i++) # { # mmm = COM::createFromVariant(mess); # ccc = mmm.To(); # info(ccc.bStr()); ccc = mmm.From(); # info(ccc.bStr()); # mess = col.getNext(); # }
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ Последний раз редактировалось blokva; 16.09.2009 в 10:48. |
|
|
За это сообщение автора поблагодарили: zZ_TOP_Zz (1). |
16.09.2009, 13:13 | #18 |
Участник
|
Привет!
Сам недавно пытался решить такую задачу но из C# для CRM правда мне нехватило сил довести ее до конца... появились другие дела как обычено и пришлось сделать очень некрасиво - через outlook. Если вы разберетесь как помжно прочитать почту напряму через Exchange то Вам 5-ка! Вообще для это можно использовать несколько вариантов сеединений, я начал копать в сторону WebServices это для exchange 2007, для exchange 2003 использовался WebDav, по сути тоже самое. Мне кажется самый правильный способ это реализация библиотеки на C# или С++, а потом ее дергать из Аксапты. Посмотри ссылки http://www.codemeit.com/webservices/...responses.html http://blogs.visoftinc.com/?tag=/c%23 http://www.isrcomputing.com/index.ph...tent&Itemid=86 |
|
|
За это сообщение автора поблагодарили: zZ_TOP_Zz (1). |
16.09.2009, 14:39 | #19 |
int 20h
|
Всем спасибо огромное за помощь разобралися. Вопрос снимается.
blokva Вы правы. Так мы и поступили Кому интересно как это реализовать вот пример, на вход передаем COM объект message на выходе получаем строку адреса отправителя. Маленько геморно получилось, но работает Процедуру combyDisp взял тут X++: str SenderEMail(Com _message) { #define.PR_SENDER_EMAIL_ADDRESS(0x0C1F001F) #Define.CdoPR_SENDER_EMAIL_ADDRESS(0x39FE001E) #Define.CdoPR_EMAIL_ADDRESS(0x3003001E) #Define.CdoPR_ADDRTYPE(0x3002001E) COMVariant to; COM recipients; COM fields; COM obj; COM comAddressType; COM field; ComVariant fieldId, fieldName; ComVariant toField; ComVariant addressType; str strAddressType; str s; COM combydisp(COMVariant _var) { ; if (_var.variantType() != COMVariantType::VT_DISPATCH) throw Error(strfmt("bad variant type (%1)",_var.variantType())); if (!_var.iDispatch()) return null; return COM::createFromVariant(_var); } ; recipients = combydisp(_message.Sender()); fields = combydisp(recipients.Fields()); comAddressType = combydisp(fields.Item(#CdoPR_ADDRTYPE)); addressType = comAddressType.Value(); strAddressType = addressType.bStr(); switch(strAddressType) { case "SMTP" : obj = combydisp(fields.Item(#CdoPR_EMAIL_ADDRESS)); toField = obj.Value(); break; default: obj = combydisp(fields.Item(#CdoPR_SENDER_EMAIL_ADDRESS)); toField = obj.Value(); break; } s = toField.bStr(); return s; }
__________________
It's just my Unhopelessnessabilityerism Trying to debug my mind |
|
25.09.2009, 12:50 | #20 |
Участник
|
|
|
Теги |
ax2009, exchange, mail, winapi, почта |
|
|