OutlookのVBAでメールを処理する
連休とはいえ、連続で休暇は取れず職場へちょくちょくと出向かなければなりません。あまり豊かな業界ではないので、のんびり休んではいられません。
で、休日明けに我が職場宛のメールボックスへ来たメールを確認するためにメーラーを開いてみると、相変わらずスパムの山・・・。
しかしやっかいなことに、本社からの指示メールもなぜだか職場宛のメールボックスへ配送されるので見ないわけにはいきませんし、スパムの山の中から、必要なメールを取り出して文書受付をしないといけません。重要な指示書や書類を紛失するわけにはいきませんので結構気を遣う、かつ面倒くさい作業となります。
スパムそのものは、本社のサーバーである程度フィルタリングされるんですが、あんまり厳しくすると問題が生じるのかほどほどなのでスルーされてくる迷惑メールは結構な数になります。これらは現状では、御本家の配下の各職場で対応するしかありません。
ということで、これらのやっかいな手間を一気に軽減する方法を模索。
- スパムはOutlookではなくサンダーバードに処理させる。
- サンダーバードで、本社からのメールは自分宛に転送する。
- 自分のOutlookで本社からのメールを振り分ける。
- Outlookのマクロで、振り分けた本社からのメールを職場のサーバーに保存する。
- 後は、その保存されたメールを管理職でチェックする。
- 処理済みのメールは処理済みフォルダに保管する。
と入ったような流れを考えればよさそうです。
「1」はズバリ迷惑メール対策です。我が社へのスパムの量は豊富ですからすぐに学習効果が発揮されることでしょう
。
「2」はサンダーバードはメールを転送するとき、メール本文とその添付ファイルを「一つの添付ファイル」にして、添付ファイルの形で転送してくれます。これは、この後の処理に実に都合がいい方式です。サンダーバードのフィルタルールに本社からのメールアドレスをフィルタして、転送するように設定します。
サンダーバードからの転送メールを開くと、本文が空で添付ファイル付きのメールとなります。件名は元のメールの件名にFWD:が付加されていますし、添付ファイルにも同様のファイル名が付いています。この添付ファイルには拡張子が付いていませんので、拡張子に「msg」をつければ、Outlookで読める形式になります。
指定されたフォルダのメール型のアイコンをクリックすれば、従来のメールと同じ感覚で保存されたメールが見えるというのは、特殊な操作を要求しないのでPC嫌いな上司にも簡単に受け入れてもらえますから・・・。
「3」これはOutlookの標準的な機能で振り分けができます。「自社のメールアドレスから来たメールを特定のフォルダに振り分ける」という処理を追加すればいいだけです。自社のアドレスから、自分のアドレスへメールが来るなんて事はほとんどないので、このフィルタルールで十分です。
「4」は自分の受信トレイの特定フォルダ(転送フォルダを保存しているフォルダですね)から一つずつメールをチェックして、その添付ファイルをサーバー上の決められたフォルダにコピーする処理と処理し終わったメールは受信トレイから削除することと、ついでにいつどのメールを処理したかログを作っておくことにします。
「5」以降は自動化は無理ですし、「6」に付いても手動で行った方が効率がよく間違いがないでしょう。ファイルの移動くらいなら誰でもできますから・・・。
作成したVBA
Sub createLogFile(LogFilePath As String, subject As String, time As String, body As String) 'ログファイルの生成の実験用 Dim n As Long n = FreeFile Open LogFilePath & "\MailLog.csv" For Output As #n Print #n, subject & "," & time & "," & body & vbCrLf Close #n End Sub Public Sub SaveFile() 'Copyright Chameleon 2007 Ver.0.0.2 'メインルーチン Dim i, x, count As Integer Dim strFolder As String Dim ns As NameSpace Dim mf As MAPIFolder Dim n As Long Dim message As String strFolder = getItemFolder() Set ns = GetNamespace("MAPI") Set myInbox = ns.GetDefaultFolder(olFolderInbox) Set myDestFolder = myInbox.Folders("本社メール") Set myItems = myDestFolder.Items n = FreeFile Open strFolder & "\MailLog.csv" For Append As #n For x = 1 To myItems.count With myItems.Item(x) count = 0 count = .Attachments.count If count > 0 Then For i = 1 To count 'Debug.Print .subject 'message = .body 'Debug.Print message Print #n, .subject & "," & .ReceivedTime ' & "," & message .Attachments(i).SaveAsFile (strFolder & "\" & .Attachments(i).DisplayName & ".msg") .Delete Next End If End With Next Close #n End Sub Function getItemFolder() As String '保存先決定用 Dim DesktopPath As String Dim objShell As Object 'Shell Dim objFolder As Object 'Shell32.Folder Const strTitle = "フォルダを選択してください。" Const lngRef = &H1 Const fldRoot = &H0 Set objShell = CreateObject("Shell.Application") Set objFolder = objShell.BrowseForFolder(0, strTitle, lngRef, fldRoot) DesktopPath = CreateObject("WScript.Shell").SpecialFolders("desktop") If objFolder Is Nothing Then getFOLDER = "キャンセル" Else If objFolder.ParentFolder Is Nothing Then getItemFolder = DesktopPath Else getItemFolder = objFolder.Items.Item.Path End If End If Set objFolder = Nothing Set objShell = Nothing End Function
毎回保存先を指示するのも面倒なので、保存先をレジストリに保存するようにしたりと細かいところを追加すれば十分実用になりそうですのでこれでしばらく運用です。
このマクロをOutlookでツールバーにボタンとして登録しておけばいつもボタン一発で処理完了![]()
着想いただきました。
ありがとうございます。
お役に立てて何よりです。