在 Outlook 2007 中获取当前用户的电子邮件地址
Posted
技术标签:
【中文标题】在 Outlook 2007 中获取当前用户的电子邮件地址【英文标题】:Get the email address of the current user in Outlook 2007 【发布时间】:2011-06-13 06:56:05 【问题描述】:我有一个用 C# 编写的 Outlook 插件。
我想知道如何或是否可以获取当前用户的电子邮件地址?
谢谢
【问题讨论】:
【参考方案1】:在 VS 2010、.NET 4.0、Outlook 2010 中测试:
var emailAddress = this.Application.ActiveExplorer().Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress;
【讨论】:
为什么不将其缩短为 var emailAddress = this.Application.Session.CurrentUser.AddressEntry.Address?您还需要检查 AddressEntry.GetExchangeUser 是否有效 - 对于配置文件中没有 Exchange 的用户,GetExchangeUser 将返回 null。 @DmitryStreblechenko,我特意把它写成长格式,以便清楚它的来源。同时,我特意用最少的代码行数来回答。我把它留给 OP 在他/她的应用程序的上下文中编写防御性代码。 我认为你没有抓住重点 -ActiveExplorer()
不是必需的,可以返回 null。摆脱它 - 使用this.Application.Session.CurrentUser.Address
【参考方案2】:
使用Namespace.CurrentUser
:http://msdn.microsoft.com/en-us/library/bb220041(v=office.12).aspx
【讨论】:
那是 VBA,而不是 C#。我似乎无法在 C# 中找到它 您可以尝试myEmailAddress = this.ActiveExplorer().Session.CurrentUser.EmailAddress;
或在此处尝试其他解决方案:social.msdn.microsoft.com/forums/en-US/vsto/thread/…【参考方案3】:
取决于“当前用户地址”的定义。
-
可以从
Appication.Session.CurrentUser
(返回Recipient
对象)检索Outlook中主帐户的地址。使用Recipient.Address
属性。但是请注意,对于 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 地址的多值属性,包括所有代理(别名)地址、EX 和 SMTP)。
如果配置文件中有多个帐户,则可以通过多个帐户发送或接收电子邮件。在这种情况下使用MailItem.SendUsingAccount
(返回Account
对象,可以为null - 在这种情况下使用Application.Session.CurentUser
)。这对于接收、发送或正在撰写的电子邮件均有效(Application.ActiveInspector.CurrentItem
或 Application.ActiveExplorer.ActiveInlineResponse
)。
可以使用Namespace.Accounts
集合(Application.Session.Accounts
访问给定配置文件中的所有帐户。可以使用Account.SmtpAddress
属性访问帐户的地址。
请注意,Outlook 对象模型仅公开邮件帐户。某些商店帐户(例如 PST)不在集合中,因为它们没有内在的用户身份,即使某些其他帐户(例如 POP3/SMTP)可以交付到该商店。如果要访问所有帐户,可以使用Redemption 及其RDOSession.Accounts
集合(RDOAccounts 对象)。
在扩展 MAPI 级别上,帐户通过 IOlkAccountManager 接口公开。如果您单击 IOlkAccountManager 按钮,您可以在OutlookSpy 中使用它。
-
在委托 Exchange 存储的情况下,存储所有者不会通过 Outlook 对象模型公开。您可以使用扩展 MAPI(请注意,
PR_MAILBOX_OWNER_ENTRYID
属性仅由在线商店公开,它在缓存商店中不可用)。您可以解析 Exchange 存储条目 id 并从中提取 EX 类型地址。然后,您可以在给定 EX 地址的情况下构造 GAL 对象条目 ID。您还可以使用Redemption 及其RDOExchangeMailboxStore 对象及其Owner
属性访问店主。
【讨论】:
如果在日历中创建约会,有没有办法使用 OOM 来了解哪个电子邮件帐户将与之关联? IE。当我们在个人资料中有多个帐户时,将日历映射到该帐户。 当然不行,读取约会 Parent 属性,将其转换为 Folder 对象,读取 Folder.Store 属性。遍历 Namespace.Accounts 集合并将 Account.DeliveryStore.EntryID 属性的值与约会的父商店条目 ID 的条目 ID 进行比较。 谢谢!同时,我发现刚刚创建的 AppointmentItem 在其 Recipients 集合中已经包含一个 Recipient 并且该收件人有我需要的电子邮件(这样组织者已经初始化)。看起来像一个更简单的方法(对于这个特定的任务)。或者这种方法有什么缺点吗?前提是有问题的约会是由我自己的代码创建的,因此我不必处理约会已经存在并且其收件人列表可能是非默认且不能依赖的情况。【参考方案4】:如果您使用的是普通的 POP/IMAP 服务器,您将获得以下电子邮件地址: Application.Session.CurrentUser.AddressEntry.Address;
使用 Exchange Server,您可以通过以下方式获取电子邮件地址: Application.Session.CurrentUser.AddressEntry.GetExchangeUser().PrimarySmtpAddress;
【讨论】:
【参考方案5】:试试outlookObject.ActiveExplorer().Session.CurrentUser.Address
。在 VS10、Outlook 2007、.NET 4.0 上为我工作
【讨论】:
【参考方案6】:任何路过的人,我强烈建议使用Application.Session.CurrentUser.AddressEntry.Address
而不是任何使用
Application.ActiveExplorer().Session
,
因为ActiveExplorer()
可能会返回NullReferenceException
,例如在通过 Outlook 打开电子邮件时。
【讨论】:
以上是关于在 Outlook 2007 中获取当前用户的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章
使用 Access 2007 中的电子邮件地址在 Outlook 中发送电子邮件