12.02.2008, 10:10 | #1 |
Axapta Retail User
|
Получение почты в Ах.
ПОявилась задача обработать в ахапке файл полученный по e-mail;
Вопрос как это можно сделать, т.е. прочитать почтовый ящик, проверить на вложения и т.д.? |
|
12.02.2008, 15:33 | #2 |
Участник
|
Чтение почты с Exchenge
static void Job100(Args _args)
{ #define.exchangeServer('test') // str имя сервера Exchange #define.exchangeUser('test') // имя пользователя #define.PR_ATTACH_DATA_BIN(0x37010102) COM session = new COM("MAPI.Session"); COM inbox; COM messageList, filter, message; COM attachList, attach; COM fieldList, field; COM obj; BinData bin = new BinData(); container c; int attachCnt, attachIdx; str 255 messageId; comvariant var; int cnt = 0; str vDate(COMVariant _var) { return substr(_var.toString(),1,19); } str vStr(COMVariant _var) { return _var.bStr(); } int vInt(COMVariant _var) { return _var.int(); } COMVariant empty() { return COMVariant::createNoValue(); } 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); } setprefix("Просмотр почтового ящика"); session.Logon( empty(), //[profileName] empty(), //[profilePassword] COMVariant::createFromBoolean(false), //[showDialog] COMVariant::createFromBoolean(true), //[newSession] COMVariant::createFromInt(-1), //[parentWindow] COMVariant::createFromBoolean(false), //[NoMail] COMVariant::createFromStr(strfmt("%1\n%2",#exchangeServer,#exchangeUser))); inbox = combydisp(session.Inbox()); messageList = combydisp(inbox.Messages()); filter = combydisp(messageList.Filter()); filter.Unread(true); message = combydisp(messageList.GetFirst()); while (message) { messageId = vStr(message.ID()); setprefix(strfmt("получено: %1 тема: %2",vDate(message.TimeReceived()),vStr(message.Subject()))); attachList = combydisp(message.Attachments()); attachCnt = vInt(attachList.Count()); for (attachIdx=1; attachIdx <= attachCnt; attachIdx++) { attach = combydisp(attachList.Item(attachIdx)); if (strscan(vStr(attach.Name()),".xml",1,255)) { fieldList = combydisp(attach.Fields()); obj = combydisp(fieldList.Item(#PR_ATTACH_DATA_BIN)); if (obj) { c = BinData::stringToData(vStr(obj.Value())); bin.setData(c); // здесь обработка письма или вложений } } } // attach message.Unread(false); // если всё нормально //потом message.Delete(true); message.Update(); cnt++; // не увлекайся if (cnt>100) break; message = combydisp(messageList.GetNext()); } session.Logoff(); } |
|
12.02.2008, 17:56 | #3 |
Axapta Retail User
|
разобрался сам
Спасибо за вариант, но разобрался сам.
X++: static void mail_Attachment(Args _args) { #SysOutlookCOMDEF SysOutlookApplication outlook = new SysOutlookApplication(); SysOutlook_Items collection; SysOutlook_NameSpace nameSpace; SysOutlookMapiFolder inboxFolder; SysOutlookMailItem mailItem; COM nextItem; SysOutlookAttachments atts; SysOutlookAttachment att; int a; ; namespace = outlook.getNameSpace('MAPI'); inboxFolder = namespace.getDefaultFolder(#OlDefaultFolders_olFolderInbox); collection = inboxFolder.items(); nextItem = collection.GetFirst(); while (nextItem) { mailItem = new SysOutlookMailItem(nextItem); atts = mailItem.Attachments(); a = atts.Count(); while (a) { att = atts.Item(comVariant::createFromInt(a)); info(strfmt("Тема '%1', файл '%2'",mailItem.Subject(),att.FileName())); att.SaveAsFile("c:\\" + att.FileName()); a--; } nextItem = collection.GetNext(); } } |
|
28.07.2008, 11:40 | #4 |
Участник
|
Пытались повторить вариант из второго поста, добавили лишь возможность обрабатывать письма из определенных папок, которые могут создаваться пользователем. При попытке запуска батча падает на mapiSession.GetFolder(""), MAPI_E_LOGON_FAILED(80040111).
|
|
28.07.2008, 12:04 | #5 |
Axapta Retail User
|
У меня вопрос, по теме как раз:
пытаюсь отправить почту так - SysEmailTable::sendMailSimple(_address,_subject,_body); _body - заполняю обычную строку данными и передаю как параметр. Проблема в том, что приходит письмо одной строкой, как сделать перевод строки?? '\n' не помогает
__________________
Романтик.. |
|
28.07.2008, 14:08 | #6 |
Пенсионер
|
__________________
Законы природы еще никто не отменял! А еще у меня растет 2 внучки!!! Кому интересно подробности тут: http://www.baby-shine.com/ |
|
16.09.2009, 11:09 | #7 |
Участник
|
Привет!
Сам недавно пытался решить такую задачу но из 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 |
|
19.11.2015, 13:56 | #8 |
Участник
|
Выдается ошибка:
COM-объект класса "MAPI.Session" не удалось создать. Убедитесь, что объект был должным образом зарегистрирован на компьютере "X0001148". Так понимаю не зарегистрирована DLL в ситсеме. ОС 64. Не могу найти под нее длл-ку. |
|
20.11.2015, 09:31 | #9 |
Участник
|
COM уже умер давно
не шевелите его |
|
20.11.2015, 09:35 | #10 |
Участник
|
Тогда вопрос, как можно напрямую к Exchange обратиться, минуя Outlook?
|
|
20.11.2015, 10:25 | #12 |
Участник
|
|
|
20.11.2015, 20:28 | #13 |
Участник
|
это .NET Framework классы
не помню точно, но вроде в AX4 уже был CLR Interop используйте его если код сильно сложный, и со всякими генериками, то проще будет внешнюю DLL сделать и её уже использовать в AX Последний раз редактировалось lvan; 20.11.2015 в 20:32. |
|