スパムメール対策(OutlookVBA)
2009/10/25
もう冬ですね。寒いですね。
我が家ではエアコンの暖房をつけはじめました。
さて、先日職場にて、スパムメールに悩まされている先輩がいらっしゃいました。サイトを複数運営しており、その問い合わせ用メールアドレスには、世界中からスパムメールが届き、それを区分けするだけでいっぱい時間がかかっちゃうと・・・
んで、その先輩のために、「オリジナルスパムメール対策VBAマクロ」を作ったので、ついでにここで紹介しちゃいます。
ちなみにメーラはoutlook2003です。
ポイントは3つに絞りました。
・1.外国からのメールはシャットアウト!
・2.タイトルも本文も半角英数記号の場合、シャットアウト!
・3.タイトルは半角英数記号、本文は日本語混じり
上記の場合、適当なフォルダに新着メールを移動します。外国人の友達がいる場合、ちょっと厳しい条件ですのでお気をつけ下さい。
1の条件の外国からのメールの条件としては、メールのヘッダ情報にあるメール送信日時に着目しました。メール送信日時は、送られてくる国からのグリニッジ時差情報も得られます。日本は+9時間ですから、それを見て判断します。時差+9時間の国が他にあるとか言う声は聞こえてきません。
2と3は、そのまま文字を見て判断するだけなので、正規表現でチャチャッと判定します。
・・・あれ、outlook2003じゃ、メールのヘッダー情報取れない!?
むはー、困ったなぁ・・・
と1時間悩んだ結果、色々調べてCDO.DLLってのを使うことにしました。OSがXPの人はインストールCDから取れるってことですが、ネット上からダウンロードして組み込みました。ちなみにoutlook2007だと、そんなことせずにメールのヘッダー情報が取れるって話です。むぅ。
んで、せっかくなのでCDO.DLL内にある、MAPIオブジェクトってのを使ってVBAを全部実装しました。
それがこちら。
そうそう、細かい説明はしてませんが、参照設定に「Microsoft CDO 1.21 Library」を追加したり、モジュールの置き場所とかわからない人は、ご自身でお勉強ついでに調べて下さい^^;
オリジナルスパムメール対策VBAマクロ
Private Sub Application_NewMail()
Dim oSession As MAPI.Session
Dim oFolders As Folder
Dim Folder() As Folder
Dim Flag() As Boolean
Dim sFolderName() As String
Dim Msgs As Messages
Dim myMsg As Message
'##########初期処理##########
ReDim sFolderName(0 To 2)
sFolderName(0) = "_IKM1:送信者が日本時間以外"
sFolderName(1) = "_IKM2:件名が英語で本文も英語"
sFolderName(2) = "_IKM3:件名が英語で本文は日本語"
ReDim FolderName(UBound(sFolderName))
ReDim Flag(UBound(sFolderName))
ReDim Folder(UBound(sFolderName))
Set oSession = New MAPI.Session: oSession.Logon "Outlook"
Set oFolder = oSession.GetDefaultFolder(CdoDefaultFolderInbox)
'##########フォルダなかったら作成##########
For Each v1 In Flag: v1 = False: Next v1
For Each v2 In oFolder.Folders
For i = 0 To UBound(sFolderName) Step 1
If sFolderName(i) = v2.Name Then Flag(i) = True
Next i
Next v2
For i = 0 To UBound(sFolderName) Step 1
If Flag(i) = False Then oFolder.Folders.Add (sFolderName(i))
Next i
'##########フォルダセット##########
Set Folder(0) = oFolder.Folders(sFolderName(0))
Set Folder(1) = oFolder.Folders(sFolderName(1))
Set Folder(2) = oFolder.Folders(sFolderName(2))
'##########迷惑メール処理##########
Set Msgs = oFolder.Messages
For Each myMsg In Msgs
'既読は処理しない
If myMsg.UnRead = False Then GoTo NextForLabel:
'件名なしは処理しない
If myMsg.Subject = "" Then GoTo NextForLabel:
'日本時間じゃないときは移動
If Not IsJapaneseTime(myMsg.Fields(&H7D001E)) Then
myMsg.MoveTo (Folder(0).ID)
GoTo NextForLabel:
End If
'件名は英語?
If IsCheck(myMsg.Subject) Then
'ボディも英語!
If IsCheck(myMsg.Text) Then
myMsg.MoveTo (Folder(1).ID)
'ボディは日本語!
Else
myMsg.MoveTo (Folder(2).ID)
End If
End If
NextForLabel:
Next
'##########後処理##########
oSession.Logoff
Set myMsg = Nothing
Set Msgs = Nothing
For Each v In sFolderName: v = "": Next v
For Each v In Flag: v = False: Next v
For Each v In Folder: Set v = Nothing: Next v
Set oFolders = Nothing
Set oSession = Nothing
End Sub
Private Function IsCheck(Value As String) As Boolean
Dim RE As New RegExp
RE.Pattern = "[^!-~¥s]"
IsCheck = Not RE.test(Value)
End Function
Private Function IsJapaneseTime(Value As String) As Boolean
Dim v As Variant
IsJapaneseTime = True
v = Split(Value, vbLf)
IsJapaneseTime = False
For i = 0 To UBound(v) Step 1
If Left(v(i), 4) = "Date" Then '送信日が
If InStr(v(i), "+09") > 0 Then '日本時刻 +0900 なら
IsJapaneseTime = True 'Trueを返す
Exit Function
End If
End If
Next i
End Function