|
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.11.2008, 17:14 | #7 |
Участник
|
А без дополнительных DLL как получить?
Есть у кого-нибудь примерчик? |
|
18.11.2008, 18:09 | #8 |
Moderator
|
Использовать Microsoft CDO 1.21 Library. Это не дополнительная DLL, она идёт в стандартной поставке Office (или Outlook). Про CDO см. в начале этой ветки.
Можно вполне использовать CDO, если вас не ограничивает следующее: Цитата:
Сообщение от Gustav
Способ получения адреса отправителя, рассмотренный выше, может вызывать неудобство, связанное с тем, что Outlook запрашивает у пользователя разрешение на доступ к адресной информации. Особенно критично это может быть, например, при пакетной обработке, когда пользователя нет и соответственно он не может подтвердить "10-минутный доступ". Либо длительность сложной обработки может превышать лимит "10 минут".
|
|
Теги |
документация |
|
|