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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.06.2008, 14:03   #1  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
как получить адрес отправителя (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  
DSPIC is offline
DSPIC
Боец
 
1,077 / 1234 (44) ++++++++
Регистрация: 11.04.2008
http://www.outlookcode.com/d/code/getsenderaddy.htm

MSDN в помощь
За это сообщение автора поблагодарили: Gustav (5).
Старый 11.06.2008, 17:28   #3  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Чем не очень удобен 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  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
Спасибо конечно за пример на 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  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от if_maks Посмотреть сообщение
Говорит что нет метода objCDOMsg.sender()
Замените фрагмент
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  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
Gustav, спасибо!
Старый 18.06.2008, 14:22   #7  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Способ получения адреса отправителя, рассмотренный выше, может вызывать неудобство, связанное с тем, что 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  
if_maks is offline
if_maks
Участник
 
226 / 15 (1) ++
Регистрация: 26.08.2003
Спасибо еще раз 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  
Dronas is offline
Dronas
Участник
 
213 / 14 (1) ++
Регистрация: 16.11.2004
А без дополнительных DLL как получить?
Есть у кого-нибудь примерчик?
Старый 18.11.2008, 18:09   #10  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Dronas Посмотреть сообщение
А без дополнительных DLL как получить?
Использовать Microsoft CDO 1.21 Library. Это не дополнительная DLL, она идёт в стандартной поставке Office (или Outlook). Про CDO см. в начале этой ветки.

Можно вполне использовать CDO, если вас не ограничивает следующее:
Цитата:
Сообщение от Gustav Посмотреть сообщение
Способ получения адреса отправителя, рассмотренный выше, может вызывать неудобство, связанное с тем, что Outlook запрашивает у пользователя разрешение на доступ к адресной информации. Особенно критично это может быть, например, при пакетной обработке, когда пользователя нет и соответственно он не может подтвердить "10-минутный доступ". Либо длительность сложной обработки может превышать лимит "10 минут".
Теги
документация

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Как получить указатель на отчёт когда пользователь выбрал Печать на принтер в просмотрщике, в форму SysPrintForm? rkorchagin DAX: Программирование 10 17.04.2008 11:59
Юридический и фактический адрес в счете на оплату madproger DAX: Программирование 2 26.01.2007 12:55
Адрес клиента Pegiy DAX: Функционал 4 29.07.2004 11:19
Можно ли в одном select`e получить maxof и minof по одному полю? ArturK DAX: Программирование 2 28.04.2004 12:28
Получить значение поля таблицы по номеру (Id) поля Anais DAX: Программирование 2 15.04.2004 13:00
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 03:26.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.