如何获取当前登录用户的电子邮件地址?

Sik*_*ior 7 outlook vba ms-word word-vba outlook-vba

我是VBA的新手并试图让自动化的word文档正常工作.目前,文档中有一个按钮,按下后会触发附有文档的电子邮件.

但是我还需要获取当前用户发送电子邮件的电子邮件地址,因此我可以在发送之前将其放在文档中.我在互联网上的搜索没有产生符合我情况的任何可用代码.我目前的代码如下.

Set OL = CreateObject("Outlook.Application")
Set EmailItem = OL.CreateItem(olMailItem)

Set Doc = ActiveDocument
Doc.Save

With EmailItem
    .Subject = "Requesting Authorization Use Overtime"
    .Body = "Please review the following request for overtime" & vbCrLf & _
    "" & vbCrLf & _
    "Thanks"
    .To = "toemail@test.com"
    .Importance = olImportanceNormal
    .Attachments.Add Doc.FullName
    .Send
End With
Run Code Online (Sandbox Code Playgroud)

不确定这是否相关,但是当使用文档时,Outlook应用程序将始终以用户登录的方式打开.我曾经在这些情况下使用intellisense帮助,所以我可以使用方法和属性,但是intellisense似乎没什么帮助.

Dmi*_*nko 8

这一切都取决于"当前用户地址"的定义.

  1. 可以从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地址,包括所有代理(别名) )地址).

  1. 如果配置文件中有多个帐户,则可以通过多个帐户发送或接收电子邮件.在那种情况下使用MailItem.SendUsingAccount(返回Account对象,可以为null - 在这种情况下使用Application.Session.CurentUser).这对于收到,发送或组成(Application.ActiveInspector.CurrentItemApplication.ActiveExplorer.ActiveInlineResponse)的电子邮件都有效.

  2. 可以使用Namespace.Accounts集合访问给定配置文件中的所有帐户(Application.Session.Accounts.可以使用Account.SmtpAddress财产访问帐户的地址.请注意,Outlook对象模型仅公开邮件帐户.某些商店帐户(例如PST)不在集合中,因为即使某些其他帐户(例如POP3/SMTP)可以传送到该商店,它们也没有固有的用户身份.如果要访问所有帐户,可以使用Redemption及其RDOSession .Accounts集合(RDOAccounts对象).

在扩展MAPI级别,帐户通过IOlkAccountManager接口公开.如果单击IOlkAccountManager按钮,则可以在OutlookSpy中使用它.

  1. 如果是委派Exchange存储,则不通过Outlook对象模型公开存储所有者.您可以使用扩展MAPI(请注意,PR_MAILBOX_OWNER_ENTRYID属性仅由在线商店公开,在高速缓存的商店中不可用).您可以解析Exchange存储条目ID并从中提取EX类型地址.然后,您可以在给定EX地址的情况下构造GAL对象条目ID.您还可以使用Redemption及其RDOExchangeMailboxStore对象及其PR_MAILBOX_OWNER_ENTRYID属性访问商店所有者.


L42*_*L42 6

通常,电子邮件地址是分配给Outlook邮件文件夹的名称.
试试这个:

'~~> add these lines to your code
Dim olNS As Outlook.NameSpace
Dim olFol AS Outlook.Folder

Set olNS = OL.GetNamespace("MAPI")
Set olFol = olNS.GetDefaultFolder(olFolderInbox)

MsgBox olFol.Parent.Name '~~> most cases contains the email address
Run Code Online (Sandbox Code Playgroud)

这假设您正在使用Early Bind并正确设置对象引用.
访问此类信息的另一种方法是直接使用Namespace属性.

MsgBox olNS.Accounts.Item(1).DisplayName '~~> usually email address
MsgBox olNS.Accounts.Item(1).SmtpAddress '~~> email address
MsgBox olNS.Accounts.Item(1).UserName '~~> displays the user name
Run Code Online (Sandbox Code Playgroud)

我希望以上任何一种方式都有所帮助.


Jam*_*mes 6

此答案适用于后期绑定,因此您无需拥有参考库。将以下代码放入模块中:

    Dim OL As Object, olAllUsers As Object, oExchUser As Object, oentry As Object, myitem As Object
    Dim User As String

    Set OL = CreateObject("outlook.application")
    Set olAllUsers = OL.Session.AddressLists.Item("All Users").AddressEntries

    User = OL.Session.CurrentUser.Name

    Set oentry = olAllUsers.Item(User)

    Set oExchUser = oentry.GetExchangeUser()

    msgbox oExchUser.PrimarySmtpAddress
Run Code Online (Sandbox Code Playgroud)