Показать сообщение отдельно
Старый 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() ));
}