OutlookのVBAでメールを処理する

連休とはいえ、連続で休暇は取れず職場へちょくちょくと出向かなければなりません。あまり豊かな業界ではないので、のんびり休んではいられません。
で、休日明けに我が職場宛のメールボックスへ来たメールを確認するためにメーラーを開いてみると、相変わらずスパムの山・・・。

しかしやっかいなことに、本社からの指示メールもなぜだか職場宛のメールボックスへ配送されるので見ないわけにはいきませんし、スパムの山の中から、必要なメールを取り出して文書受付をしないといけません。重要な指示書や書類を紛失するわけにはいきませんので結構気を遣う、かつ面倒くさい作業となります。

スパムそのものは、本社のサーバーである程度フィルタリングされるんですが、あんまり厳しくすると問題が生じるのかほどほどなのでスルーされてくる迷惑メールは結構な数になります。これらは現状では、御本家の配下の各職場で対応するしかありません。

ということで、これらのやっかいな手間を一気に軽減する方法を模索。

           
  1. スパムはOutlookではなくサンダーバードに処理させる。
  2. サンダーバードで、本社からのメールは自分宛に転送する。
  3. 自分のOutlookで本社からのメールを振り分ける。
  4. Outlookのマクロで、振り分けた本社からのメールを職場のサーバーに保存する。
  5. 後は、その保存されたメールを管理職でチェックする。
  6. 処理済みのメールは処理済みフォルダに保管する。

と入ったような流れを考えればよさそうです。

「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でツールバーにボタンとして登録しておけばいつもボタン一発で処理完了

Leave a Reply

XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>