6

当然,以编程方式。

已经在超级用户上问过这个问题后,我正在考虑编写一个简单的宏来拉下 Outlook 2007 中 HTML 消息(电子邮件或提要)中显示的图像,并允许我将其保存到磁盘。

不幸的是,我无法在 OL 对象模型中找到可以引用链接图像或 html 内容本身的位置。查找附件很容易,链接/显示的图像是我的问题。

有什么帮助吗?当然,如果您有更好的非编程答案,我会很高兴看到这一点 - 当然是超级用户......

4

2 回答 2

2

这是基于 MSDN 文档。我没有 Outlook 来测试它。

假设您打开了一封电子邮件,您可以在您拥有的实例GetInspector上调用方法并使用其属性来获取 DOM 的句柄。MailItemHTMLEditor

从这里开始,您可以调用常规方法,例如document.Images获取所有图像元素的句柄。我不知道,如何将它本地保存到磁盘,但我敢肯定,必须有一些方法可以做到这一点。

于 2010-06-24T14:07:23.327 回答
1

我再次查看了 shahkalpeshs 的答案并提出了以下解决方案:(写在 Outlook 2003 中)

Option Explicit

Private Sub getImages()
    Dim xmlhttp_ As xmlhttp
    Dim htmldoc As Object
    Dim currentImage As Object
    Dim currentResponse() As Byte

    Dim startTime As Date
    Dim maxTime As Long

    Dim pathFolder As String
    Dim pathFull As String
    Dim nrFile As Integer

    pathFolder = "C:\YourFolder\Images\"   '"(small fix for stackoverflow syntaxhighlighter)
    maxTime = 30 ' max time to load 1 File in seconds '

    If Me.ActiveWindow.CurrentItem.GetInspector.EditorType = olEditorHTML Then
        Set htmldoc = Me.ActiveWindow.CurrentItem.GetInspector.HTMLEditor
        Set xmlhttp_ = New xmlhttp

        For Each currentImage In htmldoc.images

            xmlhttp_.Open "GET", currentImage.src
            If Left(currentImage.src, 8) <> "BLOCKED:" Then
                xmlhttp_.Send
                startTime = Now

                pathFull = pathFolder & currentImage.nameProp
                pathFull = Replace(pathFull, "?", vbNullString)
                pathFull = Replace(pathFull, "&", vbNullString)

                Do While xmlhttp_.readyState <> 4
                    If DateTime.DateDiff("s", startTime, Now) > maxTime Then Exit Do
                    DoEvents
                Loop

                If xmlhttp_.readyState = 4 Then
                    If Dir(pathFull) <> "" Then Kill pathFull
                    nrFile = freeFile

                    Open pathFull For Binary As #nrFile
                    currentResponse = xmlhttp_.responseBody
                    Put #nrFile, , currentResponse
                    Close #nrFile
                End If
            End If
        Next currentImage
    End If

    Set xmlhttp_ = Nothing
    Set currentImage = Nothing
    Set htmldoc = Nothing
End Sub

此代码将下载您显示ActiveWindow的所有图像并将它们保存在一个文件夹中。

您需要通过 VBA 编辑器中的 Tools->References 添加对Microsoft XML的引用(任何版本 >= 2.6 都可以使用)

如果您愿意,您还可以设置对Microsoft HTML 对象库的引用并更改:

    Dim htmldoc As Object
    Dim currentImage As Object

至:

    Dim htmldoc As HTMLDocument
    Dim currentImage As HTMLImg

关于您的评论:

@marg,感谢您的详细回复。我仍然无法相信解决方案必须如此复杂 - 图像已经显示,为什么我必须再次下载它?如果我只想保存一张图片怎么办?(在 Outlook 2003 中,您可以右键单击图像并选择另存为... 现在不再需要了。)因为这是接近实际可行的解决方案,而且在当前 Outlook 中似乎没有更好的解决方案- 我给你赏金...

我没有 2007 年寻找非编程解决方案。

我不相信MailItem对象(CurrentItem在我的解决方案中是 a MailItem)在版本之间有很大差异(但我基于 0 % 研究的假设:D)并且我无法找到存储显示图像的直接本地路径虽然我很确定它们应该在您的浏览器缓存文件夹中。在您的文件夹中搜索具有该名称的文件并将其currentImage.nameProp复制到您的目标文件夹将是一种替代解决方案。简单地重新下载图像应该不会那么糟糕:D

于 2010-06-24T14:08:05.950 回答