Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 根据主题中的关键字将已发送邮件复制到文件夹_Vba_Email_Outlook_Outlook 2010 - Fatal编程技术网

Vba 根据主题中的关键字将已发送邮件复制到文件夹

Vba 根据主题中的关键字将已发送邮件复制到文件夹,vba,email,outlook,outlook-2010,Vba,Email,Outlook,Outlook 2010,当我发送主题中包含单词XYZ的电子邮件时,我希望Outlook将该电子邮件复制到XY文件夹中,包括发送日期并标记为已读 我发现两种方法都不起作用: 私有子应用程序\u ItemSend(ByVal项作为对象,取消作为布尔值) 如果TypeName(Item)“MailItem”,则退出Sub “~~>搜索主题 Set ol=New Outlook.Application 设置olns=ol.GetNamespace(“MAPI”) 设置myFolder=olns.GetDefaultFolder

当我发送主题中包含单词XYZ的电子邮件时,我希望Outlook将该电子邮件复制到XY文件夹中,包括发送日期并标记为已读

我发现两种方法都不起作用:

私有子应用程序\u ItemSend(ByVal项作为对象,取消作为布尔值)
如果TypeName(Item)“MailItem”,则退出Sub
“~~>搜索主题
Set ol=New Outlook.Application
设置olns=ol.GetNamespace(“MAPI”)
设置myFolder=olns.GetDefaultFolder(olFolderInbox)收件箱
设置XYFolder=myFolder.Folders(“XY”)'所需的目标文件夹
如果InStr(1,Item.Subject,“XYZ”,vbTextCompare),则
“~~方法A:复制对象~~”
Set CopiedItem=Item.Copy“创建副本”
CopiedItem。将XYFolder的moce副本移动到文件夹

“Set CopiedItem.SendOn=CopiedItem.CreationTime”Item Add在任何文件夹上的作用都是相同的

对于ThisOutlookSession模块:

Option Explicit

Private WithEvents snItems As Items

Private Sub Application_Startup()
    '   default local Sent Items folder
    Set snItems = Session.GetDefaultFolder(olFolderSentMail).Items 
End Sub

Private Sub snItems_ItemAdd(ByVal item As Object) 

    Dim myFolder as Folder
    Dim XYFolder as Folder
    Dim CopiedItem as mailitem

    If TypeName(item) = "MailItem" Then

        Set myFolder = Session.GetDefaultFolder(olFolderInbox) ' inbox 
        Set XYFolder = myFolder.Folders("XY")' desired destination folder

        If InStr(1, Item.Subject, "XYZ", vbTextCompare) Then

            On Error Resume Next
            ' Appears CopiedItem is considered
            '  an item added to Sent Items folder
            ' Code tries to run more than once.
            ' It would be an endless loop
            '  but that item has been moved.
            '
            ' Skip all lines on the second pass.
            Set CopiedItem = item.copy ' create a copy
            CopiedItem.UnRead = True
            CopiedItem.Move XYFolder ' move copy to folder
            On Error GoTo 0

        End If

    End If

ExitRoutine:
    Set myFolder = Nothing
    Set XYFolder = Nothing
    Set CopiedItem = Nothing

End Sub

如果在“已发送邮件”文件夹中不需要副本,只需设置
MailItem.SaveSentMessageFolder
属性-Outlook将在发送邮件后将其移动到该文件夹中

试试这个

Sub CopyMailFromSentFolder()
    Dim oNS As Outlook.Namespace
    Dim oDefaultFolder As Outlook.MAPIFolder
    Dim oSentFolder As Outlook.MAPIFolder
    Dim oDestinationFolder As Outlook.MAPIFolder
    Dim oItems As Outlook.Items
    Dim oDestItems As Outlook.Items
    Dim oItemToCopy As MailItem
    Dim intCounter, intSecCounter As Integer
    Dim bolItemFound As Boolean

    Set oNS = GetNamespace("MAPI")
    Set oDefaultFolder = oNS.GetDefaultFolder(olFolderInbox)
    Set oSentFolder = oNS.GetDefaultFolder(olFolderSentMail)
    Set oItems = oSentFolder.Items

    For intCounter = 1 To oItems.Count
        If InStr(1, oItems(intCounter).Subject, "testing") > 0 Then 'And oItems(intCounter).Unread = True Then

            Set oDestinationFolder = oDefaultFolder.Folders("Just Testing")
            Set oDestItems = oDestinationFolder.Items
            bolItemFound = False

            For intSecCounter = 1 To oDestItems.Count
                If oDestItems(intSecCounter).Subject = oItems(intCounter).Subject And oDestItems(intSecCounter).SentOn = oItems(intCounter).SentOn Then
                    bolItemFound = True
                    Exit For
                End If
            Next
            If Not bolItemFound Then
                Set oItemToCopy = oItems(intCounter).Copy
                oItemToCopy.Move oDestinationFolder
                Set oItemToCopy = Nothing
            End If
            Set oDestinationFolder = Nothing
            Set oDestItems = Nothing

            'oItems(intCounter).Unread = False
        End If
    Next

    Set oNS = Nothing
    Set oDefaultFolder = Nothing
    Set oSentFolder = Nothing
    Set oItems = Nothing

End Sub

这应该避免复制重复项。尝试将其添加到应用程序\u ItemSend。不确定它是否会减慢发送过程,但它会给您所需的结果

根据尼顿的回答,我更改了代码,以便它可以处理多个文件夹。为CnP做好准备。感谢所有的贡献者

Option Explicit

Private WithEvents snItems As Items

Private Sub Application_Startup()
    '   default local Sent Items folder
    Set snItems = Session.GetDefaultFolder(olFolderSentMail).Items
End Sub

Private Sub snItems_ItemAdd(ByVal item As Object)


    Dim myFolder As Folder
    Dim DestinationFolder As Folder     ' desired destination folder
    Dim CopiedItem As MailItem

    If TypeName(item) = "MailItem" Then

        Set myFolder = Session.GetDefaultFolder(olFolderInbox) ' inbox


        If InStr(1, item.Subject, "XYZ", vbTextCompare) Or _
           InStr(1, item.Subject, "BLA", vbTextCompare) Then

            On Error Resume Next
            ' Appears CopiedItem is considered an item added to Sent Items folder
            ' -> Code tries to run more than once.
            ' It would be an endless loop but that item has been moved.
            ' Skip all lines on the second pass.

            'define destination folder
            If InStr(1, item.Subject, "XYZ", vbTextCompare) Then
                Set DestinationFolder = myFolder.Folders("XY")

            ElseIf InStr(1, item.Subject, "BLA", vbTextCompare) Then
                Set DestinationFolder = myFolder.Folders("XBLA")

            End If

            ' copy the send mail to destination folder
            Set CopiedItem = item.Copy ' create a copy
            CopiedItem.Move DestinationFolder ' move copy to folder

            'Debugging
            'Debug.Print "mail w. subject: " & item.Subject & " copied to : " & DestinationFolder

            On Error GoTo 0

        End If

    End If

ExitRoutine:
    Set myFolder = Nothing
    Set DestinationFolder = Nothing
    Set CopiedItem = Nothing

End Sub

是否可以使用Outlook中的规则将电子邮件复制到所需文件夹,然后使用一个仅查看此文件夹的宏将电子邮件标记为未读?@Zac是的,但这种方法消除了将未读邮件作为提醒保存在该子文件夹中的可能性。有点困惑,我以为你想将“XP”文件夹中的电子邮件标记为已读?请澄清,当您使用Outlook规则移动电子邮件时,您无法手动将其设置为读取?这就是问题所在吗?Outlook上有点生锈,但您可能需要在发送后将其从“已发送”文件夹中复制,如果未提取,您可以随时手动设置发送时间。@zac。对,我想把它们标记为已读。当与规则一起复制时,将标记为未读(不需要的结果)。也不希望将该文件夹中的所有电子邮件标记为未读,因为该文件夹中可能有来自其他发件人的一些电子邮件,我希望将其标记为未读,以获取代码。我试过了,但没有成功。我得到一个运行时错误-2147221241(80040107)和类似“客户端操作失败”(德语版本)的东西。调试器指向以下行:Set CopiedItem=item.Copy“创建副本”。不幸的是,我不理解这个问题。但是,只有60%的情况下会出现错误消息。在收到第一条错误消息之前,所有电子邮件都被正确复制。我添加了一个消息框,确认找到了XYZ。在每一条错误消息出现之前,消息框会出现两次(但只有一个副本放在XY文件夹中),此时会为“CopiedItem”调用itemAdd。也许有更优雅的东西,但我发现这个循环被打破了,通常避免在下一个错误恢复。谢谢!这项工作如预期(除了我不想将它们标记为未读-但这是一个简单的编辑)。伟大的我还将发布我的代码,即基于您的代码,处理多个文件夹。太好了,这很有效!谢谢但是,我仍然需要使用规则。。。如果只使用一个宏,而不是两个单独管理的步骤的组合,这将更加优雅。我已经更新了Sub,以从
已发送项目
文件夹中移动项目。我还检查了
未读
,因为当我测试这个时,一旦项目从
已发送项目
文件夹中移动,它将保持为
已读
项目。我把它放在那里作为评论,以防你得到不同的结果,需要将项目标记为
未读
谢谢你的时间!但是有两个缺点:1)子系统仅手动运行(或在启动时,如果调用),2)每次子系统运行时,它都复制相同的电子邮件。因此,您的文件夹将从重复项中爆炸出来;):)我们会到达那里的!。以上更新刚刚意识到您的问题有答案,所以请忽略我的更新。快乐编码