2011-01-21 2 views

ответ

5

Использование Namespace.CurrentUser: http://msdn.microsoft.com/en-us/library/bb220041(v=office.12).aspx

+1

Thats VBA, хотя и не C#. Я не могу найти, что в C# – electricsheep

+4

вы можете попробовать «myEmailAddress = this.ActiveExplorer(). Session.CurrentUser.EmailAddress; или попробовать другие решения здесь: http://social.msdn.microsoft.com/forums/en- US/vsto/thread/d2d9bf23-e27f-4f30-9199-42833d6919a4/ – acconrad

12

Испытано в VS 2010, .NET 4.0, Outlook 2010:

var emailAddress = this.Application.ActiveExplorer().Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress; 
+3

Почему бы не сократить его до var emailAddress = this.Application.Session.CurrentUser.AddressEntry.Address? Вам также необходимо проверить, что AddressEntry.GetExchangeUser действителен - для пользователя без Exchange в профиле GetExchangeUser вернет значение null. –

+1

@DmitryStreblechenko, я намеренно написал его в длинной форме, чтобы было очевидно, откуда оно взялось. В то же время я сознательно ответил на него минимальным количеством строк кода. Я оставляю это в OP, чтобы написать защитный код в контексте его/ее приложения. –

+0

Работал отлично;) –

0

Попробуйте outlookObject.ActiveExplorer().Session.CurrentUser.Address. Работал для меня на VS10, Outlook 2007, .NET 4.0

0

Любой проходя мимо, я бы настоятельно совет, используя Application.Session.CurrentUser.AddressEntry.Address вместо чего-либо с помощью Application.ActiveExplorer().Session, как ActiveExplorer() может возвращать NullReferenceException, например, при открытии электронной почты через Перспективы.

2

Если вы используете обычный сервер POP/IMAP, вы получаете адрес электронной почты: Application.Session.CurrentUser.AddressEntry.Address;

С Exchange Server вы получаете адрес электронной почты: Application.Session.CurrentUser.AddressEntry.GetExchangeUser(). PrimarySmtpAddress;

5

Зависит от определения «текущий адрес пользователя».

  1. Адрес основного счета в Outlook, может быть получен из Appication.Session.CurrentUser (возвращается Recipient объекта). Используйте Recipient.Address property. Однако обратите внимание, что для учетной записи Exchange (Recipient.AddressEntry.Type == "EX") вы получите адрес типа EX. Чтобы получить SMTP-адрес, используйте Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress. Будьте готовы обрабатывать ошибки/исключения в случае ошибок.

На расширенном уровне MAPI (C++ или Delphi), используйте IMAPISession::QueryIdentity (вы можете проверить его в OutlookSpy - нажмите кнопку IMAPISession, затем QueryIdentity). Затем вы можете прочитать свойство PR_ADDRTYPE («EX» и «SMTP») и PR_EMAIL_ADDRESS (когда PR_ADDRTYPE = «SMTP») или (в случае Exchange) PR_SMTP_ADDRESS (не гарантируется наличие) и PR_EMS_AB_PROXY_ADDRESSES (многозначное свойство будет Exchange-адресами, включая все адреса прокси (псевдоним)).

  1. В случае нескольких учетных записей в профиле электронное письмо может быть отправлено или получено через несколько учетных записей. В этом случае используйте MailItem.SendUsingAccount (возвращает Account объект, может быть пустым - в этом случае используйте Application.Session.CurentUser). Это действует как для полученных, отправленных, так и для писем (Application.ActiveInspector.CurrentItem или Application.ActiveExplorer.ActiveInlineResponse).

  2. Все учетные записи в данном профиле можно получить с помощью коллекции Namespace.Accounts(Application.Session.Accounts). Доступ к адресу учетной записи можно получить, используя Account.SmtpAddress. Обратите внимание, что объектная модель Outlook предоставляет только учетные записи почты. Некоторые учетные записи магазина (например, PST) не входят в коллекцию, поскольку у них нет встроенного идентификатора пользователя, даже если некоторые другие учетные записи (такие как POP3/SMTP) могут доставляться в этот магазин. Если вы хотите получить доступ ко всем учетным записям, вы можете использовать Redemption и его RDOSession.Коллекция учетных записей (RDOAccounts объект).

На расширенном уровне MAPI счета отображаются через интерфейс IOlkAccountManager. Вы можете играть с ним в OutlookSpy, если вы нажмете кнопку IOlkAccountManager.

  1. В случае делегирования хранилища Exchange владелец магазина не открывается через объектную модель Outlook. Вы можете использовать Extended MAPI (обратите внимание, что свойство PR_MAILBOX_OWNER_ENTRYID доступно только в интернет-магазине, оно недоступно в кэшированном хранилище). Вы можете проанализировать идентификатор записи в хранилище Exchange и извлечь из него адрес типа EX. Затем вы можете создать идентификатор объекта объекта GAL с адресом EX. Вы также можете получить доступ к владельцу магазина, используя Redemption и его объект RDOExchangeMailboxStore и его Owner.
+0

В случае, если в календаре создается запись, существует ли способ использовать OOM, чтобы узнать, какая учетная запись электронной почты будет связана с ней? То есть для сопоставления календаря с учетной записью, когда у нас есть несколько учетных записей в профиле. – Alex

+0

Не в этом убедиться, ознакомьтесь с назначением родительского свойства, отбросьте его до объекта Folder, прочитайте свойство Folder.Store. Прокрутите список Namespace.Accounts и сравните значение свойства Account.DeliveryStore.EntryID с идентификатором записи идентификатора родительского хранилища записи. –

+0

Спасибо! Тем временем я обнаружил, что только что созданный AppointmentItem уже содержит один Получатель в своей коллекции получателей, и у этого получателя есть письмо, которое мне нужно (чтобы организатор уже был инициализирован). Похож на более простой метод (для этой конкретной задачи). Или есть ли недостатки такого подхода? При условии, что соответствующие вопросы создаются моим собственным кодом, поэтому мне не нужно иметь дело с тем случаем, когда назначение уже существует, а список получателей может быть недействительным и на него нельзя положиться. – Alex

Смежные вопросы