Jak uzyskać adres e-mail aktualnie zalogowanego użytkownika?


Jestem nowy w VBA i próbuję uzyskać automatyczny dokument tekstowy do pracy. W tej chwili dokument ma przycisk, który po kliknięciu spowoduje wysłanie wiadomości e-mail z załączonym dokumentem.
Muszę jednak również uzyskać adres e-mail aktualnego użytkownika wysyłającego wiadomość e-mail, aby móc umieścić go w dokumencie przed przesłaniem. Moje wyszukiwania w Internecie nie przyniosły żadnego użytecznego kodu pasującego do mojej sytuacji. Mój obecny kod znajduje się poniżej.
Set OL = CreateObject("Outlook.Application")
Set EmailItem = OL.CreateItem(olMailItem)Set Doc = ActiveDocument
Doc.SaveWith 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

Nie jestem pewien, czy jest to istotne, ale gdy dokument jest używany, program Outlook będzie zawsze otwierany z zalogowanym użytkownikiem. Jestem przyzwyczajony do inteligentnego pomagania w takich sytuacjach, więc mogę wygłupiać się metodami i właściwościami, ale inteligencja wydaje się bardzo pomocna.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wszystko zależy od definicji „aktualnego adresu użytkownika”.
  • Główny adres konta w Outlooku można uzyskać z
    Appication.Session.CurrentUser
    (zwraca obiekt
    Recipient
    ). Użycie właściwości
    Recipient.Address
    . Pamiętaj jednak, że w przypadku konta Exchange (
    Recipient.AddressEntry.Type == "EX"
    ) otrzymasz adres EX. Aby uzyskać adres SMTP, użyj
    Recipient.AddressEntry.GetExchangeUser (). PrimarySmtpAddress
    . Przygotuj się na obsługę zer/wyjątków w przypadku błędów. To jest to, czego najprawdopodobniej potrzebujesz w swoim konkretnym przypadku. Na zaawansowanym poziomie MAPI (C ++ lub Delphi) użyj
    IMAPISession :: QueryIdentity
    (możesz to przetestować w OutlookSpy http://www.dimastr.com/outspy/- kliknij przycisk IMAPISession, a następnie QueryIdentity). Następnie możesz odczytać właściwość
    PR_ADDRTYPE
    („EX” vs „SMTP”) i
    PR_EMAIL_ADDRESS
    (gdy
    PR_ADDRTYPE
    = "SMTP") lub (w wymiana przypadków)
    PR_SMTP_ADDRESS
    (bez gwarancji) i
    PR_EMS_AB_PROXY_ADDRESSES
    (właściwość wielowartościowa będzie wymieniać adresy, w tym wszystkie adresy proxy (aliasy)).
  • W przypadku wielu kont w profilu wiadomość e-mail może być wysyłana lub odbierana za pośrednictwem wielu kont. W tym przypadku użyj
    MailItem.SendUsingAccount
    (zwraca obiekt
    Account
    , może być pusty - w tym przypadku użyj
    Application.Session.CurentUser
    ). dotyczy to otrzymanych, wysłanych lub utworzonych wiadomości e-mail (
    Application.ActiveInspector.CurrentItem
    lub
    Application.ActiveExplorer.ActiveInlineResponse
    ).
  • Dostęp do wszystkich kont w danym profilu można uzyskać za pomocą właściwości
    Namespace.Accounts
    collection
    (Application.Session.Accounts
    ). adres konta można uzyskać za pomocą właściwości
    Account.SmtpAddress
    . Należy pamiętać, że model obiektów programu Outlook zapewnia dostęp tylko do kont pocztowych. Niektóre konta sklepu (np. PST) nie są częścią kolekcji, ponieważ nie mają wewnętrznej tożsamości użytkownika, mimo że niektóre inne konta (np. POP3/SMTP) mogą być wysyłane do tego sklepu. Jeśli chcesz uzyskać dostęp do wszystkich kont, możesz użyć Redemption http://www.dimastr.com/redemption/i jego kolekcję RDOSession .Accounts (obiekt RDOAccounts). Na zaawansowanym poziomie MAPI konta są ujawniane za pośrednictwem interfejsu IOlkAccountManager. Możesz się nim bawić w OutlookSpy , http://www.dimastr.com/outspy/jeśli klikniesz przycisk IOlkAccountManager.
  • W przypadku delegowanych sklepów wymiany właściciel sklepu nie jest ujawniany za pośrednictwem modelu obiektów programu Outlook. Możesz użyć dowolnego rozszerzonego MAPI (pamiętaj, że właściwość
    PR_MAILBOX_OWNER_ENTRYID
    jest dostępna tylko w sklepie internetowym, nie jest dostępna w sklepie buforowanym). Możesz przeanalizować identyfikator wpisu sklepu Exchange i wyodrębnić z niego adres EX. Następnie możesz utworzyć identyfikator wpisu jednostki GAL z podanym adresem EX. Możesz również uzyskać dostęp do właściciela sklepu za pomocą Redemption http://www.dimastr.com/redemptionoraz jego obiekt RDOExchangeMailboxStore i jego właściwość
    Owner
    .
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Zwykle adres e-mail to nazwa przypisana do folderów poczty programu Outlook.

Więc spróbuj tego:
'~~> add these lines to your code
Dim olNS As Outlook.NameSpace
Dim olFol AS Outlook.FolderSet olNS = OL.GetNamespace("MAPI")
Set olFol = olNS.GetDefaultFolder(olFolderInbox)MsgBox olFol.Parent.Name '~~> most cases contains the email address

Zakłada się, że używasz

wczesne wiązanie

z odpowiednio ustawionym odniesieniem do obiektu.

Innym sposobem uzyskania dostępu do takich informacji jest bezpośrednie użycie właściwości

przestrzeń

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

Mam nadzieję, że wszystko powyższe w jakiś sposób pomoże.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ta odpowiedź dotyczy późnego linkowania, więc nie musisz mieć bibliotek referencyjnych. Umieść następujący kod w module:
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

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się