OutlookのVBAでメール受信時に指定の添付ファイル名であれば保存する。
タイトルのまんまです。よく見積書とか請求書をメールで送信してくる人いるじゃないですか、そういう時にメールの内容見てから、わざわざフォルダに保存しないといけないんですよねぇー、、これが面倒くさい。で、Outlookでメール受信したときに指定のアドレスからで指定のファイル名のやつの場合に保存ダイアログいきなり開いてくれるようにマクロ準備したっす。といっても丸々コピペですが、、、
で添付ファイル本体はなぜかZIPパスワードがかかっているので、本当はパスワード付ZIPを自動で解凍してくれるところまでやりたいんですが、そこまでは余力なかった。
パスワード付きファイル展開実装しました。エラーチェックとか盛り込んでいないのでとても危険です。あとMS非推奨の方法だけどDLLなしで対応したかったので仕方なくこの方法で対応しました。ほかにもこういう方法もあるそうです。
ウイルス仕込まれたら危険なので本来はメールファイル添付でやり取りするよりかは素性のはっきりしたRedmineとかプロジェクト管理ツールにファイル集約した方が安全な上に情報集約できていいと思うんですがねぇ、、ファイルサーバにデータ保存はルーチンには向いていますけど、そんなルーチンは自動化すべきと考えているのでやはりファイルはツールで集約管理すべきですね。
どうしてもファイルを送信したいんだぁという場合はオンラインストレージにファイルを保存してからパスワードは口頭で電話連絡するというのが本来のあるべき姿のような気がする。それか、SkypeとかSlackの様なチャットでやり取りのいずれかでしょう。
◆参考サイト
https://outlooklab.wordpress.com/2016/05/21/outlook-%E3%81%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E9%81%B8%E6%8A%9E%E3%81%AE%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD/
http://vba-andmore.hatenablog.com/entry/2016/07/15/223543
http://kakeruroku.blog.fc2.com/blog-entry-54.html
http://q.hatena.ne.jp/1218725545
https://kazusa-pg.com/vba-open-folder-by-shell/
https://www.tetsuyanbo.net/tetsuyanblog/43217
◆ソースコード
まぁやりたいことはほぼできているからいいかなぁ。ただシンプルじゃないコードなのですごく汚い(泣)その上、エラーチェックがザルなので糞コードです。
今後の課題として
1.パスワード付ZIPの自動解凍機能
2.複数の送信先と複数の対象ファイルを登録できるようにする。
3.パスワードメールを確認してそこからパスワードを自動セットする。
※3は事前に決めておければ必要ない気もしますが大体、あとから送ってくるんで
仕方なし
マクロ有効にしないと動かないので要注意
お約束ですが使用に際しては自己責任でお願いします。
後、こう書き替えれば効率がいいよとかありましたら
ご連絡いただけると幸いです。
パスワード付きファイル展開実装しました。エラーチェックとか盛り込んでいないのでとても危険です。あとMS非推奨の方法だけどDLLなしで対応したかったので仕方なくこの方法で対応しました。ほかにもこういう方法もあるそうです。
ウイルス仕込まれたら危険なので本来はメールファイル添付でやり取りするよりかは素性のはっきりしたRedmineとかプロジェクト管理ツールにファイル集約した方が安全な上に情報集約できていいと思うんですがねぇ、、ファイルサーバにデータ保存はルーチンには向いていますけど、そんなルーチンは自動化すべきと考えているのでやはりファイルはツールで集約管理すべきですね。
どうしてもファイルを送信したいんだぁという場合はオンラインストレージにファイルを保存してからパスワードは口頭で電話連絡するというのが本来のあるべき姿のような気がする。それか、SkypeとかSlackの様なチャットでやり取りのいずれかでしょう。
◆参考サイト
https://outlooklab.wordpress.com/2016/05/21/outlook-%E3%81%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E9%81%B8%E6%8A%9E%E3%81%AE%E3%83%80%E3%82%A4%E3%82%A2%E3%83%AD%E3%82%B0%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%83%9E%E3%82%AF%E3%83%AD/
http://vba-andmore.hatenablog.com/entry/2016/07/15/223543
http://kakeruroku.blog.fc2.com/blog-entry-54.html
http://q.hatena.ne.jp/1218725545
https://kazusa-pg.com/vba-open-folder-by-shell/
https://www.tetsuyanbo.net/tetsuyanblog/43217
◆ソースコード
'
' 受信したメールに特定のファイル名が含まれたら指定先に保存する
'
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
Const olFolderInbox = 6
Dim ns As NameSpace
Set ns = GetNamespace("MAPI")
Dim mf As MAPIFolder
Dim oflg As Integer
Set mf = ns.GetDefaultFolder(olFolderInbox)
oflg = searchFile(mf, EntryIDCollection)
Select Case oflg
Case Is = 0
MsgBox ("ファイルを処理しました。")
Case Is = 1
MsgBox ("ファイルは処理できていません。後で手動で処理してください。")
Set mf = Nothing
Exit Sub
Case Else
Set mf = Nothing
Exit Sub
End Select
Set mf = Nothing
End Sub
'ファイルを検索する
Function searchFile(oFolder As Outlook.Folder, EntryIDCollection As String) As Integer
Dim mis As Variant
mis = Split(EntryIDCollection, ",")
Dim mai As MailItem
Dim mi As Variant
Dim rtn As Integer
Dim eAd As String
Dim eNam As String
Dim fNam As String
For Each mi In mis
Set mai = Application.Session.GetItemFromID(mi)
eNam = "YourName"
eAd = "sample@sample.com"
fNam = "FileWord"
rtn = checkFile(mai, eAd, eNam, fNam)
Select Case rtn
Case Is = 0
searchFile = 0
Exit Function
Case Is = 1
searchFile = 1
Exit Function
Case Is = 2
searchFile = 2
Exit Function
End Select
Next
searchFile = 2
End Function
'ファイルを検索する
Function checkFile(mItem As MailItem, emailAddr As String, emailName As String, attchName As String) As Long
Dim rtn As Integer
Dim oFile As Object
Dim trg1 As Boolean
Dim trg2 As Boolean
If mItem.SenderEmailAddress = emailAddr Then 'アドレスで確認する場合
trg1 = True
End If
If mItem.SenderName = emailName Then '名前で確認する場合
trg2 = True
End If
If trg1 = True Or trg2 = True Then
For Each oFile In mItem.Attachments
If InStr(oFile.FileName, attchName) > 0 Then
rtn = saveFile(oFile)
If rtn = 0 Then
checkFile = 0
Exit Function
Else
checkFile = 1
Exit Function
End If
End If
Next
End If
checkFile = 2
End Function
'ファイルを保存する
Function saveFile(objFile As Object) As Integer
Dim appWord As Object
Dim dlgFile As FileDialog
Dim wshShell As Object
'
Set appWord = CreateObject("Word.Application")
Set dlgFile = appWord.FileDialog(Office.msoFileDialogFolderPicker)
Set wshShell = CreateObject("WScript.Shell")
Dim zipName As String
Dim strPass As String
dlgFile.Title = "保存先の指定"
dlgFile.InitialFileName = wshShell.SpecialFolders("MyDocuments") & "\"
If dlgFile.Show = -1 Then
GetFolder = dlgFile.SelectedItems(1)
Else
GetFolder = ""
End If
If GetFolder <> "" Then
zipName = GetFolder & "\" & objFile.DisplayName
objFile.SaveAsFile zipName
'*** 暗号化ZIPを解凍する。***
strPass = ""
Call unZipfile(GetFolder, zipName, strPass)
saveFile = 0
Else
saveFile = 1
Exit Function
End If
End Function
'ZIP解凍する
Function unZipfile(CopyTo As Variant, CopyFrom As String, strPass As String)
'ZIP
Dim FSO As Object
Dim shellObj As Object
Set shellObj = CreateObject("Shell.Application")
Dim ret As Long
shellObj.NameSpace((CopyTo)).CopyHere shellObj.NameSpace((CopyFrom)).Items
If strPass <> "" Then
SendKeys strPass & "{Enter}"
End If
Shell "Explorer.exe " & CopyTo, vbNormalFocus
Set FSO = Nothing
Set shellObj = Nothing
Set fileObj = Nothing
Set zipObj = Nothing
End Function
まぁやりたいことはほぼできているからいいかなぁ。ただシンプルじゃないコードなのですごく汚い(泣)その上、エラーチェックがザルなので糞コードです。
今後の課題として
2.複数の送信先と複数の対象ファイルを登録できるようにする。
3.パスワードメールを確認してそこからパスワードを自動セットする。
※3は事前に決めておければ必要ない気もしますが大体、あとから送ってくるんで
仕方なし
マクロ有効にしないと動かないので要注意
お約束ですが使用に際しては自己責任でお願いします。
後、こう書き替えれば効率がいいよとかありましたら
ご連絡いただけると幸いです。
コメント