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

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

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

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

Outlook

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

Q&A

解決済

2回答

6738閲覧

Outlook 2010でのメール送信時、添付されたファイルのパスを取得したい。

islpynw

総合スコア8

VBA

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

Outlook

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

0グッド

0クリップ

投稿2016/11/02 13:56

Outlook 2010 VBAでApplication_ItemSendイベントの際に、添付ファイルが特定の形式である事をマジックナンバーで確かめる為、元ファイルのフルパスを取りたいと思っているのですが、AttachmentのDisplayName、Filenameではファイルの名前しか取得出来ず、Pathnameだと空文字(あるいはNull? 型を確かめていなかった……)が返ってきてしまいます。

MailItem_AttachmentAddイベント時であればGetTemporaryFilePathから完全なパスを取得出来るのですが、これでしか取得出来ないとなると、保存していた未送信メールを送信する時などのケースに対応できません。

今は手元にテスト環境がないので試せてないのですが、おそらくGetTemporaryFilePathが使えるイベントを鑑みるに、

lang

1Private g_Path$ 2 3Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean) 4 Dim WithEvents sendMail As MailItem 5 Set FSO = CreateObject("Scripting.FileSystemObject") 6 Set sendMail = Item 7 For Each x In Item.Attachments 8 x.SaveAsFile FSO.GetSpecialFolder(TemporaryFolder) & "\" & FSO.GetTempName 9 Call 特定の形式である事を確かめる関数(g_path) 10 Next 11End Sub 12 13Private Sub sendMail_BeforeAttachmentSave(ByVal Attachment As Attachment, Cancel As Boolean) 14 g_Path = Attachment.GetTemporaryFilePath 15 Cancel = True 16End Sub 17

という形でパスを取得して、自前の関数で処理するという目的が果たせるようになるのではないかと思っています。
ただこの方法は成功したとしても迂遠な手順を踏むことになります。

もっと直接的なアプローチで、フルパスもしくは元ファイルそのもの(コピー含む)を取得出来る方法をご存じの方がいらっしゃいましたらお教え願えれば幸いと思い、この質問を投稿します。

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

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

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

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

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

guest

回答2

0

OSによる(VistaとかWindows7とか8とか10)で未送信の一時保存先は、
C:\Users\アカウント名\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook
だと記憶しているけど。
普通の方法では直接アクセスできなかった気がする。(管理者権限の関係だったと記憶)
なのでセキュリティー上、VBAからアクセスできたかどうか。。。

投稿2016/11/02 14:07

MasahikoHirata

総合スコア3747

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

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

0

自己解決

BeforeAttachmentSaveイベントはAttachment.SaveAsFileでは起きず(MSDNに明記されていた……)、Attachment.PropertyAccessorからLong_PathNameを取りに行ってみるなどの方法を試してみましたが上手くいかず、以下の方法で取得する事になりました。

lang

1Set FSO = CreateObject("Scripting.FileSystemObject") 2Path$ = FSO.GetSpecialFolder(TemporaryFolder) & "\" & FSO.GetTempName 3Call Attachment.SaveAsFile(Path) 4Call 特定の形式である事を確かめる関数(Path)

最初に想定していたよりも、さらに迂遠な方法なので落胆しています。

調べる過程で集めた情報から推測するに、メール送信時の添付ファイルは必ずしも添付された当時の元ファイルとは限らないと(あるいは実際に出来るかどうかを問わず)想定されており、添付されてから何らかの編集が加えられた後で送信される(もしくは元ファイルの改変から保護する)可能性が考慮されているようです。

そういった事情を鑑みると、送信直前に出力しないと同一性が保証できないという形は納得の出来るものであり、決して無駄に重い処理を挟んでいるわけではないのだと自分に言い聞かせながらマクロを完成させたいと思います。

投稿2016/11/04 12:16

islpynw

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問