配信不能レポートに添付されたメッセージの差出人にメッセージを送信するマクロ


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


添付ファイルとして、メール(*.msg)ファイルが付いているメールを受信した時に、その添付msgファイル内のメール送信者に対して、自動で返信する事は可能でしょうか。
「ExchangeServer2003 + Outlook2007」の環境で、配信不能レポート(NDR)が発生した場合に、「原因となったメール」の発信者に補足情報をメール送信できないかと考えています。
ExchangeServerの設定でNDRのコピーを指定アドレスに送信できるので、現在は管理者あてに送信して手作業で都度対応していますが、これを自動化したいのです。
NDRには「原因となったメール」がmsgファイルとして添付されていますので、そこから発信者のメールアドレスを取得して、固定の件名とメッセージを本文にセットして送信できないでしょうか。

この対応専用のメールアカウントを用意できますので、配信不能通知に添付されている「原因メール」の送信者に
自動でメール送信さえできれば、その他は「処理済の配信不能通知」も含めて、全て削除して頂いて結構です。
むしろ、送信済メールも残らない様にして頂けると完璧です。


メッセージに添付された別のメッセージを MailItem オブジェクトとして直接開くことはできませんが、いったんファイルに保存してから OpenSharedItem メソッドにより開くことで、メッセージの情報を取得することが可能です。
以下は、受信したメッセージが配信不能通知だった場合に、元のメッセージの送信者にメールを自動送信し、処理後に受信メッセージなどを含めてすべて削除するサンプル コードです。

' ここをトリプルクリックでマクロ全体を選択できます。
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
    Dim arrEntryID
    Dim strEntryID
    Dim i As Integer
    Dim fldSent
    Dim fldDumpster
    arrEntryID = Split(EntryIDCollection, ",")
    For Each strEntryID In arrEntryID
        NotifyToNDRSender strEntryID
    Next
    ' 送信済みアイテムを削除
    Set fldSent = Session.GetDefaultFolder(olFolderSentMail)
    For i = fldSent.Items.Count To 1 Step -1
        fldSent.Items(i).Delete
    Next
    ' 削除済みアイテム フォルダを空にする
    Set fldDumpster = Session.GetDefaultFolder(olFolderDeletedItems)
    For i = fldDumpster.Items.Count To 1 Step -1
        fldDumpster.Items(i).Delete
    Next
End Sub
Private Sub NotifyToNDRSender(ByVal strEntryID As String)
    Dim repItem As Object
    Dim objFS As Object
    Dim strTemp As String
    Dim orgMail As MailItem
    Dim notifMail As MailItem
    Dim notifRec As Recipient
    ' エントリー ID からアイテムを取得
    Set repItem = Session.GetItemFromID(strEntryID)
    ' 配信不能メッセージは MessageClass が REPORT.IPM.Note.NDR となる
    If repItem.MessageClass = "REPORT.IPM.Note.NDR" Then
        ' 一時ファイルとして添付されたオリジナルのメッセージを保存
        Set objFS = CreateObject("Scripting.FileSystemObject")
        strTemp = objFS.GetSpecialFolder(2) & objFS.GetTempName() & ".msg"
        repItem.Attachments(1).SaveAsFile strTemp
        ' 保存したメッセージからアイテムを作成
        Set orgMail = Session.OpenSharedItem(strTemp)
        ' 通知用のメッセージを作成
        Set notifMail = Application.CreateItem(olMailItem)
        notifMail.Subject = "メール送信エラー" ' 通知メールの件名を指定します。
        notifMail.Body = "メールの送信に失敗しました。"  ' 通知メールの本文を指定します。
        ' オリジナルのメッセージの送信者を宛先に指定
        Set notifRec = notifMail.Recipients.Add(orgMail.SenderEmailAddress)
        notifRec.Resolve
        ' 通知メッセージを送信
        notifMail.Send
        ' 元のメッセージと一時ファイルを削除
        orgMail.Delete
        objFS.DeleteFile strTemp
    End If
    ' 受信メッセージを削除
    repItem.Delete
End Sub

 

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

広告

配信不能レポートに添付されたメッセージの差出人にメッセージを送信するマクロ」への3件のフィードバック

  1. こちらのサイトが大変役立っております。感謝しております。
    しかし、今回、1点どうしてもエラーになってしまい、お知恵をお借りできたらと思い、コメント致します。
    ——
    ‘ 保存したメッセージからアイテムを作成
    Set orgMail = Session.OpenSharedItem(strTemp)
    ——
    ここで「型が違います」と怒られます。
    実は今回、1000件近い配信不能レポートが返され、ほとほと困っております
    エラーもさまざまなので「User Unknown」の配信不能レポートだけを取りたいのですが、
    メール本文を文字列で取り出しても、書式の情報が一緒にあるからか、文字化けしているような状況で、
    User Unknownの文字を検出できません。
    MailItem型でアイテムが出来れば、HTML形式のBodyで、本文を取得すれば
    文字列検索できるような気もするのですが、何しろエラーで、
    object型でアイテムを取得してしまうと、HtmlBodyが認識できずどうにもなりません…
    outlook2010を使用しております。よろしくお願い致します

    • 自己レスですみません。
      orgMail の型を「ReportItem」にしたら、通りました。
      しかし、HtmlBodyプロパティがやはりないので、文字列検索はできません…
      もし何かお知恵がありましたら、教えてください。

      • またまた自己レスでスミマセン
        ReportItemオブジェクトにSaveAsメソッドがあり、
        ここでolTXTを指定することで、テキストファイルに保存できました!
        これで文字列検索ができそうです。
        こちらに書き込むことで、少し落ち着けた気がします。
        ありがとうございました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中