2015/10/16

Outlookへの新規メール受信をIFTTT/Pushbulletを使ってAndroidにPush通知する


Last Update : 24/Oct/2015

Outlookへの新規メール受信時にAndroid端末にPush通知を送る方法の例です。

以前、Node.js経由でPushbulletに通知を送信する方法を書きましたが、今回は、IFTTT経由でPushbulletにトリガーを送る方法を考えてみました。

Outlookのマクロに簡易スパムフィルタとメールでの通知のリモートOn/Off機能を追加しています。

IFTTTにトリガーメールを送りますので、Gmail等にメールを転送するのとあまり変わらないのですが、Outlookのマクロのスタディも兼ねて作ってみましたので、興味のある方はご自分の用途や環境に合わせてアレンジしてみてください。

(参考)
Pushbullet APIでOutlookへの新規メール受信をAndroidにPush通知する
http://galaxy-shw-m110s.blogspot.kr/2014/12/pushbullet-apioutlookandroidpush_5.html

■想定される環境

以下の様な環境下での使用を想定しています。

・職場のメールはOutlook(Exchangeサーバー)でProxy環境下。
・Outlookの仕訳ルールでの自動転送はサーバー側でブロックされている。
・Gmail等のメール、SNS、PushbulletへのアクセスはProxyで撥ねられる。
・モバイル端末からVPNやセキュアなクライアントアプリを利用したメール閲覧は許可されている。
・モバイル端末のクライアントアプリへのメールのPushサービスが提供されていない。

PCのバックグラウンドで動作しますので、PCは常に稼働したままで、Outlookも常に起動したままにしておく必要があります。

■全体の動作の流れ

・Outlookのマクロで新規メール受信時に表題・送信者名・本文(一部)を取得
・スパム確認(送信者/表題)
・トリガーメール作成
・特定の送信者/表題のメールを受信した場合は通知のOn/OFFを切替え結果を通知
・IFTTTにトリガーメールを送る
・トリガーを受信したIFTTTからPushbulletにPush通知を送る

■必要なもの

・ Outlook用マクロ(詳細下記)
・ リモート操作用ファイル 3種類
・ スパムフィルタ用ファイル 2種類
・ IFTTTアカウント(https://ifttt.com/recipes
・ Pushbulletアプリ(Android側:https://play.google.com/store/apps/details?id=com.pushbullet.android

【1】Outlook用マクロ

新規メール受信時に自動起動し、受信メールから表題・送信者名・本文を取得して加工し、IFTTTにトリガー(メール)を送るマクロです。

受信したメールがExchangeメールの場合はサーバーにアクセスして送信者のEmailアドレスを取得する処理も行います。

外部のテキストファイルに記述した送信者のメールアドレスや表題の先頭部分(デフォルトは5文字)との照合を行う簡易スパムフィルタ機能や、特定の送信者からの特定の表題のリモートメールで通知のOn/OffしてPush通知先にOn/Off状態を通知する機能も追加しています。

[動作内容]

1) 受信メールから表題や送信者情報を取得
2) 送信者名と送信者のEmailアドレスの処理
 ・送信者名と送信者のEmailアドレスが同じ場合はEmailアドレスのみ表示
 ・送信者のメールアドレスがEmailの場合は送信者名とEmailアドレスの両方を表示
 ・送信者のメールアドレスがExchangeの場合はSMTPアドレスを取得
3) スパムフィルタ
 ・スパム確認(送信者のEmailアドレス)
 ・スパム確認(表題)
4) メッセージ作成
5) 通知のOn/Offのリモート操作
 ・特定の送信者/表題のメールを受信した時にマクロをOn/Offし通知先に通知
6) 通知のOn/Off状態の確認
7) 表題と本文を加工して送信
 ・本文から余計な空白と改行コードを削除
 ・本文の文字数を制限
 ・通知メールを送信

 
'Outlook受信メールプッシュ通知マクロ(IFTT版) Ver 1.30
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim objItem
    Set objItem = Session.GetItemFromID(EntryIDCollection)
    If objItem.MessageClass = "IPM.Note" Then
        AutoForward objItem
    End If
End Sub
Private Sub AutoForward(ByVal objMail As MailItem)
'
'[ユーザー設定項目]
'
'トリガー送信先アドレスを指定
Const ForwardToAddress = "trigger@recipe.ifttt.com"
'
'マクロ中断/再開用リモート操作メールの送信者アドレスを指定
Const MailStopAddress = "XXXXXXXX@gmail.com"
'
'設定ファイルのPATHを指定
Const FilePATH = "C:\環境に合わせて書き換えてください\IFTTT\"
'
'[変数]
'
Dim strFileName As String
Dim fwMail As MailItem
Dim i As Integer
Dim buf As String
Dim strSpamFile1 As String
Dim strSpamFile2 As String
Dim strSpamList1 As String
Dim strSpamList2 As String
Dim strSenderName As String
Dim strSenderEmailAddress As String
Dim strSubject As String
Dim strBody As String
Dim strShortBody As String
Dim strRepBody As String
Dim strShortSubject As String
Dim strStatusFile As String
Dim strStatus As String
Dim strStartPushFile As String
Dim strStopPushFile As String
'
strSpamFile1 = FilePATH & "spamlist.txt"
strSpamFile2 = FilePATH & "keyword.txt"
strStatusFile = FilePATH & "Push_is_On_Now.txt"
strStartPushFile = FilePATH & "Start_Pushing.bat"
strStopPushFile = FilePATH & "Stop_Pushing.bat"
'
'受信メールの自動仕分けルールや迷惑メールフィルタと併用した場合のエラー対策
On Error GoTo ErrorTrap
'
'[受信メールから表題や送信者情報を取得]
'
strSubject = objMail.Subject    '表題を取得
strSenderName = objMail.SenderName  '送信者名を取得
strSenderEmailAddress = objMail.SenderEmailAddress  'Emailアドレスを取得
strBody = objMail.Body  '本文を取得
'
'[送信者名と送信者のEmailアドレスの処理]
'
 '送信者名と送信者のEmailアドレスが同じ場合はEmailアドレスのみ表示
 If strSenderName = strSenderEmailAddress Then
    strSenderName = strSenderEmailAddress
 Else
 '送信者のメールアドレスがEmailの場合は送信者名とEmailアドレスの両方を表示
  If InStr(strSenderEmailAddress, "@") Then
     strSenderName = strSenderName + "<" + strSenderEmailAddress + ">"
  Else
 '送信者のメールアドレスがExchangeの場合はSMTPアドレスを取得
     strSenderEmailAddress = _
     objMail.Sender.PropertyAccessor.GetProperty("http://schemas." _
     & "microsoft.com/mapi/proptag/0x39FE001E")
  End If
 End If
'
'[スパムフィルタ]
'
'スパムリスト(送信者のEmailアドレス)の取込
Open strSpamFile1 For Input As #1
Do Until EOF(1)
 Line Input #1, buf
 strSpamList1 = strSpamList1 + buf
 strSpamList1 = Replace(strSpamList1, vbCrLf, "")
Loop
Close #1
'
'スパムリスト(表題)の取込
Open strSpamFile2 For Input As #1
Do Until EOF(1)
 Line Input #1, buf
 strSpamList2 = strSpamList2 + buf
 strSpamList2 = Replace(strSpamList2, vbCrLf, "")
Loop
Close #1
'
'表題の先頭部分を抽出(デフォルトは5文字)
strShortSubject = Mid(strSubject, 1, 5)
'
'スパム確認(送信者のEmailアドレス)
If InStr(strSpamList1, strSenderEmailAddress) > 0 Then
 Exit Sub
Else
End If
'
'スパム確認(表題)
If InStr(strSpamList2, strShortSubject) > 0 Then
 Exit Sub
Else
End If
'
'[メッセージの作成]
'
'受信メールをOFTとして保存しOFTから新規メッセージを作成
 strFileName = Environ("TEMP") & "~forward.oft"  '受信メールをOFTとして保存
 objMail.SaveAs strFileName, olTemplate
 Set fwMail = Application.CreateItemFromTemplate(strFileName)    'メッセージを作成
'
'元メールから宛先を削除
 With fwMail.Recipients
  For i = .Count To 1 Step -1
          .Remove i
  Next
 End With
'
'元メールから添付ファイルを削除
 With fwMail.Attachments
  For i = .Count To 1 Step -1
          .Remove i
  Next
 End With
'
'トリガー送信先アドレスを宛先に設定
fwMail.To = ForwardToAddress
'
'[通知のOn/Offのリモート操作]
'
'特定の送信者から特定の表題のメールを受信した時にマクロをOn/Offし通知先に通知
'
If strSubject = "通知中断" Then
 If strSenderEmailAddress = MailStopAddress Then
    'バッチファイルを起動
    Shell strStopPushFile, 0
    '通知の件名を作成
    fwMail.Subject = "リモート操作によりPush通知を中断しました。"
    '本文を空白に
    fwMail.Body = ""
    '通知を送信
    fwMail.Send
    Exit Sub
 Else
 End If
Else
End If
'
If strSubject = "通知再開" Then
 If strSenderEmailAddress = MailStopAddress Then
    'バッチファイルを起動
     Shell strStartPushFile, 0
    '通知の件名を作成
    fwMail.Subject = "リモート操作によりPush通知を再開しました。"
    '本文を空白に
    fwMail.Body = ""
    '通知を送信
    fwMail.Send
    Exit Sub
 Else
 End If
Else
End If
'
'[通知のOn/Off状態の確認]
'
strStatus = Dir(strStatusFile)
If strStatus = "" Then
 Exit Sub
Else
End If
'
'[表題と本文を加工して送信]
'
'本文から余計な空白と改行コードを削除
strRepBody = Replace(strBody, " ", " ")
strRepBody = Replace(strRepBody, vbCrLf, " ")
strRepBody = Replace(strRepBody, "  ", " ")
'
'本文の文字数を制限(デフォルトは100文字)
strShortBody = Mid(strRepBody, 1, 100)
'
'件名に件名、送信者名、本文を表示
fwMail.Subject = strSubject & " " & strSenderName & " " & strShortBody
'
'本文を空白に
fwMail.Body = ""
'
'通知メールを送信
fwMail.Send
'
ErrorTrap:
'
End Sub
 

【2】リモート操作用ファイル

特定の送信者(マクロ内で指定)からの特定の表題(通知中断/通知再開)のリモートメールで通知をOn/Offする際に使います。

PC上でバッチファイルをクリックして通知をOn/Offする事も出来ます。

以下の3個のファイルをマクロ内で指定したフォルダ内に保存しておいて下さい。

1) Stop_Pushing.bat

cd/
cd C:\環境に合わせて書き換えてください\IFTTT\
ren Push_is_On_Now.txt Push_is_Off_Now.txt

2) Start_Pushing.bat

cd/
cd C:\環境に合わせて書き換えてください\IFTTT\
ren Push_is_Off_Now.txt Push_is_On_Now.txt

3) Push_is_On_Now.txt

このファイルは中身は空で構いません。

【3】スパムフィルタ用ファイル

以下の2つのテキストファイルをANSI形式で保存してマクロ内で指定したフォルダ内に置いて下さい。

1) spamlist.txt

Androidに通知を送る必要のないメールの送信者のメールアドレスを記入します。

送信者名等のメールアドレス以外の記述や改行等が含まれていても問題ありません。

2) keyword.txt

Androidに通知を送る必要のないメールの表題を記入します。

但し、表題の冒頭部分(デフォルトは5文字)しか照会しませんので、注意して下さい。

【4】 IFTTT側の設定

IFTTTへのトリガーメールでPushBulletに通知を送るように設定しておきます。


当方の環境下では以下の様に"Message"に"Body"を指定してもPushbulletには本文は送られませんので、必要な情報は全て表題として送信するようにOutlookのマクロ側で加工しています。


【5】通知のOn/Off切り替え用のショートカット

通知のOn/Offをリモート操作で設定するのメール(定型文)は以下のアプリを使って簡単に作成・送信出来るようにしています。


定型文+アプリ起動(定型文メール作成)

判りやすい様にTaskerでアイコンと名称を変更したランチャを作成して使用しています。


Tasker(カスタマイズツール)


0 件のコメント:

コメントを投稿