1

編集: 新しい情報: Mailitem.Body の戻り値は "" ですが、実際の値は "アプリケーション定義またはオブジェクト定義のエラー" であることに気付きました。それが何を意味するのかは完全にはわかりませんが、複数のフィールドに表示されることは知っています. 以下にスクリーンショットを含めました.

エラー

特定のプロパティが正しい値を返し、他のプロパティが返さないという問題があります。件名が「件名」、メッセージが「本文」、送信者の電子メール アドレスが「email@address.com」、送信日が 2013 年 6 月 12 日の電子メールの例があります。

次のコードを実行すると:

    Dim ComputerName As String
    Dim ErrorState As String
For Each MailItem In InboxItems
        ComputerName = MailItem.Subject
        'ErrorState = MailItem.Body
        ErrorState = MailBody(MailItem)
        strDate = GetDate(MailItem.SentOn)
        SenderEmail = MailItem.SenderEmailAddress
        If strDate = DateToday And SenderEmail = "email@address.com" Then
            Computers(a, 0) = ComputerName
            Computers(a, 1) = ErrorState
            a = a + 1
        End If
        Debug.Print MailItem.Subject
        Debug.Print MailItem.Body
    Next MailItem

私が取得するのは、ComputerName = "Subject"、ErrorState = ""、SenderEmail = ""、および strDate = "2013/6/12" (この場合は適切な形式です) です。Mailitem の 2 つのプロパティでは適切な値が返されるのに、他の 2 つのプロパティでは返されないのはなぜでしょうか? これは非常に奇妙な問題です。皆さんができる助けをいただければ幸いです。

ここで、コードのコンテキストをさらに追加します。

    Set objOutlook = CreateObject("Outlook.Application", "localhost")
    Set objNamespace = objOutlook.GetNamespace("MAPI")
    Set Inbox = GetFolder("email@address.org/inbox")
    Set InboxItems = Inbox.Items
    InboxItems.SetColumns ("SentOn")

GetFolder は、フォルダ パスでメールボックスを取得する関数です。Outlook で既定の受信トレイを使用していないため、これを行う必要があります。

また、本文が HTML または RTF 形式の場合に備えて、以下で提案されている MailBody 関数を使用してみました。残念ながら、本文は正常であることが証明され、MailItem.Body はそれを取得するはずでしたが、まだ機能していません。メールに本文があることはわかっていますが、MailItem.Body は "" を返します。体はまさにナンバーワンであり、それは私が得るべきものです.

また、メールの送信者は受信者と同じであることに注意してください。つまり、電子メールは、ある電子メール アドレスからそれ自体に送信されました。これが違いを生むかどうかはわかりませんが、念のためそこに置いておくことにしました。

4

1 に答える 1

6

複数のアイテム タイプ

まず、Inbox.Itemsコレクション内のすべての項目が型であるという保証はありませんMailItemAppointmentItem受信ボックスには、 、MeetingItem、およびその他の*Itemタイプのオブジェクトも含まれます。これらのアイテム タイプのすべてに同じプロパティが設定されているわけではありません。型の不一致エラーが発生しないようにするには、反復子変数をジェネリックとして宣言し、型が正しい場合にObjectのみ厳密に型指定された変数に割り当てます。MailItem

Dim oInbox    As Outlook.Folder
Dim oItem     As Object
Dim oMailItem As MailItem

Set oInbox = ActiveExplorer.Session.DefaultStore.GetRootFolder().Folders("Inbox")
For Each oItem In oInbox.Items
    If TypeOf oItem Is MailItem Then
        Set oMailItem = oItem
        ' Do stuff
    Else
        Debug.Print "Skipping " & TypeName(oItem)
    End If
Next

オプションのプロパティ

次に、オブジェクトのすべてのプロパティが設定されるという保証はありません。メール項目が送信されなかった場合、送信者アドレスはなく、本文のない電子メールが存在する可能性もあります。どのプロパティが利用可能で、何が含まれているかを理解するには、[ローカル] ウィンドウ (VBA IDE の [表示] > [ローカル ウィンドウ]) を使用することをお勧めします。以下は、ループ内で一時停止した上記のコードのスクリーン ショットで、oMailItemオブジェクトのプロパティの一部が展開されています。

Outlook VBA IDE のローカル ウィンドウ

本文と HTMLBody

MailItemBodyオブジェクトには、 、HTMLBody、およびの 3 つのボディ プロパティがありRTFBodyます。通常、そのうちの1 つだけが設定されます。メールの形式によって異なります。プロパティをチェックしBodyFormatて、現在のアイテムに適用できるものを見つけることができます。それを使用して、形式に関係なく、MailItem の生の本文を取得する一般化された方法を次に示します。

Public Function MailBody(ByVal MailItem As MailItem) As String
    Select Case MailItem.BodyFormat
        Case OlBodyFormat.olFormatPlain, OlBodyFormat.olFormatUnspecified
            MailBody = MailItem.Body
        Case OlBodyFormat.olFormatHTML
            MailBody = MailItem.HTMLBody
        Case OlBodyFormat.olFormatRichText
            MailBody = MailItem.RTFBody
    End Select
End Function
于 2013-06-12T13:22:00.737 に答える