受信トレイの返信済みメールをアーカイブ フォルダーに移動するマクロ


未返信のメールを別のフォルダーに移動するマクロ のコメントにて以下のご要望をいただきました。


はじめまして。Outlookで相手のメールに返信した時に返信した元のメールを自動でアーカイブするマクロを作りたいのですが、同じように以下のプロパティをチェックすれば作成可能でしょうか?

PR_ICON_INDEX (メッセージ一覧で表示するアイコンの指定) が 261 (返信アイコン) に変わる

PR_LAST_VERB_EXECUTED (メッセージに対して最後に実行された処理) が 102 (差出人に返信) または 103 (全員に返信) に変わる

当方、送信済みメールも受信ボックスにコピーされるように設定しており、受信ボックスの中を「送信済みメールのコピー=返信待ちメールもしくは自分のメールで終わったメール」「受信メール(未返信)=要返信もしくは相手のメールで終わったメール」のみにするのが目的です。

自分が返信したメールを受信ボックスにコピーするので、返信元のメールはアーカイブに送りたいと考えております。ご助言いただけると助かります。


自分が返信したメールを確認するのであれば PR_ICON_INDEX などでも確認はできますが、これだけだと相手が返信してきたメールが判断できず、「送信済みメールのコピー=返信待ちメールもしくは自分のメールで終わったメール」が実現できないと思われます。
Outlook オブジェクト モデルでは、Conversation オブジェクトを使用してメールのスレッドのツリーを確認できるので、件名が RE: で始まるメールの親 (返信元) のメールをアーカイブに移動するという処理を行えば、ご要望は満たせると思います。
マクロは以下の様になります。

Public Sub ArchiveOldItemInThreads()
     Dim fldInbox As Folder
     Dim fldArchive As Folder
     Dim colItems As Items
     Dim objConv As Conversation
     Dim curItem As Object
     Dim prevItem As Object
     Dim i As Integer
     ' 受信トレイの取得
     Set fldInbox = Session.GetDefaultFolder(olFolderInbox)
     ' アーカイブ フォルダーの取得
     Set fldArchive = fldInbox.Parent.Folders("アーカイブ")
     ' 受信トレイのアイテムを受信日時の降順で並び替え
     Set colItems = fldInbox.Items
     colItems.Sort "ReceivedTime", True
     ' アイテムを一つずつチェック
     For i = fldInbox.Items.Count To 1 Step -1
         Set curItem = fldInbox.Items(i)
         ' 件名が RE: で始まる場合はスレッドのチェック
         If UCase(curItem.Subject) Like "RE:*" Then
             ' Conversation オブジェクトを取得
             Set objConv = curItem.GetConversation()
             ' Conversation より返信元のメールを取得
             Set prevItem = objConv.GetParent(curItem)
             ' 返信元メールが見つかったら
             If Not prevItem Is Nothing Then
                 ' 既にアーカイブ フォルダーに移動されていなければ
                 If prevItem.Parent <> fldArchive Then
                     ' アーカイブ フォルダーに移動
                     prevItem.Move fldArchive
                 End If
             End If
         End If
     Next
End Sub

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

コメントを残す