miałem drugie spojrzenie na shahkalpeshs odpowiedzieć i wymyślił następujące rozwiązanie: (napisany w programie 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
Kod ten będzie pobrać wszystkie obrazy, które są wyświetlane w ActiveWindow
i zapisz je w folderze.
Musisz dodać odwołanie do Microsoft XML (dowolna wersja> = 2.6 powinno działać) poprzez Narzędzia-> Referencje w edytorze VBA
Jeśli chcesz, możesz także ustawić Odwołanie do obiektu Biblioteki Microsoft HTML i zmienić:
Dim htmldoc As Object
Dim currentImage As Object
do:
Dim htmldoc As HTMLDocument
Dim currentImage As HTMLImg
chodzi swój komentarz:
@marg, dzięki za szczegółową odpowiedź. Nadal nie mogę uwierzyć, że rozwiązanie musi być tak zawiłe - obraz już się wyświetla, dlaczego miałbym go ponownie pobrać? A co jeśli chcę zapisać tylko jeden obraz? (W programie Outlook 2003 można było kliknąć prawym przyciskiem myszy na obrazie i wybrać opcję Zapisz jako ... teraz nie więcej.) Ponieważ jest to rozwiązanie zamykające się na rzeczywiste, możliwe do zastosowania rozwiązanie, a ponieważ nie ma lepszego rozwiązania w bieżącym programie Outlook - Daję ci nagrodę ...
Nie mam 2007 roku na szukanie rozwiązania poza programowaniem.
Nie wierzę, że MailItem
Object (CurrentItem
w moim roztwór jest MailItem
) różni się znacznie między wersjami (ale opieram to założenie na 0% Badania: D) i nie byłem w stanie zlokalizować bezpośrednią ścieżkę lokalną gdzie wyświetlane obrazy są przechowywane, chociaż jestem pewien, że powinny znajdować się w folderze pamięci podręcznej przeglądarki. Przeszukanie folderu w poszukiwaniu pliku o nazwie currentImage.nameProp
i skopiowanie go do folderu docelowego byłoby rozwiązaniem alternatywnym. Po prostu ponowne wczytanie obrazu nie powinno być takie złe: D
+1. Świetna odpowiedź! –
Dzięki za szczegółową odpowiedź. Nadal nie mogę uwierzyć, że rozwiązanie musi być tak zawiłe - obraz już się wyświetla, dlaczego miałbym go ponownie pobrać? A co jeśli chcę zapisać tylko jeden obraz? (W programie Outlook 2003 można było kliknąć prawym przyciskiem myszy na obrazie i wybrać opcję Zapisz jako ... teraz nie więcej.) Ponieważ jest to rozwiązanie zamykające się na rzeczywiste, możliwe do zastosowania rozwiązanie, a ponieważ nie ma lepszego rozwiązania w bieżącym programie Outlook - Daję ci nagrodę ... – AviD
Zobacz moją zredagowaną odpowiedź. – marg