4

Outlook VBA プログラミングで小さな問題が発生しています。解決策があるかどうか、またはこれが別の "既知の問題" にすぎないかどうかを知りたいです。


コンテキスト:

IMAP 経由で Web メール プロバイダーにアクセスするように Outlook のメール アカウントを構成しました。Outlook では、Web メール フォルダーを正しく表示できます。プロバイダーのスパム フィルターは、スパム メッセージをスパム フォルダーに移動します。

Spam フォルダーに入れられたメッセージを、ローカルの pst ファイル内の別のフォルダーに自動的に移動したいと考えています。

私はそれを99%動作させています(参照用に以下に提供されているコードを使用)。


問題:

Spam フォルダにメッセージがあることがわかります (フォルダ名の横に太字の未読メッセージ数があります) が、ItemAdd はフォルダをクリックしたときにのみ起動します。その時点で、スパム フォルダの内容が表示され、新しいスパムがすべてローカル フォルダに移動さ​​れていることがわかります。

フォルダーをクリックせずにコードを実行するために使用できる、ItemAdd 以外の別のトリガー ソースはありますか? フォルダーの未読数が変化したときにトリガーされるイベントはありますか?


技術的な詳細:

  • Windows 8 OS
  • Outlook 2002 を使用している (はい、わかっています...)
  • 私は経験豊富な C/C++ 開発者ですが、VBA の経験は最小限で、Outlook の経験はありません。

VBA コード:

Public WithEvents myItems As Outlook.Items

Public Sub Application_Startup()

    Dim myNameSpace As Outlook.NameSpace
    Const mailboxName As String = "Mail.com"
    Const subfolderName As String = "Spam"


    ' Reference the items in the MAPI spam folder
    ' Because myOlItems is declared "WithEvents" the ItemAdd event will fire below.
    Set myNameSpace = Application.GetNamespace("MAPI")

    On Error GoTo noSpamFolder
    Set myItems = myNameSpace.Folders(mailboxName).Folders(subfolderName).Items
    On Error GoTo 0

    Exit Sub

noSpamFolder:
    MsgBox "Unable to find folder <" & mailboxName & "/" & subfolderName & ">"

End Sub


Private Sub myItems_ItemAdd(ByVal Item As Object)

    Dim suspectFolder As Outlook.MAPIFolder

    ' Check to make sure it is an Outlook mail message, otherwise
    ' subsequent code will probably fail depending on what type
    ' of item it is.
    If TypeName(Item) = "MailItem" Then

       ' Move message to the 'suspect' folder
       On Error GoTo noSuspectFolder
       Set suspectFolder = Outlook.Session.GetDefaultFolder(olFolderInbox).Folders("suspect")
       On Error GoTo 0

       Item.Move suspectFolder

    End If

    Exit Sub

noSuspectFolder:
    MsgBox "Unable to find folder <suspect> as a sub-folder of default inbox folder"
End Sub
4

2 に答える 2

3

メールアイテムが送信された後に移動し、コードを使用してこのタスクを実行するという同様の問題に苦労していました(thx!)。まだ解決しなければならない問題がいくつかありました。

まず、アイテムが移動されましたが、すぐにゴミ箱フォルダーに配置されました。これは IMAP の問題 (Gmail) であると思われ、メールボックス アカウントのインターネット電子メール設定を [削除済みアイテムをサーバー上の次のフォルダーに移動する] から [アイテムに削除のマークを付けるが、移動しない] に変更することで解決される可能性があります。自動的"。

2 番目の課題は、あなたと同様に、コードをトリガーしてその作業を実行することでした。アカウント設定では、送信済みメールの保存オプションが無効になっています (これは Gmail サーバーによって自動的に実行されるため)。送信済みアイテム (MAPI) フォルダーを送信済みアイテム (IMAP) フォルダーと同期する必要がありました。この電子メール アカウントの「送受信」グループを (すべてのアカウント グループで) 構成し、[送信済みアイテム] フォルダーを選択することで、これを達成しました

これで、同期のためにフォルダーを開く必要なく、このフォルダーが同期されます。これで問題も解決することを願っています。

ピーター

于 2013-11-14T23:31:49.613 に答える
1

これは理にかなっています。Outlook の IMAP プロバイダーは、Outlook オブジェクト モデルを介してフォルダーが選択またはアクセスされた場合にのみフォルダーを同期します。
時々フォルダーをポーリングする以外にできることはあまりないと思います(そしてヒットの間にMAPIFolderオブジェクトを解放します)

于 2013-02-15T00:40:26.077 に答える