vba - plantilla - ¿Cómo obtener la dirección de correo electrónico del usuario registrado actualmente?
pasar datos de word a excel con macro (3)
Todo depende de la definición de "la dirección de usuario actual".
- La dirección de la cuenta principal en Outlook se puede recuperar de
Appication.Session.CurrentUser
(devuelve el objetoRecipient
). Usar la propiedadRecipient.Address
. Sin embargo, tenga en cuenta que para una cuenta de Exchange (Recipient.AddressEntry.Type == "EX"
) recibirá una dirección de tipo EX. Para recuperar la dirección SMTP, useRecipient.AddressEntry.GetExchangeUser().PrimarySmtpAddress
. Esté preparado para manejar nulos / excepciones en caso de errores. Esto es lo que probablemente necesite en su caso particular.
En el nivel extendido de MAPI (C ++ o Delphi), use IMAPISession::QueryIdentity
(puede probarlo en OutlookSpy , haga clic en el botón IMAPISession y luego en QueryIdentity). A continuación, puede leer la propiedad PR_ADDRTYPE
("EX" frente a "SMTP") y PR_EMAIL_ADDRESS
(cuando PR_ADDRTYPE
= "SMTP") o (en el caso de Exchange) PR_SMTP_ADDRESS
(no se garantiza que esté presente) y PR_EMS_AB_PROXY_ADDRESSES
(propiedad multivaluada intercambiará direcciones, incluyendo todas las direcciones proxy (alias)).
En el caso de varias cuentas en el perfil, se puede enviar o recibir un correo electrónico a través de varias cuentas. En ese caso, use
MailItem.SendUsingAccount
(devuelve el objetoAccount
, puede ser nulo, en ese caso utiliceApplication.Session.CurentUser
). Esto es válido tanto para los recibidos, enviados o correos electrónicos que se están compilando (Application.ActiveInspector.CurrentItem
oApplication.ActiveExplorer.ActiveInlineResponse
).Se puede acceder a todas las cuentas de un perfil determinado utilizando el
Namespace.Accounts
Colección de cuentas(Application.Session.Accounts
). Se puede acceder a la dirección de la cuenta usando la propiedadAccount.SmtpAddress
. Tenga en cuenta que el Modelo de objetos de Outlook solo expone cuentas de correo. Algunas cuentas de tienda (como PST) no están en la colección ya que no tienen una identidad de usuario intrínseca, incluso si otras cuentas (como POP3 / SMTP) pueden entregar a esa tienda. Si desea acceder a todas las cuentas, puede usar Redención y su colección RDOSession . Cuentas (objeto RDOAccounts ).
En el nivel extendido de MAPI, las cuentas se exponen a través de la interfaz IOlkAccountManager . Puede jugar con él en OutlookSpy si hace clic en el botón IOlkAccountManager.
- En el caso de delegar almacenes de Exchange, el propietario de la tienda no está expuesto a través del Modelo de objetos de Outlook. Puede usar MAPI extendido (tenga en cuenta que la propiedad PR_MAILBOX_OWNER_ENTRYID solo está expuesta en la tienda en línea, no está disponible en una tienda en caché). Puede analizar el ID de entrada de la tienda de Exchange y extraer la dirección de tipo EX de él. A continuación, puede construir el ID de entrada de objeto GAL dada la dirección EX. También puede acceder al propietario de la tienda utilizando Redención y su objeto RDOExchangeMailboxStore y su propiedad
Owner
.
Soy nuevo en VBA e intento que funcione un documento word automatizado. Por el momento, hay un botón en el documento que, al pulsar, disparará un correo electrónico con el documento adjunto.
Sin embargo, también necesito obtener la dirección de correo electrónico del usuario actual que envía el correo electrónico, así puedo ubicarlo dentro del documento antes de enviarlo. Mis búsquedas en Internet no han resultado en ningún código utilizable que cumpla mi situación. Mi código actual está abajo.
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 = "[email protected]"
.Importance = olImportanceNormal
.Attachments.Add Doc.FullName
.Send
End With
No estoy seguro de si esto es relevante, pero cuando se usa el documento, la aplicación de Outlook siempre estará abierta con un usuario registrado. Estoy acostumbrado a tener ayuda intellisense en este tipo de situaciones, así que puedo jugar con métodos y propiedades, pero parece que hay muy poca ayuda de intellisense.
Esta respuesta es para vinculación tardía, por lo que no necesita tener bibliotecas de referencia. Coloque el siguiente código en un módulo:
Dim OL, olAllUsers, oExchUser, oentry, 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
Por lo general, la dirección de correo electrónico es el nombre asignado a Outlook Mail Folders.
Entonces intente esto:
''~~> 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
Esto supone que está utilizando la vinculación temprana con la referencia del objeto configurada correctamente.
Otra forma de acceder a dicha información es usar directamente las propiedades del Espacio de nombres .
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
Espero que algo de lo anterior de alguna manera ayude.