excel 回复带有自定义内容的电子邮件,同时保留电子邮件跟踪,运行时错误“287”

3df52oht  于 2023-06-25  发布在  其他
关注(0)|答案(2)|浏览(147)

我想搜索一封电子邮件,用代码strHTML中指定的内容回复,同时保留前一封电子邮件的踪迹latestEmail.HTMLBody
我不能让这两件事同时发生。
如果我包含了指定的回复内容,那么我就失去了之前的对话;否则,我可以保留先前的对话,但不能纳入指定的回复内容。
如果我不包括命令.HTMLBody = strHTML & latestEmail.HTMLBody,那么回复电子邮件将包括以前的电子邮件对话,但我不会有我想在电子邮件中包括的回复内容。
如果我使用上面的命令我得到
运行时错误“287”应用程序定义或对象定义错误
如果我使用.HTMLBody = strHTML代码,我将丢失电子邮件轨道。

'set the subject to serach for
SubjectToSearch = ShEmail.range("b3").Value

'to get the inbox folder
Set outlookapp = CreateObject("outlook.application")
Set outlooknamespace = outlookapp.GetNamespace("MAPI")
Set inboxfolder = outlooknamespace.GetDefaultFolder(6)

Set mailitems = inboxfolder.Items

'sort the emails
mailitems.Sort "ReceivedTime", True

'initialize variables
latestreceivedtiem = DateSerial(2023, 1, 1)

For Each mailitem In mailitems

    If mailitem.Subject = SubjectToSearch Then
        'check if the current email is the latest one
        If mailitem.ReceivedTime > latestreceivedtime Then
            Set latestEmail = mailitem
            
            latestreceivedtime = mailitem.ReceivedTime
            foundEmail = True
        End If
    End If
    
Next mailitem

If foundEmail Then
    Dim ReplyEmail As Object
    Set ReplyEmail = latestEmail.Reply

    With ReplyEmail
        .To = ShEmail.range("B1")
        .CC = ShEmail.range("B2")
        .Subject = "Re: " & latestEmail.Subject

        .HTMLBody = strHTML & latestEmail.HTMLBody
        .Attachments.Add AttachmentPath1
        
        .display
    End With
Else
    MsgBox "no emails found with the subject:" & SubjectToSearch, vbInformation
    
End If

我尝试了.body而不是.HTMLbody,但也不起作用。

6l7fqoea

6l7fqoea1#

您不能将两个HTML字符串连接在一起,并期望返回一个有效的HTML字符串-这两个字符串必须合并:在HTML中搜索"<body",找到下一个">"(它处理带有属性的body标签),然后在">"之后插入HTML。
另外,不要循环遍历文件夹中的所有项目-使用Items.Find/FindNextItems.Restrict
根据上面的内容,这并不重要,但是在找到匹配之后,退出循环而不是继续它-您已经以正确的顺序对集合进行了排序。

5cnsuln7

5cnsuln72#

运行时错误“287”应用程序定义或对象定义错误
您在运行时会得到一个错误,因为代码可能只处理代码中的邮件项示例。请注意,Outlook文件夹可能包含不同的项目类型-文档,约会,笔记等。因此,在访问特定于邮件项的属性之前,您需要确保通过检查类型名称来处理邮件项:

If TypeOf objItem Is MailItem Then
      Set objMailItem = objFolder.Items(i)

If TypeName(Item) = "MailItem" Then
    Set oItem = Item

其次,遍历文件夹中的所有项并不是一个好主意:

For Each mailitem In mailitems

    If mailitem.Subject = SubjectToSearch Then
        'check if the current email is the latest one
        If mailitem.ReceivedTime > latestreceivedtime Then

相反,您需要使用Items类的Find/FindNextRestrict方法,在该方法中您只能获取与搜索条件相对应的项。在我为技术博客撰写的文章中阅读更多关于这些方法的信息:

多个搜索条件可以通过使用逻辑运算符如AND,OR等组合成单个搜索字符串。
例如,要按主题字符串中的关键字筛选项目,请执行以下操作:

criteria = "@SQL=" & Chr(34) _ 
& "urn:schemas:httpmail:subject" & Chr(34) _ 
& " like '%question%'"

要按接收时间筛选项目,可以使用以下代码:

'All three filters shown below will return the same results 
    'This filter uses DASL date macro for today 
    strFilter = "%today(" _ 
    & AddQuotes("urn:schemas:httpmail:datereceived") & ")%" 
     
    'or

    'This filter uses urn:schemas:httpmail namespace 
    strFilter = AddQuotes("urn:schemas:httpmail:datereceived") _ 
    & " > '" & datStartUTC & "' AND " _ 
    & AddQuotes("urn:schemas:httpmail:datereceived") _ 
    & " < '" & datEndUTC & "'"

在哪里

Public Function AddQuotes(ByVal SchemaName As String) As String 
    On Error Resume Next 
    AddQuotes = Chr(34) & SchemaName & Chr(34) 
End Function

最后,您需要处理格式良好的HTML标记。即使Outlook在大多数情况下处理格式不正确的HTML文档,您也需要确保代码处理格式正确的HTML标记。请参阅https://www.developer.com/languages/xml/well-formed-html/了解更多信息。

相关问题