Программно, конечно.
Уже задав этот вопрос на суперпользователе, я смотрю на запись простого макроса к выпадающему отображенное изображение в сообщении HTML (электронная почта или канал) в перспективе 2007, и позволяю мне сохранять его на диск.
К сожалению, я не смог найти, где в объектной модели OL я могу сослаться или на связанные изображения или на само содержимое HTML. Прилагается файлов легок, это, связался/отобразил изображения, который является моей проблемой.
Какая-либо справка? Конечно, если у Вас будет лучший непрограммный ответ, то я буду рад видеть что - на суперпользователе, конечно...
Это основано на документации MSDN. У меня нет Outlook, чтобы проверить это.
Предполагая, что у вас открыто сообщение электронной почты, вы можете вызвать метод GetInspector
в экземпляре MailItem
, который у вас есть, и использовать его свойство HTMLEditor
, чтобы получить дескриптор DOM.
С этого момента вы можете вызывать обычные методы, такие как document.Images
, чтобы обрабатывать все элементы изображения. Я не знаю, как это можно сохранить локально на диск, но я уверен, что для этого должен быть какой-то способ.
Я еще раз просмотрел ответ 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
и сохранит их в папке.
Вам нужно будет добавить ссылку на Microsoft XML (должна работать любая версия >= 2.6) через Tools->References в редакторе VBA
Если вы хотите, вы также можете установить ссылку на Microsoft HTML Object Library и изменить:
Dim htmldoc As Object
Dim currentImage As Object
на:
Dim htmldoc As HTMLDocument
Dim currentImage As HTMLImg
По поводу вашего комментария:
@marg, Спасибо за подробный ответ. Я все еще не могу поверить, что решение должно быть таким запутанным - изображение уже отображается, почему я должен загружать его снова? А что если я хочу сохранить только одно изображение? (В Outlook 2003 можно было щелкнуть правой кнопкой мыши на изображении и выбрать сохранить как... теперь нет). Поскольку это закрывает путь к реальному работоспособному решению, и поскольку в текущем Outlook, похоже, нет лучшего решения - я даю вам вознаграждение...
У меня нет 2007, чтобы искать непрограммное решение.
Я не верю, что объект MailItem
(CurrentItem
в моем решении является MailItem
) сильно отличается между версиями (но я основываю это предположение на 0 % исследования :D) и я не смог найти прямой локальный путь, где хранятся отображаемые изображения, хотя я уверен, что они должны быть в кэш-папке вашего браузера. Альтернативным решением может быть поиск файла с именем currentImage.nameProp
и копирование его в папку назначения. Простая повторная загрузка изображения не должна быть такой уж плохой :D