質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.52%

  • VBA

    1798questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1535questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Outlook

    58questions

    Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。

Outlookのメッセージファイル(.msg)から送信元アドレスを取得したい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 522

fishStory

score 2

 前提・実現したいこと

初めまして。
VBA初心者です。 

ExcelのVBAで、OUTLOOL2013のメッセージファイル(.msg)から送信元アドレスを取得しようとしています。
今回は受信トレイのメールからではなく、ローカルの任意の場所にコピーしたメッセージファイル(.msg)からデータを取り出したいです。

 該当のソースコード

Sub get_msg()


Dim OL  As Object
Dim msg As Object
Dim intNo As Integer
Dim strFileName As String
Dim strOutFileName As String
Dim SaveFolderPath As String
Dim AttFile_excel As String
Dim AttFile_text As String

' テキストを出力するファイルを設定(※要変更)
strFileName = "C:\Temp\明日の予定について.msg"
' テキストを出力するファイルを設定(※要変更)
strOutFileName = "C:\Temp\sample.txt"
' 添付ファイルの保存先フォルダ(※要変更)
SaveFolderPath = "C:\Temp\"
'メールに添付されているエクセルファイル
AttFile_excel = "C:\Temp\サンプルエクセル.xlsx"
'メールに添付されているテキストファイル
AttFile_text = "C:\Temp\サンプルテキスト.txt"

'Outlookのアプリケーションオブジェクトを作成する
Set OL = CreateObject("Outlook.Application")
Set msg = OL.CreateItemFromTemplate(strFileName)


intNo = FileSystem.FreeFile()           ' フリーファイルNoを取得
Open strOutFileName For Output As #intNo   ' 上書きモードでファイルをオープン


    Print #intNo, "SentOnBehalfOfName: " & msg.SentOnBehalfOfName
    Print #intNo, "SenderName: " & msg.SenderName
    Print #intNo, "ReceivedOnBehalfOfName: " & msg.ReceivedOnBehalfOfName
    Print #intNo, "ReplyRecipientNames: " & msg.ReplyRecipientNames
    Print #intNo, "To: " & msg.To
    Print #intNo, "CC: " & msg.CC
    Print #intNo, "BCC: " & msg.Bcc
    Print #intNo, "Subject: " & msg.Subject
    Print #intNo, "Body: " & msg.Body

Close #intNo                            ' ファイルをクローズ

Set msg = Nothing
Set OL = Nothing

End Sub

 試したこと

[実行結果]
SentOnBehalfOfName: Yamada, Taro/山田 太郎  ←★ここをメールアドレスとして取得したい
SenderName: Yamada, Taro/山田 太郎
ReceivedOnBehalfOfName: Suzuki, Hanako/鈴木 花子
ReplyRecipientNames
To: Suzuki, Hanako/鈴木 花子
CC
BCC
Subject: 明日の予定について
Body
担当者様

お世話になっております。

明日の出発時間は何時でしょうか。

以下のようなプロパティを利用しても、メールアドレスではなく名前に変換されてしまいます。
SentOnBehalfOfName
Sender

SenderEmailAddressを使用しても、以下のように組織にあるExchangeサーバの情報しか取れません。
/O=xxxx EXCHANGE ORGANIZATION/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF23SPDLT)/CN=RECIPIENTS/CN=YAMADA.TARO018

どうすれば、名前として変換されているメールアドレスを取得できるでしょうか。
プロパティについては、以下MSDNを参考にしています。
MailItem メンバー (Outlook)

 補足情報(FW/ツールのバージョンなど)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mts10806

    2018/06/27 18:16

    現在組まれているソースコードをご提示ください。また、文章と引用・関連情報などはコードブロックや引用符などマークダウンを使って明確にわけるようにしていただくと読みやすくなりますのでご活用ください。 https://teratail.com/help#about-markdown

    キャンセル

  • mts10806

    2018/06/27 18:46

    おそらく編集画面にリアルタイムプレビューが出ているのでそちらを見ながら更新していただけると・・・。メール文章のところはコードブロック ``` で囲うほうがいいかもしれませんね。見出しになってますし。

    キャンセル

回答 1

+2

outlook Exchange SenderEmailAddressのキーワードでGoogle検索したところ、
以下のページが見つかりました。

【方法】メール アイテムの差出人の SMTP アドレスを取得する

ただ、例がC#のコードだったため、遅延バインド版VBAに書き換えてみました。

当方にはExchangeサーバの環境が無いため動作が確認できていませんが、よろしければお試しください。

'original code  : https://msdn.microsoft.com/ja-jp/library/office/ff184624.aspx
    'iMail As Outlook.MailItem
Private Function GetSenderSMTPAddress(ByVal iMail As Object) As String
    Const PR_SMTP_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"

    If iMail Is Nothing Then _
        Call Err.Raise(5)

    If iMail.SenderEmailType <> "EX" Then _
        Let GetSenderSMTPAddress = iMail.SenderEmailAddress: _
        Exit Function


    Dim mailSender As Object 'As Outlook.AddressEntry
    Set mailSender = iMail.Sender

    If mailSender Is Nothing Then _
        Exit Function 'return vbNullString


    'Enum value of Outlook.OlAddressEntryUserType for late binding
    Const olExchangeUserAddressEntry = 0, _
          olExchangeRemoteUserAddressEntry = 5

    'Now we have an AddressEntry representing the Sender
    Select Case mailSender.AddressEntryUserType
        Case olExchangeUserAddressEntry, _
             olExchangeRemoteUserAddressEntry

            'Use the ExchangeUser object PrimarySMTPAddress
            Dim exchUser As Object 'As Outlook.ExchangeUser
            Set exchUser = mailSender.GetExchangeUser()

            If exchUser Is Nothing Then _
                Exit Function 'return vbNullString

            Let GetSenderSMTPAddress = exchUser.PrimarySmtpAddress

        Case Else
            Let GetSenderSMTPAddress = _
                    CStr(mailSender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS))

    End Select

End Function

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/28 10:20

    ご回答ありがとうございます。
    上記Functionの呼び方としては、以下であっているでしょうか?

    ’Dim sendmailaddress As String’
    ’sendmailaddress = GetSenderSMTPAddress msg’

    上記の呼び方ですと、構文エラーが出てしますのですが…

    キャンセル

  • 2018/06/28 19:52

    VBAのプロシージャの呼び出し方法ですが
    返り値を使用しない場合は「プロシージャ名 引数1, 引数2, …」(カッコ不要)
    返り値を使用する場合、または「Call」を付けた場合は「~ プロシージャ名(引数1, 引数2, …)」(カッコ必要)
    となります(初心者には紛らわしいと思います)。

    今回は「GetSenderSMTPAddress」の「返り値を使用する場合」ですので引数をカッコで括る必要があります。
    つまり、「 sendmailaddress = GetSenderSMTPAddress(msg) 」
    とカッコをつけて呼び出す必要があります。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1798questions

    VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

  • Excel

    1535questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • Outlook

    58questions

    Microsoft OutlookはMicrosoft Officeの一部として組み込まれている、のユーザー管理とメーラーの機能を持ち合わせたソフトウェアです。