【问题标题】:Activating specific email in Outlook with VBA & deleting signature from the copied text使用 VBA 在 Outlook 中激活特定电子邮件并从复制的文本中删除签名
【发布时间】:2015-08-06 07:47:43
【问题描述】:

我希望在 vba 中使用 get 函数来激活 Outlook 中的特定电子邮件,然后将正文复制到新电子邮件中并发送。我可以使用getlast 函数来获取收件箱中的最新电子邮件,但是我想通过从特定电子邮件地址中选择最新电子邮件来进一步优化代码。

另外,我很想知道如何从粘贴到新电子邮件中的文本中删除签名。

Sub Negotiations()

Dim objMsg As Outlook.MailItem
Dim objItem As Outlook.MailItem
Dim BodyText As Object
Dim myinspector As Outlook.Inspector
Dim myItem As Outlook.MailItem
Dim NewMail As MailItem, oInspector As Inspector

Set myItem = Application.Session.GetDefaultFolder(olFolderInbox).Items.GetLast
myItem.Display

'copy body of current item

Set activeMailMessage = ActiveInspector.CurrentItem
activeMailMessage.GetInspector().WordEditor.Range.FormattedText.Copy

' Create the message.
Set objMsg = Application.CreateItem(olMailItem)

'paste body into new email
Set BodyText = objMsg.GetInspector.WordEditor.Range
BodyText.Paste

'set up and send notification email
With objMsg
    .To = "@gmail.com"
    .Subject = "Negotiations"
    .HTMLBody = activeMailMessage.HTMLBody
    .Display

End With
End Sub

任何帮助将不胜感激,谢谢你们!

【问题讨论】:

    标签: vba email outlook


    【解决方案1】:

    使用 Namespace.GetDefaultFolder(olFolderInbox) 打开 Inbox 文件夹,从 MAPIFolder.Items 检索 Items 集合。对 ReceivedTime 属性上的项目 (Items.Sort) 进行排序,使用 SenderEmailAddress 属性上的 Items.Find 检索最新的电子邮件。

    【讨论】:

    • 这段代码是如何工作的,对不起,我刚刚尝试使用 SenderEmailAddress 属性,但它也报告对象为空!
    • 全部代码如上。 Outlook 的规则部分中有一个选项,可让您在满足条件后运行代码。因此,目前,当我收到来自特定地址的电子邮件时,它会触发此脚本来访问收件箱中的最新电子邮件。我只想指定代码以从定义的电子邮件地址获取电子邮件,而不是只取最后一个,因为这会导致错误...任何帮助将不胜感激。
    • 我建议使用 GetDefaultFolder/Items.Sort/Items.Find。你的代码是什么?
    • 到目前为止,这是我的脚本:
    • 那么它不显示最近的消息吗?目前的问题是什么?
    【解决方案2】:

    根据 .SenderEmailAddress 的属性返回的内容,您可以调整 while 语句的计算结果。这应该对您有用,首先查看最后一封电子邮件,然后检查之前的每封电子邮件以获取正确的发件人地址。

    Sub display_mail()
        Dim outApp As Object, objOutlook As Object, objFolder As Object
        Dim myItems As Object, myItem As Object
        Dim strSenderName As String
    
        Set outApp = CreateObject("Outlook.Application")
        Set objOutlook = outApp.GetNamespace("MAPI")
        Set objFolder = objOutlook.GetDefaultFolder(olFolderInbox)
        Set myItems = objFolder.Items
        strSenderName = UCase(InputBox("Enter the e-mail Alias."))
    
        Set myItem = myItems.GetLast
        While Right(myItem.SenderEmailAddress, Len(strSenderName)) <> strSenderName
            Set myItem = myItems.GetPrevious
        Wend
        myItem.Display
    End Sub
    

    【讨论】:

    • 您好,这是一些非常棒的代码,主要问题,也许是我没有提到的,是我设置了一个规则,以便脚本在来自特定电子邮件地址的电子邮件时运行收到。因此,这个过程确实需要自动化,因此,拥有一个 InputBox 远非理想。
    • 如果您打算让代码仅影响 1 个电子邮件收件人,那么您只需为 strSenderName 变量分配一个常量值(尽管将其设为 Const 而不是变量)。
    【解决方案3】:

    Application.Session.GetDefaultFolder(olFolderInbox).Items.GetLast activeMailMessage.GetInspector().WordEditor.Range.FormattedText.Copy

    首先,我建议中断调用链。在单独的代码行上声明每个属性或方法调用,这样您就可以随时调试代码并查看幕后发生的情况。

    GetLast 方法返回集合中的最后一个对象。但这并不意味着该项目是最后收到的。您需要使用 Sort 方法对集合进行排序,因为 Dmitry 建议将 ReceivedTime 属性作为参数传递以进行排序。只有在这种情况下,您才会从集合中获取最后收到的项目。

    Outlook 对象模型不提供任何用于识别签名的特殊方法或属性。您需要解析消息正文并以编程方式找到它。

    【讨论】:

    • 感谢尤金,感谢大家,这是非常有见地的东西,我只是想把它全部包起来!
    【解决方案4】:
    Sub Nego()
    
    Dim objMsg As Outlook.MailItem
    Dim myItem As Outlook.MailItem
    Dim BodyText As Object
    Dim Inspector As Outlook.MailItem
    Dim olNameSpace As Outlook.NameSpace
    Dim olfolder As Outlook.MAPIFolder
    
    Dim msgStr As String
    Dim endStr As String
    Dim endStrStart As Long
    Dim endStrLen As Long
    Dim myItems As Outlook.Items
    
    
    
        'Access folder Nego
    Const olFolderInbox = 6
        Set objOutlook = CreateObject("Outlook.Application")
        Set objNamespace = objOutlook.GetNamespace("MAPI")
        Set objInbox = objNamespace.GetDefaultFolder(olFolderInbox)
        strFolderName = objInbox.Parent
        Set objMailbox = objNamespace.Folders(strFolderName)
        Set objFolder = objMailbox.Folders("Nego")
    
        'Mark as read
    For Each objMessage In objFolder.Items
        objMessage.UnRead = False
        Next
    
        'Sort
    Set myItems = objFolder.Items
        For Each myItem In myItems
        myItems.Sort "Received", False
        Next myItem
        myItems.GetLast.Display
    
        'copy body of current item
    Set activeMailMessage = ActiveInspector.CurrentItem
        activeMailMessage.GetInspector().WordEditor.Range.FormattedText.Copy
    
        ' Create the message.
    Set objMsg = Application.CreateItem(olMailItem)
    
        'paste body into new email
    Set BodyText = objMsg.GetInspector.WordEditor.Range
        BodyText.Paste
    
        'Search Body
    Set activeMailMessage = ActiveInspector.CurrentItem
        endStr = "first line of signature"
        endStrLen = Len(endStr)
        msgStr = activeMailMessage.HTMLBody
        endStrStart = InStr(msgStr, endStr)
        activeMailMessage.HTMLBody = Left(msgStr, endStrStart + endStrLen)
    
        'set up and send email
    With objMsg
        .To = "@email"
        .Subject = "Nego"
        .HTMLBody = activeMailMessage.HTMLBody
        .HTMLBody = Replace(.HTMLBody, "First line of signature", " ")
        .Send
    
    End With
    
    
    End Sub
    

    【讨论】:

    • 代码仍然不起作用,当我按最新的电子邮件排序并使用 getlast 功能时,它仍然没有收到最新的电子邮件 - 我认为这是因为最新的电子邮件被标记为未读,在 Outlook 中满足规则标准后,我尝试创建脚本,但标记为已读功能似乎不起作用。尽管如此,任何建议将不胜感激!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2021-09-30
    • 2013-09-04
    相关资源
    最近更新 更多