11.06.2008, 14:03 | #1 |
Участник
|
как получить адрес отправителя (SysOutlookApplication)?
Здрасте!
Подскажите как можно получить адрес отправителя пиьма? Имя можно вытащить через метод SysOutlookMailItem.SenderName(). Спасибо. X++: static void getMail_FromOutlook_(Args _args) { #SysOutlookCOMDEF SysOutlookApplication outlook = new SysOutlookApplication(); SysOutlookRecipients recipients; SysOutlookRecipient recipientsItem; SysOutlookFormDescription formDescription; SysOutlook_Items collection; SysOutlook_NameSpace nameSpace; SysOutlookMapiFolder inboxFolder; SysOutlookMailItem mailItem; COM nextItem; ; namespace = outlook.getNameSpace('MAPI'); inboxFolder = namespace.getDefaultFolder(#OlDefaultFolders_olFolderInbox); collection = inboxFolder.items(); nextItem = collection.GetFirst(); while (nextItem) { mailItem = new SysOutlookMailItem(nextItem); recipients = mailItem.Recipients(); recipientsItem = recipients.Item(COMVariant::createFromInt(1)); info("От: " + mailItem.SenderName()); info("Кому: " + recipientsItem.Address()); info("Тема: " + mailItem.Subject()); // info(mailItem.HTMLBody()); info("===================="); nextItem = collection.GetNext(); } } |
|
11.06.2008, 16:06 | #2 |
Боец
|
|
|
|
За это сообщение автора поблагодарили: Gustav (5). |
11.06.2008, 17:28 | #3 |
Moderator
|
Чем не очень удобен Outlook в плане программирования, так это тем, что пустяшную тестовую задачку там запустишь не сразу. Пока разберешься со всеми этими фолдерами, инспекторами и эксплорерами...
Приведенная по ссылке процедура заимствована из очень полезной книги Сью Мошер (есть русское издание: http://www.books.ru/shop/books/205770, которое я имел удовольствие почитывать). Я подправил процедуру так, чтобы ее можно было запускать в Outlook и смотреть на результаты (чтобы потом проще воплощалось в X++). Для запуска надо скопировать текст в модуль VBA (находясь в Outlook, нажать Alt+F11). Далее следует открыть любое письмо, затем перейти в редактор VBA и, стоя на тексте процедуры, нажать F5. Процедура последовательно вернет имя отправителя, тело письма и, наконец, желаемый адрес. Код: 'код - VBA для тестового запуска внутри Outlook Sub GetFromAddress() Dim myInspector As Inspector Dim myItem As MailItem Dim objSession As Object Dim strEntryID As String Dim strStoreID As String Dim objCDOMsg As Object Dim strAddress As String Set myItem = Application.ActiveInspector.CurrentItem ' start CDO session Set objSession = CreateObject("MAPI.Session") objSession.Logon "", "", False, False ' pass message to CDO strEntryID = myItem.EntryID strStoreID = myItem.Parent.StoreID Set objCDOMsg = objSession.GetMessage(strEntryID, strStoreID) ' get sender address On Error Resume Next strAddress = objCDOMsg.Sender.Address If Err = &H80070005 Then 'handle possible security patch error MsgBox "The Outlook E-mail and CDO Security Patches are " & _ "apparently installed on this machine. " & _ "You must response Yes to the prompt about " & _ "accessing e-mail addresses if you want to " & _ "get the From address.", vbExclamation, _ "GetFromAddress" End If MsgBox myItem.SenderName MsgBox myItem.Body MsgBox strAddress Set objCDOMsg = Nothing objSession.Logoff Set objSession = Nothing End Sub |
|
16.06.2008, 11:03 | #4 |
Участник
|
Спасибо конечно за пример на VBA но мне бы разобраться как это сделать на аксапте.
Пробую вот так. Говорит что нет метода objCDOMsg.sender() X++: static void maks_getMail_FromOutlook_(Args _args) { #SysOutlookCOMDEF SysOutlookApplication outlook = new SysOutlookApplication(); SysOutlookRecipients recipients; SysOutlookRecipient recipientsItem; SysOutlookFormDescription formDescription; SysOutlook_Items collection; SysOutlook_NameSpace nameSpace; SysOutlookMapiFolder inboxFolder; SysOutlookMailItem mailItem; COM nextItem; COM objSession; COM objCDOMsg; COM sender; ; namespace = outlook.getNameSpace('MAPI'); objSession = outlook.CreateObject("MAPI.Session"); objSession.logon("", "", false, false); inboxFolder = namespace.getDefaultFolder(#OlDefaultFolders_olFolderInbox); collection = inboxFolder.items(); nextItem = collection.GetFirst(); while (nextItem) { mailItem = new SysOutlookMailItem(nextItem); recipients = mailItem.Recipients(); recipientsItem = recipients.Item(COMVariant::createFromInt(1)); objCDOMsg = objSession.GetMessage(mailItem.EntryID());//, mailItem.Parent().StoreID()); sender = objCDOMsg.sender(); info(sender.address()); info("??: " + mailItem.SenderName()); info("????: " + recipientsItem.Address()); info("????: " + mailItem.Subject()); // info(mailItem.HTMLBody()); info("===================="); nextItem = collection.GetNext(); } } |
|
16.06.2008, 12:32 | #5 |
Moderator
|
Замените фрагмент
X++: objCDOMsg = objSession.GetMessage(mailItem.EntryID());//, mailItem.Parent().StoreID());
sender = objCDOMsg.sender();
info(sender.address()); X++: COMVariant address;
objCDOMsg = COM::createFromVariant( objSession.GetMessage(mailItem.EntryID()) );//, mailItem.Parent().StoreID());
sender = COM::createFromVariant( objCDOMsg.sender() );
address = sender.address();
info(address.bStr()); |
|
|
За это сообщение автора поблагодарили: if_maks (1). |
16.06.2008, 12:47 | #6 |
Участник
|
Gustav, спасибо!
|
|
18.06.2008, 14:22 | #7 |
Moderator
|
Способ получения адреса отправителя, рассмотренный выше, может вызывать неудобство, связанное с тем, что Outlook запрашивает у пользователя разрешение на доступ к адресной информации. Особенно критично это может быть, например, при пакетной обработке, когда пользователя нет и соответственно он не может подтвердить "10-минутный доступ". Либо длительность сложной обработки может превышать лимит "10 минут".
Один из способов избежать необходимости подтверждения доступа состоит в использовании библиотеки Redemption, которая доступна для скачивания здесь: http://www.dimastr.com/redemption/ Ниже привожу тестовый джоб по мотивам функции R_GetSenderAddress - третьей по счету на страничке уважаемой госпожи Мошер (см. по ссылке, любезно приведенной DSPIC ранее в этой ветке: http://www.outlookcode.com/d/code/getsenderaddy.htm ). Получившийся код оказался даже еще проще, чем оригинал, за счет того, что годы идут, Redemption развивается и в нем появляются новые полезные методы (полагаю, что в версии dll, имевшейся в распоряжении Сью на момент написания книги отсутствовал метод SMTPAddress и поэтому ей пришлось немножко сложно выкручиваться). X++: // для тестирования Outlook должен быть уже запущен заранее // и в нем открыто (двойным щелчком) произвольное письмо static void test_getMail_fromRedemption(Args _args) { COM outlook; // Outlook.Application COM activeInspector; // Outlook.Inspector COM objMsg; // Outlook.MailItem COM objSMail; // Redemption.SafeMailItem COM objSenderAE; // Redemption.AddressEntry ; outlook = COM::getObject('Outlook.Application'); activeInspector = outlook.ActiveInspector(); objMsg = activeInspector.CurrentItem(); objSMail = new COM('Redemption.SafeMailItem'); objSMail.Item( objMsg ); objSenderAE = objSMail.Sender(); if (objSenderAE) info( strfmt('Адрес отправителя: %1', objSenderAE.SMTPAddress() )); } |
|
19.06.2008, 11:45 | #8 |
Участник
|
Спасибо еще раз Gustav за полезную dll ку
вот так теперь читаем всю почту из outlook с помощью Redemption X++: static void maks_test_getMail_fromRedemption(Args _args) { #SysOutlookCOMDEF COM outlook; // Outlook.Application COM nameSpace; // Outlook.nameSpace COM inboxFolder; // Outlook.nameSpace.getDefaultFolder COM collection; // Outlook.nameSpace.getDefaultFolder.items COM nextItem; // Outlook.nameSpace.getDefaultFolder.items.item COM objMsg; // Outlook.MailItem COM objSMail; // Redemption.SafeMailItem COM objSenderAE; // Redemption.AddressEntry ; objSMail = new COM('Redemption.SafeMailItem'); outlook = COM::getObject('Outlook.Application'); nameSpace = outlook.getNameSpace("MAPI"); inboxFolder = nameSpace.getDefaultFolder(#OlDefaultFolders_olFolderInbox); collection = inboxFolder.items(); nextItem = collection.getFirst(); while (nextItem) { objSMail.Item( nextItem ); objSenderAE = objSMail.Sender(); if (objSenderAE) info( strfmt('Адрес отправителя: %1', objSenderAE.SMTPAddress() )); info("Тема : " + objSMail.Subject()); info("Тело письма: " + objSMail.HTMLBody()); nextItem = collection.getNext(); } } |
|
18.11.2008, 17:14 | #9 |
Участник
|
А без дополнительных DLL как получить?
Есть у кого-нибудь примерчик? |
|
18.11.2008, 18:09 | #10 |
Moderator
|
Использовать Microsoft CDO 1.21 Library. Это не дополнительная DLL, она идёт в стандартной поставке Office (или Outlook). Про CDO см. в начале этой ветки.
Можно вполне использовать CDO, если вас не ограничивает следующее: Цитата:
Сообщение от Gustav
Способ получения адреса отправителя, рассмотренный выше, может вызывать неудобство, связанное с тем, что Outlook запрашивает у пользователя разрешение на доступ к адресной информации. Особенно критично это может быть, например, при пакетной обработке, когда пользователя нет и соответственно он не может подтвердить "10-минутный доступ". Либо длительность сложной обработки может превышать лимит "10 минут".
|
|
Теги |
документация |
|
|