visual plantilla pasar para macro lenguaje generar enviar documento desde datos copiar con vba ms-word outlook word-vba outlook-vba

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".

  1. La dirección de la cuenta principal en Outlook se puede recuperar de Appication.Session.CurrentUser (devuelve el objeto Recipient ). Usar la propiedad Recipient.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, use Recipient.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)).

  1. 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 objeto Account , puede ser nulo, en ese caso utilice Application.Session.CurentUser ). Esto es válido tanto para los recibidos, enviados o correos electrónicos que se están compilando ( Application.ActiveInspector.CurrentItem o Application.ActiveExplorer.ActiveInlineResponse ).

  2. 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 propiedad Account.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.

  1. 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.