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

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

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

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

Outlook

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

Q&A

解決済

1回答

4893閲覧

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

fishStory

総合スコア10

VBA

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

Outlook

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

0グッド

1クリップ

投稿2018/06/27 09:11

編集2018/06/27 09:43

前提・実現したいこと

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

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

該当のソースコード

VBA

1Sub get_msg() 2 3 4Dim OL As Object 5Dim msg As Object 6Dim intNo As Integer 7Dim strFileName As String 8Dim strOutFileName As String 9Dim SaveFolderPath As String 10Dim AttFile_excel As String 11Dim AttFile_text As String 12 13' テキストを出力するファイルを設定(※要変更) 14strFileName = "C:\Temp\明日の予定について.msg" 15' テキストを出力するファイルを設定(※要変更) 16strOutFileName = "C:\Temp\sample.txt" 17' 添付ファイルの保存先フォルダ(※要変更) 18SaveFolderPath = "C:\Temp\" 19'メールに添付されているエクセルファイル 20AttFile_excel = "C:\Temp\サンプルエクセル.xlsx" 21'メールに添付されているテキストファイル 22AttFile_text = "C:\Temp\サンプルテキスト.txt" 23 24'Outlookのアプリケーションオブジェクトを作成する 25Set OL = CreateObject("Outlook.Application") 26Set msg = OL.CreateItemFromTemplate(strFileName) 27 28 29intNo = FileSystem.FreeFile() ' フリーファイルNoを取得 30Open strOutFileName For Output As #intNo ' 上書きモードでファイルをオープン 31 32 33 Print #intNo, "SentOnBehalfOfName: " & msg.SentOnBehalfOfName 34 Print #intNo, "SenderName: " & msg.SenderName 35 Print #intNo, "ReceivedOnBehalfOfName: " & msg.ReceivedOnBehalfOfName 36 Print #intNo, "ReplyRecipientNames: " & msg.ReplyRecipientNames 37 Print #intNo, "To: " & msg.To 38 Print #intNo, "CC: " & msg.CC 39 Print #intNo, "BCC: " & msg.Bcc 40 Print #intNo, "Subject: " & msg.Subject 41 Print #intNo, "Body: " & msg.Body 42 43Close #intNo ' ファイルをクローズ 44 45Set msg = Nothing 46Set OL = Nothing 47 48End 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/ツールのバージョンなど)

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/06/27 09:16

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

2018/06/27 09:46

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

回答1

0

ベストアンサー

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

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

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

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

vba

1'original code : https://msdn.microsoft.com/ja-jp/library/office/ff184624.aspx 2 'iMail As Outlook.MailItem 3Private Function GetSenderSMTPAddress(ByVal iMail As Object) As String 4 Const PR_SMTP_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E" 5 6 If iMail Is Nothing Then _ 7 Call Err.Raise(5) 8 9 If iMail.SenderEmailType <> "EX" Then _ 10 Let GetSenderSMTPAddress = iMail.SenderEmailAddress: _ 11 Exit Function 12 13 14 Dim mailSender As Object 'As Outlook.AddressEntry 15 Set mailSender = iMail.Sender 16 17 If mailSender Is Nothing Then _ 18 Exit Function 'return vbNullString 19 20 21 'Enum value of Outlook.OlAddressEntryUserType for late binding 22 Const olExchangeUserAddressEntry = 0, _ 23 olExchangeRemoteUserAddressEntry = 5 24 25 'Now we have an AddressEntry representing the Sender 26 Select Case mailSender.AddressEntryUserType 27 Case olExchangeUserAddressEntry, _ 28 olExchangeRemoteUserAddressEntry 29 30 'Use the ExchangeUser object PrimarySMTPAddress 31 Dim exchUser As Object 'As Outlook.ExchangeUser 32 Set exchUser = mailSender.GetExchangeUser() 33 34 If exchUser Is Nothing Then _ 35 Exit Function 'return vbNullString 36 37 Let GetSenderSMTPAddress = exchUser.PrimarySmtpAddress 38 39 Case Else 40 Let GetSenderSMTPAddress = _ 41 CStr(mailSender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS)) 42 43 End Select 44 45End Function

投稿2018/06/27 12:20

編集2018/06/27 12:35
imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fishStory

2018/06/28 01:20

ご回答ありがとうございます。 上記Functionの呼び方としては、以下であっているでしょうか? ’Dim sendmailaddress As String’ ’sendmailaddress = GetSenderSMTPAddress msg’ 上記の呼び方ですと、構文エラーが出てしますのですが…
imihito

2018/06/28 10:52

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問