web-dev-qa-db-ja.com

現在ログインしているユーザーのメールアドレスを取得するにはどうすればよいですか?

私は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 = "[email protected]"
    .Importance = olImportanceNormal
    .Attachments.Add Doc.FullName
    .Send
End With

これが関連するかどうかはわかりませんが、ドキュメントが使用されているときは、ユーザーがサインインした状態でOutlookアプリケーションが常に開かれます。このような状況でインテリセンスヘルプを使用することに慣れているので、メソッドやプロパティをいじくり回すことができます。インテリセンスからの助けはほとんどないようです。

7
SikhWarrior

通常、電子メールアドレスは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

これは、オブジェクト参照が適切に設定された状態でEarly Bindを使用していることを前提としています。
このような情報にアクセスする別の方法は、名前空間プロパティを直接使用することです。

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

上記のいずれかが何らかの形で役立つことを願っています。

6
L42

それはすべて「現在のユーザーアドレス」の定義に依存します。

  1. Outlookのプライマリアカウントのアドレスは、_Appication.Session.CurrentUser_から取得できます(Recipientオブジェクトを返します)。 _Recipient.Address_プロパティを使用します。ただし、Exchangeアカウント(_Recipient.AddressEntry.Type == "EX"_)の場合は、EXタイプのアドレスを受け取ることに注意してください。 SMTPアドレスを取得するには、Recipient.AddressEntry.GetExchangeUser().PrimarySmtpAddressを使用します。エラーが発生した場合にnull /例外を処理できるように準備してください。これは、特定のケースで最も必要になる可能性が高いものです。

拡張MAPIレベル(C++またはDelphi)では、_IMAPISession::QueryIdentity_を使用します( OutlookSpy --IMAPISessionボタンをクリックしてからQueryIdentityをクリックします)。次に、_PR_ADDRTYPE_プロパティ( "EX" vs "SMTP")および_PR_EMAIL_ADDRESS_(_PR_ADDRTYPE_ = "SMTP"の場合)または(Exchangeの場合)_PR_SMTP_ADDRESS_を読み取ることができます。 (存在することが保証されていません)および_PR_EMS_AB_PROXY_ADDRESSES_(複数値のプロパティは、すべてのプロキシ(エイリアス)アドレスを含むアドレスを交換します)。

  1. プロファイルに複数のアカウントがある場合、複数のアカウントを介して電子メールを送受信できます。その場合は_MailItem.SendUsingAccount_を使用します(Accountオブジェクトを返します。nullの場合もあります。その場合は_Application.Session.CurentUser_を使用してください)。これは、受信、送信、または作成中の電子メール(_Application.ActiveInspector.CurrentItem_または_Application.ActiveExplorer.ActiveInlineResponse_)の両方に有効です。

  2. 特定のプロファイル内のすべてのアカウントには、_Namespace.Accounts_コレクション_(Application.Session.Accounts_)を使用してアクセスできます。アカウントのアドレスには、_Account.SmtpAddress_プロパティを使用してアクセスできます。 Outlookオブジェクトモデルはメールアカウントのみを公開することに注意してください。一部のストアアカウント(PSTなど)は、他のアカウント(POP3/SMTPなど)がそのストアに配信できる場合でも、固有のユーザーIDを持たないため、コレクションに含まれていません。すべてのアカウントにアクセスする場合は、 Redemption とその RDOSession 。Accountsコレクション( RDOAccounts オブジェクト)を使用できます。

拡張MAPIレベルでは、アカウントは IOlkAccountManager インターフェイスを介して公開されます。 IOlkAccountManagerボタンをクリックすると、 OutlookSpy で遊ぶことができます。

  1. Exchangeストアを委任する場合、ストアの所有者はOutlookオブジェクトモデルを通じて公開されません。拡張MAPIを使用することもできます(_PR_MAILBOX_OWNER_ENTRYID_プロパティはオンラインストアによってのみ公開され、キャッシュされたストアでは使用できないことに注意してください)。 ExchangeストアのエントリIDを解析し、そこからEXタイプのアドレスを抽出できます。次に、EXアドレスを指定してGALオブジェクトエントリIDを作成できます。 Redemption とその RDOExchangeMailboxStore オブジェクトを使用してストア所有者にアクセスすることもできます。およびそのOwnerプロパティ。

この回答は遅延バインディング用であるため、参照ライブラリを用意する必要はありません。次のコードをモジュールに配置します。

    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
3
James