Outlook で ESC キーを無効にする方法

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


お世話になります。いつも有用かつ豊富な情報のご提供をいただき、ありがとうございます。
ドラフトの作成途上で誤って Escapeキーを押してしまい、メールを消失することを避けたいです。
Escapeを押した時点で、「変更を保存しますか」と聞かれますので、ここで[はい]ボタンを押せば問題ないのですが、つい誤って、[いいえ]を押してしまい、メールを消失することのないように
マクロで制御することはできませんでしょうか。
オプションでの自動保存は1分に設定していますが、運悪くこの狭間で大きな変更を行ったメールを消してしまうことを何度も経験しました。
よろしくお願いいたします。


ご要望の動作をマクロで実装するとなると、アイテム単位のイベントを使用する必要があり、かなり面倒なことになります。
しかし、単に ESC キーを無効にするというだけなら、マクロではなくても実現は可能です。

Office 製品のグループ ポリシーには DisabledShortcutKeysList という設定があり、これを設定すると特定のショートカット キーを無効にすることができます。
例えば、Outlook で ESC キーを無効にするには以下の設定を行います。

キー: HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Office\16.0\Outlook\DisabledShortcutKeysList
名前: KeyMod1
種類: REG_SZ
データ: 27,0

データの “27” は ESC キーのキャラクター コードを表し、”,0″ は SHIFT や CTRL は使用しないことを意味します。
なお、この設定で無効化できるのはあくまでも Outlook における ESC キーのショートカットのみであり、Outlook 以外のアプリケーションや、Outlook であっても文字入力中の ESC キーなどは無効になりません。

OST ファイルのサイズを小さく保つためには

Outlook をキャッシュ モードを使用していると、ユーザー プロファイルに含まれる OST ファイルが徐々に大きくなっていきます。
VDI 環境などでユーザー プロファイルの領域に制限がある場合や、ローカル ディスクのサイズが小さい場合には、OST ファイルのサイズを制限したくなるでしょう。
そこで、「OST ファイルのサイズを制限する」というようなキーワードで検索すると、以下のページが見つかります。

Outlook の .pst ファイルと .ost ファイルの両方のサイズ制限を構成する方法 – Microsoft サポート

ところが、このページに記載の方法でサイズを制限した場合、OST ファイルのサイズがその制限にかかると、メールの送受信ができなくなってしまいます。
というのも、OST ファイルのサイズ制限に達した際の Outlook の動作は、古いアイテムを削除するという動作ではなく、単にデータの書き込みを拒否するというものだからです。
したがって、OST ファイルのサイズを増やさないようにするには、キャッシュされるデータを減らすしかないのです。

例えば、以下のような方法でキャッシュされるデータを減らすことが可能です。

  • キャッシュされる期間を短くする
  • [共有予定表の強化を有効にする] をオフにする
  • [共有フォルダーをダウンロード] をオフにする
  • 参照する共有予定表の数を減らす

なお、上記の設定を変更しても、すぐには OST ファイルのサイズは減らず、Outlook の動作中にアイドル時間で少しずつサイズが小さくなっていきます。
もし、すぐにサイズを減らしたい場合は、[Outlook データ ファイルの設定] の [今すぐ圧縮] により圧縮する必要があります。
詳細は以下のページを参照してください。

メールボックスと Outlook データ ファイル (.pst および .ost) のサイズを小さくする – Microsoft サポート

Outlook 2016 以降でメールを送信すると添付ファイルが消えたり、WINMAIL.DAT というファイルになる問題

以前、Outlook 2010/2007/2003 でメールを送信すると添付ファイルが消えたり、WINMAIL.DAT というファイルになる問題というタイトルで公開していた現象について Outlook 2016 以降に対応したものを再度掲載します。

Outlook でメールを送信した場合によく発生するトラブルとして以下のようなものがあります。

  • Outlook 以外で受信すると添付ファイルがなくなる。
  • 添付ファイルをつけていないのに、WINMAIL.DAT というファイルがつく。
  • 添付ファイルが WINMAIL.DAT というファイルに置き換わってしまい開けない。

これらはすべて Outlook が Transport Neutral Encapsulation Format (以下、TNEF) というフォーマットによりメールを送信することで発生しています。
この記事では、TNEF の概要と使われる条件、回避策について記述しています。

TNEF の概要

TNEF とはメールの送受信に使われるプロトコルに依存せず (Transport Neutral) に、Outlook の処理に必要なデータをカプセル化 (Encapsulation) して送信する形式 (Format) のことであり、カプセル化されたデータは WINMAIL.DAT というファイル名で添付されます。受信側が Outlook (Outlook Express ではなく Office シリーズの Outlook) や Exchange Server を使用していた場合、この WINMAIL.DAT をデコードすることで、Outlook 固有のさまざまな機能やプロパティを正しく送信することが可能になります。

しかし、添付ファイルのデータも WINMAIL.DAT にカプセル化されてしまうため、TNEF を認識できないメールソフトで受信した場合には添付ファイルが WINMAIL.DAT に置き換わったように見えます。
また、一部のメール プログラムは WINMAIL.DAT を解読できないことがわかっているため、その添付ファイルを無かったものとしてしまい、添付ファイルを表すマークすら表示しません。
そのため、「添付ファイルが削除された」と勘違いされる方もいますが、実際には添付ファイル自体は削除されず残っているので、スクリプトを使えば添付ファイルを取り出すことが可能です。

なお、この現象は Outlook の不具合と受け止められることが多いのですが、基本的には Outlook 固有の機能を使った場合にデータの損失を防ぐための仕様になります。

TNEF が使われる条件

では、どのような場合に TNEF になってしまうのでしょうか?
TNEF は以下のような場合に使用されます。

  1. Outlook のリッチテキスト形式をメールを作成した場合
    インターネットで一般的に使用されている本文のフォーマットはテキスト形式または HTML 形式であるため、Outlook のリッチテキスト形式で作成されたメールは TNEF で送信するか、HTML 形式などに変換する必要があります。
    既定では自動的に HTML 形式に変換されるのですが、HTML 形式に変換できないデータが含まれている場合には TNEF で送信されます。たとえば、ページの色や Excel の埋め込みオブジェクトなどが変換できないデータになります。
  2. あて先や Cc などに指定した受信者のアドレスのプロパティで [インターネット メール形式] が [Outlook リッチ テキスト形式で送信] になっている場合
    メールの形式をテキストや HTML にしたとしても、アドレスのプロパティで [Outlook リッチ テキスト形式で送信] が選択されている場合、その受信者には TNEF で送信されます。この場合、受信者が Outlook を使っていると送信者が作成した形式で表示されます。たとえば、HTML 形式のメールをこのオプションで送信した場合、受信者が Outlook を使っていれば HTML 形式で表示され、Outlook 以外であればテキスト形式で表示されます。
    既定では [インターネット メール形式] は [最適な送信形式を自動的に選択する] になっているはずですが、TNEF で送信されたメールに返信したり、Exchange 環境で Exchange のアドレス帳からあて先を選択した場合に、リッチテキスト形式で送信するような設定となっている場合があります。
  3. メールに特殊なプロパティが設定されていた場合
    メール フォームをカスタマイズしていたり、OFT や MSG として保存したメールをテンプレートとしてメールを作成したような場合に、通常設定されないプロパティが設定されることがあり、このような場合も TNEF が使われます。たとえば、投票ボタンを設定すると TNEF で送信されます。
    なお、アドインなどにより意図せずプロパティが設定されることもあり、そのようなプロパティが設定されているかどうかを確認することは困難です。

注意しなければならないのは、2. や 3. の条件に合致するとメールの形式をリッチテキスト形式以外にしても TNEF 形式になることがあるという点です。

TNEF が送信される現象の回避策

回避策はメール アカウントとしてインターネット アカウントを使用している場合と、Exchange サーバーを使用している場合で異なります。

POP/IMAP のようなインターネット アカウントを使用している場合

インターネットのアカウントを使用している場合は、以下のようなレジストリを設定することで、どのような場合でも TNEF を使用しないよう強制することができます。

レジストリ キー: HKEY_CURRENT_USER\Software\Microsoft\Office\16.0\Outlook\Preferences
データの名前: DisableTNEF
データの種類: DWORD
データの値: 1

レジストリ操作が不安だという方は、上記の設定を行うスクリプトを作成しましたので、下記のリンクをクリックして VBS ファイルをダウンロードし、こちらを実行してください。

DisableTNEF2016.vbs

Exchange サーバーを使用している場合

Exchange サーバーではサーバー側の設定により TNEF での送信を完全に禁止することができます。設定はリモート ドメイン単位で行えるため、Exchange サーバーを使用している組織には TNEF での送信を許可し、それ以外には TNEF での送信を禁止するということも可能です。

リモート ドメインでの TNEF 設定の詳細については、以下の URL を参照してください。

Set-RemoteDomain (ExchangePowerShell) | Microsoft Docs

回避策による副作用

上記の設定を行って TNEF での送信を無効にすると、以下のような制限事項が発生しますので、ご注意ください。

  • 投票ボタンの機能が使用できない。
  • 仕事の依頼ができない。
  • Outlook 2002 以前の Outlook に会議出席依頼を送信しても、テキスト形式の通常のメッセージになる。
  • カスタムフォームが送信できない。
  • Excel ワークシートの一部などを OLE オブジェクトとして埋め込んで送信することができない。

参考情報

Outlook 2007 および 2010 でメールを送信すると、受信者側に Winmail.dat というファイルが添付される (microsoft.com)

メールのメッセージ形式が Outlook のインターネット メールのメッセージに与える影響 (microsoft.com)

Outlook フラグ活用ガイド: 受信メールにフラグとアラームを設定するマクロ

Outlook の自動仕分けルールを使うと、受信したメールのフラグをつけることが可能ですが、アラームを設定することができません。
また、件名に含まれるキーワードでフラグをつけるようにしていると、返信が繰り返されるたびにフラグが設定されてしまいます。

そこで、メールの受信時に特定の条件に合致すると、その条件に応じてフラグとアラームを設定し、同じスレッドのメールがある場合はそれらのフラグをクリアするマクロを作成しました。

重要なメールは受信してすぐにアラームを出し、それほど重要でない場合はちょっと時間をおいてアラームを出すようにしています。
また、営業時間外にメールを受信した場合は翌営業日の朝にアラームを設定します。
必要に応じて条件を追加・削除したり、アラームまでの時間を調整したりしてください。

なお、ワンクリックでフラグのアラームを設定するマクロ を使用している場合は赤字のコードが重複するので、これを取り除いてコピーしてください。

'
Const START_TIME = " 9:00"
Const END_TIME = " 17:00"

Const START_HOUR = 9
Const END_HOUR = 17
'
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
     Dim objItem As Object
     '
     Set objItem = Session.GetItemFromID(EntryIDCollection)
     If objItem.MessageClass = "IPM.Note" Then
         Dim mlItem As MailItem
         Set mlItem = objItem
         CheckAndFlag mlItem
     End If
End Sub
' アイテムの内容に応じてフラグをセットする
Public Sub CheckAndFlag(ByRef objItem As MailItem)
     Dim oneRec As Recipient
     ' 重要度が高なら 5 分後
     If objItem.Importance = olImportanceHigh Then
         MarkAsTask objItem, 5
         Exit Sub
     End If
     ' 件名が重要、緊急などの文字列で始まっていたら 5 分後
     Dim arrUrgent As Variant
     Dim strUrgent As Variant
     arrUrgent = Array("重要*", "緊急*", "至急*", "大至急*")
     For Each strUrgent In arrUrgent
         If objItem.Subject Like strUrgent Then
             MarkAsTask objItem, 5
             Exit Sub
         End If
     Next
     ' 特定の差出人からのメールは 10 分後
     Dim arrSender As Variant
     Dim strSender As Variant
     arrSender = Array("Manager Name", "Manager Name2")
     For Each strSender In arrSender
         If objItem.SenderName = strSender Then
             MarkAsTask objItem, 10
             Exit Sub
         End If
     Next
     ' 自分宛てのメールは 15 分後
     For Each oneRec In objItem.Recipients
         If oneRec.Address = Session.CurrentUser.Address Then
             ' 重要度が低ならアラームは設定しない
             If objItem.Importance = olImportanceLow Then
                 Exit For
             End If
             MarkAsTask objItem, 15
             Exit Sub
         End If
     Next
     ' 件名に特定の文字列を含むメールは 60 分後
     Dim arrProject
     Dim strProject
     arrProject = Array("*ProjectA*", "*ProjectB*", "*ProjectC*")
     For Each strProject In arrProject
         If objItem.Subject Like strProject Then
             MarkAsTask objItem, 60
             Exit Sub
         End If
     Next
End Sub
' 分単位でアラームを設定する処理
Sub MarkAsTask(objItem As MailItem, iTime As Integer)
     On Error Resume Next
     Dim w
     Dim dtRemind
     Dim h
     Dim strTime
     ' スレッドの他のメールのフラグをクリア
     ClearFlagsOnConversation objItem
     '
     With objItem
         ' 今日の曜日を取得
         w = Weekday(Now)
         ' 土日に受信したメールについては月曜日の業務開始時間
         If w = vbSaturday Then
             dtRemind = DateAdd("d", Now, 2)
             strTime = START_TIME
         ElseIf w = vbSunday Then
             dtRemind = DateAdd("d", Now, 1)
             strTime = START_TIME
         Else
             ' 現在の時刻を取得
             h = Hour(Now)
             If h < START_HOUR Then
             ' 業務開始前に受信したメールは業務開始時
                 dtRemind = Now
                 strTime = START_TIME
             ElseIf h >= END_HOUR Then
             ' 業務終了後に受信したメールは翌日
                 strTime = START_TIME
                 If w = vbFriday Then
                     ' 金曜日なら月曜日に
                     dtRemind = DateAdd("d", 3, Now)
                 Else
                     dtRemind = DateAdd("d", 1, Now)
                 End If
             Else
                 ' 現在時刻に指定された分を追加
                 dtRemind = DateAdd("n", iTime, Now)
                 ' アラームが業務終了後になるなら、業務終了時に
                 If h >= END_HOUR Then
                     strTime = END_TIME
                 Else
                     strTime = " " & FormatDateTime(dtRemind, vbShortTime)
                 End If
             End If
         End If
         dtRemind = FormatDateTime(dtRemind, vbShortDate) & strTime
         MarkAsTaskCore objItem, olMarkToday, dtRemind
     End With
End Sub
' スレッドの全てのメールのフラグをクリア
Private Sub ClearFlagsOnConversation(objItem As MailItem)
     Dim objConv As Conversation
     Dim colRootItems As SimpleItems
     Dim objRootItem As Object
     Set objConv = objItem.GetConversation
     Set colRootItems = objConv.GetRootItems()
     For Each objRootItem In colRootItems
         ClearFlagsRecursive objRootItem, objConv
     Next
End Sub
' 再帰的にフラグをクリアする
Private Sub ClearFlagsRecursive(objRootItem As Object, objConv As Conversation)
     Dim colItems As SimpleItems
     Dim objItem As Object
     Set colItems = objConv.GetChildren(objRootItem)
     If colItems.Count > 0 Then
         For Each objItem In colItems
             If TypeName(objItem) = "MailItem" Then
                 ClearFlagsRecursive objItem, objConv
             End If
         Next
     End If
     With objRootItem
         If .IsMarkedAsTask Then
             .ClearTaskFlag
             .Save
         End If
     End With
End Sub

' フラグ設定の共通処理
Private Sub MarkAsTaskCore(ByVal objItem As Object, mkInt As OlMarkInterval, ByVal dtRemind As Date)
     Dim dtDue As Date
     dtDue = FormatDateTime(dtRemind, vbShortDate)
     With objItem
         .MarkAsTask mkInt
         .FlagStatus = olFlagMarked
         .FlagRequest = "ご確認ください"
         .TaskStartDate = Now
         .TaskDueDate = dtDue
         .ReminderTime = dtRemind
         .ReminderSet = True
         .Close olSave
     End With
End Sub

マクロの登録方法やメニューへの追加について

Outlook フラグ活用ガイド: ワンクリックでフラグのアラームを設定するマクロ

Outlook でフラグを設定する方法はマイクロソフトのサポート技術情報の「カテゴリ、フラグ、リマインダー、色を設定する」で説明されていますが、アラームを設定するには数回クリックする必要があります。

そこで、ワンクリックでアラームを設定できるようにするマクロを作成しました。

以下のそれぞれのマクロをリボンやクイック アクセス ツールバーに登録しておくことで、メッセージ一覧で選択したメールにフラグとアラームを設定できます。

名前 動作
FollowSelected1Hour 現在時刻から 1 時間後にアラーム
FollowSelected2Hours 現在時刻から 2 時間後にアラーム
FollowSelected3Hours 現在時刻から 3 時間後にアラーム
FollowSelectedByEndOfTheDay その日の業務終了直前にアラーム
FollowSelectedByTomorrow 翌日の業務開始時にアラーム
FollowSelectedByEndOfWeek その週の金曜日にアラーム
FollowSelectedByNextWeek 一週間後にアラーム
FollowSelectedSpecified アラームの日時を入力して設定

マクロは以下のようになります。

'
Const START_TIME = " 9:00" ' 業務開始時刻を指定 (時刻の前にスペースが必要)
Const END_TIME = " 17:00" ' 業務終了時刻を指定 (時刻の前にスペースが必要)
' 1 時間後にアラーム
Public Sub FollowSelected1Hour()
     FollowSelectedHoursCore 1
End Sub
' 2 時間後にアラーム
Public Sub FollowSelected2Hours()
     FollowSelectedHoursCore 2
End Sub
' 3 時間後にアラーム
Public Sub FollowSelected3Hours()
     FollowSelectedHoursCore 3
End Sub
' 数時間後にアラーム設定する共通処理
Private Sub FollowSelectedHoursCore(iHour As Integer)
     On Error Resume Next
     Dim objItem 'As MailItem
     Dim dtRemind As Date
     dtRemind = DateAdd("h", iHour, Now)
     For Each objItem In ActiveExplorer.Selection
         MarkAsTaskCore objItem, olMarkToday, dtRemind
     Next
End Sub
' その日の終わりにアラーム
Public Sub FollowSelectedByEndOfTheDay()
     On Error Resume Next
     Dim objItem 'As MailItem
     Dim dtRemind As Date
     dtRemind = FormatDateTime(Now, vbShortDate) & END_TIME
     For Each objItem In ActiveExplorer.Selection
         MarkAsTaskCore objItem, olMarkToday, dtRemind
     Next
End Sub
' 翌日にアラーム (金曜日なら月曜日に設定)
Public Sub FollowSelectedByTomorrow()
     On Error Resume Next
     Dim objItem 'As MailItem
     Dim dtRemind As Date
     If Weekday(Now) = 6 Then
         dtRemind = DateAdd("d", 3, Now)
     Else
         dtRemind = DateAdd("d", 1, Now)
     End If
     dtRemind = FormatDateTime(dtRemind, vbShortDate) & START_TIME
     For Each objItem In ActiveExplorer.Selection
         MarkAsTaskCore objItem, olMarkTomorrow, dtRemind
     Next
End Sub
' 今週中にアラーム
Public Sub FollowSelectedByEndOfWeek()
     On Error Resume Next
     Dim objItem 'As MailItem
     Dim dtRemind As Date
     If Weekday(Now) <= 6 Then
         dtRemind = DateAdd("d", 6 - Weekday(Now), Now)
     Else
         dtRemind = DateAdd("d", 12 - Weekday(Now), Now)
     End If
     dtRemind = FormatDateTime(dtRemind, vbShortDate) & START_TIME
     For Each objItem In ActiveExplorer.Selection
         MarkAsTaskCore objItem, olMarkTomorrow, dtRemind
     Next
End Sub
' 一週間後にアラーム
Public Sub FollowSelectedByNextWeek()
     On Error Resume Next
     Dim objItem 'As MailItem
     Dim dtRemind As Date
     dtRemind = FormatDateTime(DateAdd("d", 7, Now), vbShortDate) & START_TIME
     For Each objItem In ActiveExplorer.Selection
         MarkAsTaskCore objItem, olMarkNextWeek, dtRemind
     Next
End Sub
' 任意の日時にアラーム
Public Sub FollowSelectedSpecified()
     On Error Resume Next
     Dim objItem 'As MailItem
     Dim dtRemind As Date
     dtRemind = InputBox("アラーム日時:")
     If InStr(dtRemind, ":") = 0 Then
         dtRemind = dtRemind & START_TIME
     End If
     For Each objItem In ActiveExplorer.Selection
         MarkAsTaskCore objItem, olMarkToday, dtRemind
     Next
End Sub
' フラグ設定の共通処理
Private Sub MarkAsTaskCore(ByVal objItem As Object, mkInt As OlMarkInterval, ByVal dtRemind As Date)
     Dim dtDue As Date
     dtDue = FormatDateTime(dtRemind, vbShortDate)
     With objItem
         .MarkAsTask mkInt
         .FlagStatus = olFlagMarked
         .FlagRequest = "ご確認ください"
         .TaskStartDate = Now
         .TaskDueDate = dtDue
         .ReminderTime = dtRemind
         .ReminderSet = True
         .Close olSave
     End With
End Sub

マクロの登録方法やメニューへの追加について

Outlook フラグ活用ガイド: フラグの概要

受信したメールで未処理のものを未読に戻す、というような方法でメールを管理している人はいませんか?
Outlook にはフラグという機能があり、重要なメールや処理が必要なメールにフラグをつけて管理することができます。
他のメール クライアントや Gmail のような Web メールでもフラグやスターという名前でメールに目印をつけることができますが、Outlook のフラグは他にはない様々な特長があります。
今日は Outlook のフラグの特長とそれを使用した活用方法を紹介します。

特長 1: フラグに期限やアラームを設定できる

フラグ付きのメールが多くなってくると、どのメールから処理をすべきかという優先順位付けが必要になってきます。
Outlook のフラグでは期限やアラームを設定することができるので、期限を設定して期限が近いメールから処理したり、期限まで時間があっても早めに取り掛かる必要があるものについては開始すべき時間にアラームを設定するといった方法で優先順位をつけることができます。

特長 2: To Do バーでタスクとともにフラグ付きのメールが表示される

Outlook には To Do バーにタスクを表示する機能がありますが、To Do バーのタスクには、タスク フォルダーのアイテムだけでなくフラグをつけたメールも表示されます。
そのため、To Do バーに予定表とタスクを表示しておけば、今日の予定と今日処理すべきタスクとメールが常に Outlook の右側に表示されるようになります。

特長 3: Microsoft To Do アプリと連携する

Outlook.com や Exchange Online 環境で Outlook を使用している場合、フラグを付けたメールは Microsoft To Do アプリでフラグを設定したメールとして表示されます。
受信トレイ以外のフォルダーに振り分けたメールもまとめて表示されるので、PC が使用できない状況でもスマホの To Do アプリでフラグ付きメールを確認して仕事を進めることができます。

リモートワークが行われるようになり、仕事の依頼をメールで受けることが多くなってきているのであれば、Outlook のメールのフラグとタスクで仕事をまとめて管理することで効率があがるでしょう。
来週はフラグをさらに使いやすくするマクロを紹介します。

メッセージ一覧に差出人のアドレスを表示する方法

Outlook では、メッセージ一覧に表示するフィールドとして [差出人] を選択すると差出人が表示名で表され、アドレスが表示されません。
また差出人アドレスに該当するようなフィールドも一覧にはありません。
そのため、メッセージ一覧に差出人のアドレスを表示するには、以下のような手順が必要となります。

  1. [表示]-[ビューの設定] をクリック

  2. [列] をクリック

  3. [新しい列] をクリック

  4. 以下の通りフィールドを設定し、[OK] をクリック
    名前: 差出人アドレス
    種類:
    式: [電子メール アドレス差出人]

  5. [OK] をクリック

式に追加する文字列の [] は半角文字となることや、「電子メール」と「アドレス差出人」の間には半角スペースが必要となることにご注意ください。

なお、Exchange 環境では差出人が Exchange 組織内にいる場合はアドレスが /O= で始まる Exchange の内部形式 (LegacyExchangeDN) となります。

決まった時間に定型メールを自動生成する方法

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


お世話になっております。
以下を自動的に実行するためのマクロをご教示いただけますと幸いです。
・毎日決まった時間、決まった宛先に、決まった本文・件名のメールを送付する。

また、自動的にではなく、上記のメールを定期的に作成するマクロでも大丈夫です
(あとは、使用者が送信ボタンを押すだけ)
お手数をおかけしますが、どうぞよろしくお願いいたします。


宛先や件名、本文が定型のメールを作成するだけなのであれば、マクロの必要はありません。
まず、Outlook で新規のメールを作成し、宛先や件名、本文を設定したら、[ファイル] の [名前を付けて保存] でファイルの種類として [Outlook テンプレート (*.oft)] を選択し、任意のフォルダーに保存します。
このようにして保存した OFT ファイルをダブルクリックで開くと、定型メールが新規作成されます。

これを毎日決まった時間に自動実行するには、Windows のタスク スケジューラを使用します。
タスク スケジューラで決まった時間に OFT ファイルを開くための設定手順は以下の通りです。

  1. スタートメニューの [Windows 管理ツール] を展開し、[タスク スケジューラ] をダブルクリックで開きます。
  2. [タスク スケジューラ (ローカル)] を右クリックし、[基本タスクの作成] をクリックします。
  3. [名前] と [説明] に適切な文字列を入力し、[次へ] をクリックします。
  4. 曜日に関係なく実行する場合は [毎日] を、平日だけ実行する場合は [毎週] を選択して [次へ] をクリックします。
  5. 翌日以降の実行したい時刻を選択し、[毎週] を選択した場合は実行する曜日のチェックボックスをオンにして [次へ] をクリックします。
  6. [プログラムの開始] を選択して [次へ] をクリックします。
  7. [プログラム/スクリプト] の右の [参照] ボタンをクリックし、Outlook で保存した OFT ファイルを選択して [開く] をクリックします。
  8. [プログラム/スクリプト] に OFT ファイルのフルパス名が含まれていることを確認して [次へ]  をクリックします。
  9. [完了] をクリックします。

プログラムやスクリプトを指定するところで OFT のファイルを指定していますが、OFT がスクリプトになっているわけではなく、ファイル名を指定すると関連付けられたアプリがタスク スケジューラで自動的に実行されるのです。

添付ファイルをパスワード付きの ZIP ファイルに圧縮し、そのパスワードを別のメールで送信するマクロ

最初にお詫びしなければならないのですが、この記事のタイトルは釣りです。すみません。

タイトルにあるようなマクロは技術的には可能なのですが、私のポリシーとして作成しません。
理由は以下の 3 つです。

  • 無意味である
  • セキュリティの低下につながる
  • 受信者側の生産性が低下する

上記の理由について詳細に説明します。

無意味である

添付ファイルを暗号化付きの ZIP ファイルにして送信する理由としては、以下のようなものがあげられると考えられます。

  • メールの経路上での情報漏洩を防ぐ
  • 誤送信してしまった際の情報漏洩を防ぐ

確かに、添付ファイルを暗号化付きの ZIP ファイルとして送信し、パスワードは別途電話や FAX などで送信するということなのであれば、意味があると思われます。
しかし、マクロなどで暗号化処理を自動化し、さらに同じ宛先にメールでパスワードを送信してしまった場合、メールの経路上でも誤送信の送信先でもパスワードが入手出来てしまいます。
パスワードが入手できるなら、ZIP ファイルも開けてしまうため、情報漏洩を防ぐことはできません。
そのため、パスワードの送信までを自動的に行うようなマクロは無意味であると言わざるを得ないのです。

セキュリティの低下につながる

パスワード付きの ZIP ファイルは、メールの経路上では開くことができません。
これは、メールサーバー上でのウイルススキャンなどが行えないということを意味します。
また、最近では機密情報や個人情報の漏洩を防ぐために添付ファイルをスキャンするというようなサービスもありますが、このようなサービスも使えなくなります。
つまり、パスワード付きの ZIP ファイルによる添付が当たり前になると、ウイルスの侵入も情報漏洩も防げなくなる可能性があるということです。

受信者側の生産性が低下する

送信側で自動的にパスワード付きの ZIP ファイルとする場合、ほとんど手間はかかりません。
しかし、受信側では ZIP ファイルのパスワードを別のメールから探さなければいけません。
パスワードのメールが元のメールと同じスレッドになっていれば見つけやすいのですが、パスワードのメールの件名に [パスワード] のような文字列が追加されてしまっていたり、インターネット ヘッダーに References などが適切に設定されていなかった場合、受信側でスレッドが分かれてしまいます。
そのため、受信者が大量にメールを受信しているような場合は、パスワードを見つけるという処理のために数分かかるという可能性もあるのです。
また、Outlook ではメールの添付ファイルの内容も検索対象となるのですが、ZIP ファイルに含まれている添付ファイルはインデックスが生成されず、検索対象となりません。
このようなことにより、受信者側の生産性の低下をもたらします。

なお、これらの理由は私の個人的な見解ではなく、セキュリティの専門家などからも指摘されていることです。
実際、インターネット上で「添付ファイル PPAP」で検索すると、このようなやり方を批判するブログなどが数多く見つかります。

代替案

上記のような理由があっても、「そのまま送信するのは不安」ということがあるのかもしれません。
その場合、クラウド添付をお勧めします。
クラウド添付とは添付ファイルをメールではなく OneDrive のようなクラウド ストレージに保存し、そのリンクを添付ファイルとして送信するものです。
OneDrive の場合、アクセスできるユーザーを制限することが可能となるので、仮にリンクが漏洩してもアクセス権がないユーザーはファイルを開くことはできません。
また、誤ったファイルのリンクを送信していたとしても、アクセス権を取り消せばそれ以降のアクセスは防ぐこともできます。

固定の出席者や場所などを設定した会議出席依頼のテンプレートを作成する方法

テンプレートに自動で今日の日付を設定するマクロのコメントにて以下のご要望をいただきました。


突然すみません。

会議案内の日時をその時に任意で指定したい場合どうマクロを組むのでしょうか?
  送信相手と会議場所は毎回固定です。

ご教授頂けますよう、よろしくお願い致します。


会議出席依頼の出席者や場所などに固定の値を設定するのであれば、マクロを使う必要はありません。
Outlook のカスタム フォームにより実現が可能です。

  1. 予定表を開きます。
  2. [新しい会議] をクリックします。
  3. あらかじめ指定しておきたい出席者と場所などを設定します。
  4. [開発] リボンの [発行]-[フォームの発行] をクリックします。
    ([開発] リボンが表示されない場合はリボンのカスタマイズをして [開発] リボンを表示させてください。)
  5. [フォルダーの場所] で [Outlook フォルダー] を選択します。
  6. 表示名に適切な名前を入力し、[発行] をクリックします。
  7. 作成中のアイテムを破棄します。

このようにして発行したフォームは以下のようにして使用できます。

  1. 予定表で会議を設定したい時間帯を選択します。
  2. [新しいアイテム]-[ユーザー設定フォーム]-[上記で入力した名前] をクリックします。