マクロやアドインで送信トレイにあるメールの送信がキャンセルされる

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


はじめて投稿させていただきます。
どうぞ、よろしくお願いいたします。

ThinkPad X230
  Intel Core i7-3520M CPU 2.90 GHz
  RAM 4.00 GB
  Windows 7 SP1 (32 bit)

Outlook 2013

といった環境です。

メールの返信、全員への返信、転送、のときに、
  本文を Plain Text で編集送信できるよう、
  見様見真似で下のようなコードを書きました。

概ねうまく動いているのですが、
1. メール編集
2. 送信ボタン
3. 送信トレイで内容確認
4. 送信ボタン

と、やったときに、送信トレイ内のメール一覧のところで

日付: なし

となり、「送受信」の操作を行っても
  メールが送信されなくなってしまいます。

((各々のメールで送信ボタンを押しても、
すぐにはメールが送信されない設定にして
  あります))

どうも、下のコードの

Private Sub oExpl_SelectionChange()

に、問題があるらしく、

Set oItem = oExpl.Selection.Item(1)
にブレークポイントを入れて、止めておいた状態で

「送受信」の操作

を行うと、メールが送信されます。

ここに、何か条件分岐のコードを入れれば良いように思うのですが、
  見様見真似でありますため、どうすれば良いのか、
さっぱりわかりません。

どうか、ご教示のほど、よろしくお願いいたします。

<<コード省略>>


Private Sub oExpl_SelectionChange() ‘☆どうもここが問題らしいです☆

On Error Resume Next

If oExpl.CurrentFolder.Name = “送信トレイ” Then ‘挿入
Exit Sub ‘挿入
End If ‘挿入

Set oItem = oExpl.Selection.Item(1)

End Sub

で、とりあえず使っております。

上手くいっているようですが、これで、いいんでしょうか。


はい。この対応で問題ありません。

ご質問の動作は、Outlook オブジェクト モデルにより送信トレイにあるアイテムを参照すると、送信処理がキャンセルされるという仕様により発生します。
特定のプロパティにアクセスしたらというようなことではなく、Outlook オブジェクト モデルを使用してアイテムのオブジェクトを取得するという処理をしただけで、送信がキャンセルされます。(ただし、送信トレイのアイテムが送信処理の最中であれば、キャンセルされるのではなくアイテムの取得に失敗します。)

そのため、送信トレイのアイテムは不用意にアクセスしないようにする必要があります。
例えば、アイテムのプレビューなどでも送信がキャンセルされることになるので、送信トレイでは閲覧ウィンドウがオンにできないようになっています。

すでに実装されている「フォルダー名が “送信トレイ” の場合にはアイテムへのアクセスを行わない」という条件分岐でも対応可能ですが、例えば PST にある “送信トレイ” フォルダーではアイテムにアクセスさせたいというような要件があるなら、以下の条件分岐の方が確実でしょう。

If oExpl.CurrentFolder.EntryID = Session.GetDefaultFolder(olFolderOutbox).EntryId Then

広告

送信メールが迷惑メールに振り分けられない方法

コメントにて以下のようなご質問をいただきました。


“たげん”と申します。
マクロによるメール送信で問題にぶつかり、このサイトにたどり着きました。
早速ですが、質問させていただきます。
VBEで、Excelシートの複数のEmailアドレスへ、氏名などを本文に差し込んで順次送信した所、送信先のoutlookで迷惑メールフォルダへ仕分けられました。(テスト送信先はNifty, Gmail, so-net)
OSバージョン:Windows10 Pro
Officeバージョン:Microsoft Office 365 ProPlus -ja-jp
サーバ:Exchange Online
VBEに自己署名入りディジタル証明書をつけても、受信先で迷惑メールになります。
送信先が1000件近くあるので、手でやるのは気が遠くなります。何か対処方法がありましたらご教授願います。
よろしくお願いいたします。


まず、受信側でメールがマクロで生成されたかどうかを判別するようなことはできないため、マクロで送信したからというだけで迷惑メールに振り分けられるということはありません。
おそらくは、送信した文面の内容などで迷惑メールと判断されているものと思われます。
したがって、マクロのデジタル署名も無関係です。

同じデジタル署名でも、S/MIME によるメールの署名であれば、メールの信頼性を高めるために有益かもしれません。
ただし、S/MIME の署名があるからといって迷惑メールとして判定されないかどうかは受信側の迷惑メールフィルターの挙動に依存するので保証はできません。

一般的に迷惑メールとして扱われないために使用される方法としては Sender Policy Framework (SPF) や Sender ID、DomainKeys Identified Mail (DKIM) といった、DNS を使用して送信者の身元を確かめるというような技術を送信側のドメインで実装するというものがありますが、こちらについてはそれ相応の手間がかかります。

また、これらを実装しても受信側で Outlook の迷惑メール設定の「[セーフ リスト] のみ」のようにあらかじめ登録していないアドレスからのメールをすべて迷惑メールに移動するというような設定がされていれば、結局迷惑メールに移動されてしまいます。

そういったわけで、迷惑メールに振り分けられない究極の方法としては、あらかじめ受信者に迷惑メールとして振り分けられないようセーフリストに登録してもらうというものしかないのではないかと思います。

もちろん、そんなことができるなら苦労しないというのは十分承知していますが、それでもそれしか方法はないというのが迷惑メール対策なのです。

Windows 10 Fall Creators Update を適用すると発生する Outlook の問題について

現象

Windows 10 の Fall Creators Update (RS3) を適用すると、環境によっては Outlook で以下のようなトラブルが発生することがあります。

  • Windows Search による検索ができなくなる
  • 人物情報ウィンドウの関連アイテムが表示されなくなる
  • 検索の際にリボンの絞り込みが使えなくなる
  • Word や Excel などでファイルをメールで送信しようとすると MAPI のエラーが発生する
  • サードパーティ製のアプリケーションでメールを送信しようとすると MAPI のエラーが発生する

原因

これらはすべて Windows 10 の Fall Creators Update の適用プロセスにおいて、一部の MAPI 関連レジストリが削除されることが原因となっています。
適用プロセスの不具合であるため、修正プログラムなどでの対応は難しいと考えられます。

回避策

レジストリを復活させれば現象が回避できますが、手作業でレジストリを設定するのは困難であるため、Office の修復セットアップによりレジストリを回復する必要があります。

補足

Office のインストール形式が Click-To-Run である場合、削除されるレジストリとは別のレジストリが参照される動作となるため、この現象は発生しません。

Outlook で画面の表示が乱れる現象が発生する場合の対処方法

 

Outlook を長時間 (環境によっては数時間) 使用し続けると、以下のような現象が発生する場合があります。

  • リボンなどのボタンの表示がされなくなる
  • メールの本文が空白になったり、黒く表示される
  • ナビゲーション ウィンドウのフォルダーが表示されなくなる
  • UI が四角だけで表示される

多くの場合、この現象は画面描画のためのメモリ確保が行えずに発生します。
この記事では、メモリ不足による画面描画を解消するためのいくつかの方法をご紹介します。

OST や PST から不要なアイテムを削除、移動し、使用していない PST をプロファイルから削除する

多くの場合、Outlook では OST や PST というメールを保存するためのファイルを開いています。
これらのファイルは Outlook の起動中には常に開かれた状態となっており、メールの読み書きに伴ってランダムにアクセスされます。
環境によっては一つの OST/PST のサイズが数ギガとなり、さらには複数の PST を同時に開くというようなこともあるでしょう。
そして、現在開いているフォルダーやメールのデータだけでなく、バックグラウンドで処理される動作などによりファイルのデータがメモリ上にキャッシュされ、メモリが大量に使用される動作となります。

したがって、メモリの使用量を抑えるには、普段使用している OST や PST のアイテムの量を減らし、使用していない PST はプロファイルから削除してしまうというものが考えられます。
パフォーマンス上の指標とはなりますが、以下のマイクロソフト技術情報では一つのフォルダーには 10 万アイテム、一つの PST には 500 フォルダーまでが正常な動作範囲というものがあります。

2768656 Outlook performance issues when there are too many items or folders in a Cached mode .ost or .pst file folder

一つのプロファイルあたりどのくらい PST を使えるのかという情報がちょっと見当たらないのですが、結局のところ PST の数というより、すべての PST のサイズを合計してどの程度になるのかという観点で考えたほうが良いかもしれません。

ハードウェア グラフィック アクセラレータを有効にする

Office 2013 以降の Office 製品では、DirectX によるハードウエア グラフィック アクセラレータを使用して画面描画が行われています。
これにより高速な画面描画ができるようになったのですが、一部のアクセラレータで正常な動作が行われない場合があり、[ハードウェア グラフィック アクセラレータを無効にする] をオンにしてアクセラレータを無効にするという方法が問題の対処として実施されている場合があります。
しかし、アクセラレータを無効にすると、画面描画をソフトウェアで実行するため、メモリの使用量が若干増えるようです。

Office 2013 のリリースから 4 年経過し、Office 自体やビデオドライバーの改善により問題が解消されている可能性もありますので、以前何らかの理由で [ハードウェア グラフィック アクセラレータを無効にする] をオンにしていた場合、最新の Office の修正プログラムやグラフィック カードのデバイス ドライバーを適用してアクセラレータを有効にすることで、メモリ消費を抑え、かつ高速に画面描画ができるようになるかもしれません。

高解像度のディスプレイでは DPI を 200% 以上に設定する

最近では高解像度のディスプレイを持つノート PC が普及していますが、このような環境では画面上に表示される情報量が増え、それに伴ってメモリの消費量が増える結果となります。
一例では、1600 x 1200 ピクセルのディスプレイで全画面表示した場合のメモリ消費量が 8 メガバイトあるのに対し、3840 x 2160 ピクセルのディスプレイで全画面表示した場合には 4 倍の 32 メガバイトになったというものがあります。
そのため、高解像度のディスプレイでは DPI を 200% 以上とし、画面に表示される情報量を減らすことでメモリの消費量を抑えることができます。
なお、同様の理由でマルチモニターでの使用や、ウィンドウを多数開くような使用もメモリ消費を増やす原因となりますので、このような使用方法も避けたほうがよいでしょう。

タッチでメッセージのスクロールを行わないようにする

最近のノート PC ではタッチスクリーンが当たり前のようになり、メッセージのスクロールもタッチ操作で行うことができます。
しかし、タッチ操作でスクロールを行うと、メモリの消費が多いという情報があります。
そのため、スクロールはマウスやキーボードで行ったほうが良いようです。

不要なアドインを無効化または削除する

プレインストールで Office がインストールされているような場合、同時にサードパーティ製の Outlook のアドインがインストールされていることがあります。
これらの中には便利なものもあるのですが、最初からインストールされているだけで使ったこともないというようなものもあるでしょう。
不要なアドインを無効化または削除すれば、Outlook のメモリ使用量も抑えることができ、アドインに起因するパフォーマンスの問題なども改善されるかもしれません。

なお、マイクロソフトの Outlook のアドインには以下のようなものがありますが、使用していなければこれらも無効化してかまわないでしょう。

  • Microsoft Exchange Add-in (サーバーが Microsoft Exchange や Outlook.com でなければ不要)
  • Skype Meeting Add-in for Microsoft Office 201X (Skype for Business を使用していなければ不要
  • Microsoft IME Outlook アドイン (連絡先アイテムの姓名フリガナを IME に自動登録しないなら不要)
  • Microsoft SharePoint Server Colleague Import Add-in (SharePoint の連絡先などと同期していないなら不要)
  • OneNote Notes about Outlook Items (メールを OneNote にコピーするような操作を日常的に行っていないなら不要)
  • Microsoft VBA for Outlook AddIn (Outlook のマクロを使用していないなら不要)
  • Outlook Social Connector 2016 (メールの下部に表示される人物情報ウィンドウを使っていないなら不要)

Office 2016/2013 を最新の状態に更新する

Office の共通コンポーネントや Outlook がメールの表示に使用する Word の修正には画面描画やメモリの使用に関する改善が含まれている場合があります。
したがって、Outlook だけでなく、Word や Office の最新の修正プログラムを適用することが現象改善につながるといえます。

さらに、Windows が 64 ビット版で、32 ビットの Outlook 2016 のクリック実行版を使用している場合のみの話ですが、更新チャネルを月次チャネルとして最新の状態 (Version 1709 以降) に更新すると、Outlook 2016 が使用できるメモリの量が 2 ギガバイトから 4 ギガバイトに倍増します。
これは、Windows の Large Address Aware という機能に Outlook 2016 が対応したためです。
通常、Office 2016 をインストールすると、Windows が 64 ビット版であっても、Office アプリケーションは 32 ビット版がインストールされます。
この場合、PC に 2 ギガバイトよりも多いメモリが搭載されていたとしても、32 ビット版のアプリケーションが使用できるメモリの量は最大で 2 ギガバイトに制限されます。
これは、32 ビットの環境では Windows が使用するメモリとして 2 ギガバイトが予約されていることに起因します。
しかし、Windows が 64 ビット版である場合、32 ビット環境で予約されていたメモリ空間をユーザー アプリケーションに開放する Large Address Aware というオプションがあり、Version 1709 以降の Outlook 2016 ではこれが有効となっているので 4 ギガバイトまで使用できるようになったのです。

なお、最新の状態にしても、[ファイル]-[Office アカウント] の 右側の Office ロゴの下のバージョンが 1709 以上にならない場合は、以下のマイクロソフト技術情報の [Download] をクリックして修正プログラムを実行し、更新チャネルを月次チャネルとしてください。

延期チャネルから Office 365 製品ファミリ用の現在のチャネルに切り替える方法

Office 2016 を 64 ビット版に入れ替える

前述の通り、通常は Windows が 64 ビット版であっても Office は 32 ビット版がインストールされます。
これは、アドインやマクロなどが 64 ビットに対応していない状況を考慮したものと思われます。
しかし、マクロやアドインに問題がなければ 64 ビット版にすることで、PC の搭載メモリを十分に活用した処理ができるようになります。
なお、Outlook だけを 64 ビットにするということはできないため、Office 全体をアンインストールし、64 ビット版を再インストールする必要があります。

 

参考情報:

Office 365 ProPlus 更新プログラム チャネルの概要
32-bit Outlook interface elements unexpectedly render in black, white, or blank
Large Address Aware in Outlook 2016

Outlook 2016/2013 でルールによるアプリケーションやマクロの実行ができない

2017 年 5 月以降にリリースされた Outlook 2016 の修正プログラム、または 6 月以降にリリースされた Outlook 2013 の修正プログラムを適用すると、以下のような現象が発生します。

  • アプリケーションやマクロを実行するルールが (エラー) と表示される
  • 新規ルール作成で「アプリケーションを開始する」や「スクリプトを実行する」というアクションが選択肢からなくなる

これは、セキュリティ強化に伴う動作変更です。

ただし、機能が完全に削除されたわけではなく、以下のレジストリ設定を行うことで引き続き「アプリケーションを開始する」や「スクリプトを実行する」というアクションが使用できるようになります。

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

– 参考リンク

How to control the rule actions to start an application or run a macro in Outlook 2016 and Outlook 2013

Outlookを操作するスクリプトを実行すると「Outlook 内に保存されている電子メール アドレス情報がプログラムによってアクセスされようとしています。」と警告が出る現象について

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


outlook2013(office365proplus)です。
ここでいろいろ参考にさせていただいて、予定表をテキストで取り出すvbsを
使っております。
数か月は問題なく使っていたのですが、最近、下記セキュリティのアラートが出るようになりました。
「Outlook内に保存されている電子メールアドレス情報がプログラムによってアクセスされようとしています。なんたら」
数分ごとに実行するようにスケジューリングしているので、事実上アラートが邪魔で使えない状況です。。
いろいろ調べたのですが、「セキュリティセンターの設定でプログラムによるアクセス」を「不審な動作に関する警告を表示しない」にする、というのしか見つかりません。(私は管理者ではないので、この項目を変更できません)
特定のプログラムを許可するようなオプションも見つかりません。
何か対策は無いでしょうか。
最近突然使えなくなったのは何かマイクロソフトで仕様変更したのでしょうか。。


メールアドレスへのアクセスの警告メッセージは、以下のような条件でスクリプトなどにより Outlook のオブジェクト モデルでメールアドレスが含まれるプロパティを参照した場合に表示されます。

  • ウイルス スキャン ソフトがインストールされていない
  • ウイルス スキャン ソフトのパターンファイルが最新でない
  • ウイルス スキャン ソフトのライセンスが切れている

これらのチェックには Windows の機能が使われており、たとえ実際にはウイルススキャンソフトがインストールされていたとしても、Windows のコントロール パネルの [セキュリティとメンテナンス] で [ウイルス対策] が有効で最新の状態になっていなければ Outlook で警告が出ます。
最近出るようになったということなのであれば、単にパターンファイルが最新でないだけではないかとも思いますが、ウイルス スキャン ソフトの状態がどうなっているかをコントロール パネルで確認してみてください。

参考:

電子メール アドレスの情報にアクセスしようとしているか、自分の代わりに電子メールを送信しようとしているプログラムに関する警告が表示される

msg ファイルとして保存しようとするとメモリ不足でエラーになる原因

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


はじめまして。これほど情報量満載のサイトがある
のを知り感動いたしました。
早速質問させて戴きたく。

Outlook2013上で所定フォルダ上のメールメッセージを
SaveAsメソッドによりディスクにmsg形式で保存する
VBAを作成していますが、メールメッセージがmsg形式
の添付ファイルを持つ場合に保存が失敗し、そこで
メモリエラーでプログラムが途中終了してしまいます。
保存の際、ディスク上に16kBのmsgファイルが出来る
のですがサイズがそこから増えることなく、エラー
「処理を実行するためのメモリが不足しています」が
出て、途中終了するとともに、上記ファイルが自動
削除されます。

【試行実験】
・msg形式での保存では、Unicodeの如何を問わず保存不能
・マニュアルで「ファイル~名前をつけて保存(msg形式)」
でも保存不能
・保存不能のケースで、TXT形式での保存は可能
・添付のmsgファイルが壊れていることはおそらくなく、
ダブルクリックで開いてみることが可能。但しそれを
保存することも同じエラーで不能。
・メールメッセージをexplorer上のD&Dしてmsg形式で
保存することは可能

【相談事項】
所定フォルダ上の複数のメールメッセージを1つずつ
msg形式でプログラムで保存したいので、
・最終的には、対象とするメールメッセージを全て保存したい
・不能なメッセージがあってもそこで途中終了せず、次の対象
の保存に取りかかれるようにせめてしたい

【参考】
添付ファイルのmsgが大きなサイズの場合に失敗するようですが、
以下には必ずしもそうでは無く沢山の相手先が設定されていると
失敗するとの話もあるそうです。もはや私には理解が及びません。
https://www.experts-exchange.com/questions/28536821/Outlook-vba-cannot-save-a-large-Msg-file-to-disk-error-2147024882-There-is-not-enough-free-memory.html
https://social.msdn.microsoft.com/Forums/office/en-US/2836370d-33dd-44fe-b480-26edcf1f6859/does-the-saveas-method-in-microsoftofficeoutlookinterop-have-a-maximum-file-size?forum=outlookdev
何卒よろしくお願いいたします。


msg ファイルがメモリ不足で保存できないという現象が発生する場合、ほとんどは msg ファイルで使用されている OLE 複合ファイルという形式の制限に起因して発生しています。

OLE 複合ファイルとは Windows で一つのファイルに様々な情報をオブジェクトという形で保存する形式のファイルです。
多くのファイル フォーマットは、特定のデータを保存するための形式であり、例えばテキスト形式なら文字列データ、JPG 形式なら画像データなどを保存します。
しかし、OLE 複合ファイルについてはどのようなデータでも保存可能とするため、データをオブジェクトという形で複数保存できるようになっています。
実際、Office 2003 までは Word も Excel も PowerPoint も OLE 複合ファイルの形式でファイルを保存しており、Word ファイルの中に Excel データの一部を埋め込んだり、拡張子を削除してもダブルクリックすると適切なアプリケーションで自動的に開いたりできていました。

Outlook も他の Office 製品と同様に OLE 複合ファイル形式で msg ファイルや oft ファイルを保存しており、メールに含まれる受信者や添付ファイルはそれぞれ個別のオブジェクトとしてファイルに格納されています。
また、メールに別のメールを添付しているという場合、添付されたメールも単一のデータではなく、そのメール自体の受信者や添付ファイルが個別のオブジェクトとして保存されます。
そのため、多数の受信者や添付ファイルを含むメールを保存する場合、一つの OLE 複合ファイル内に大量のオブジェクトが生成されるということになります。
しかし、OLE 複合ファイルでは一つのファイル内で同時に開くことができるオブジェクトの数が制限されており、この制限を超えるような書き込みが行われた場合に「メモリ不足」という意味のエラーが発生するのです。

SaveAs で保存できないアイテムを Explorer にドラッグアンドドロップすると保存ができるようですが、この場合はファイルへの書き込みを行うのは Explorer であり、Explorer が何らかの方法で制限を回避しているものと思われます。
(あるいは単にエラーを無視しているだけかもしれません。)

いずれにせよ、残念ながら、マクロで SaveAs により msg ファイルとして保存する場合にマクロの記述方法やレジストリ設定などでこの制限を回避する方法はありません。
このエラーが発生した場合に処理を中断させたくないということであれば、SaveAs の前に On Error Resume Next を実行し、エラーで中断せずに継続させるようにしてください。

参考リンク:

No MSG For You! – SGriffin’s MAPI Internals

[INFO] MSG 複合ファイルへのメッセージの保存

VBA の実行時エラーを処理する