Exchange/Office 365/Outlook.com 環境で NewMailEx が動作しない場合がある


コメントにて以下のご要望をいただきました。


いつも参考にさせていただいております。
  特定の題名のメールを受信した際、自動的にテキスト型に変更しファイルとして保存するためのマクロを作ったのですが、PC立ち上げをしている時にしか動かない問題が発生しました。
  基本、帰宅時はPCの電源を切っているのですが、PCを立ち上げていないときにもメールを受信してしまうようで(Office365だからでしょうか)せっかくのマクロの意味が半分なしていないので、どうにかしたいと考えております。

お知恵がございましたら、ご教示いただければ幸いです。

OSバージョン:Windows 10
  Outlookバージョン:Microsoft Outlook for Office 365 MSO 64 ビット
  よろしくお願いいたします。


通常、メールを受信した際の処理のマクロは NewMailEx イベントで記述しますが、Exchange サーバーに接続する環境 (Office 365 や Outlook.com を含む) では、Outlook を起動していないタイミングで受信したメールについては NewMailEx が実行されません。
これは、Exchange に接続している場合に NewMailEx がサーバーからの新着メールの通知により実行されており、Outlook が接続していない状況で受信したメールについてはサーバーからの新着メールの通知が受け取れないためです。

これを回避するにはメールの受信時に実行するマクロを NewMailEx イベントから起動するのではなく、自動仕分けのルールのアクションにある「スクリプトを実行する」によりマクロを実行します。
ただし、2017 年 5 月以降にリリースされた修正プログラムが適用されている場合、「スクリプトを実行する」を使用するには以下のレジストリ設定が必要となります。

Outlook 2016 のキー: HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Security\
Outlook 2013 のキー: HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Security\
値の名前: EnableUnsafeClientMailRules
値の種類: REG_DWORD
値のデータ: 1

そして、「スクリプトを実行する」で実行するマクロのプロシージャについて以下のような形式で定義します。

Public Sub プロシージャ名(ByRef メール変数名 As MailItem)

ポイントとしては変数名の前に ByRef を付けるということと、変数名の後ろに As MailItem を付けるというものがあります。
これらの指定がない場合、スクリプトを実行するで追加するマクロとして表示されません。

NewMailEx では引数としてアイテムのエントリ ID が指定されますが、マクロで実行されるプロシージャについては受信したメールを格納した MailItem オブジェクト自体が引数として渡されます。
そのため、GetItemFromID によりアイテムを取得するという処理が省略できます。
また、マクロ実行の条件が自動仕分けのルールで指定可能なものである場合、マクロ自体で条件判定を行う必要がないというメリットもあります。

なお、アクションとしてスクリプトの実行を指定したルールはクライアント ルールとなり、Outlook が起動していない場合は動作しません。
そのため、あくまでもマクロの実行自体は Outlook が起動中に実行され、ルールで指定したマクロが Outlook を起動していない状態でサーバーにより実行されるわけではないという点にご注意ください。
また、Outlook が起動していないときに受信したメールのルールは Outlook の起動時にまとめて実行されるので、長期休暇中にルールに合致するメールを大量に受信していたような場合に、Outlook の起動に時間がかかったり、一部のルールが実行されなかったりする可能性があります。
そのため、Outlook を起動していない状態でマクロ処理が必要なメールを多数受信するようであれば、マクロ処理が必要なメールをルールで別フォルダーに移動しておき、受信時ではなく適切なタイミングでフォルダー上のすべてのアイテムにマクロを実行するというようなフローにしたほうが良いかもしれません。

Exchange/Office 365/Outlook.com 環境で NewMailEx が動作しない場合がある」への3件のフィードバック

  1. […] そこで、受信したアドレスごとに異なる条件で受信メールをマクロにより MSG ファイルとして保存する方法で説明したように、条件判定は自動仕分けルールに任せてしまうという手があります。この記事では元のマクロがルールで呼び出せる形になっていましたが、今回の Excel ファイルへの保存マクロはそのままではルールに使用できないので、Exchange/Office 365/Outlook.com 環境で NewMailEx が動作しない場合があるで記載したような書き換えが必要になります。 […]

コメントを残す