2009-09-15 13 views
6

Programowo, oczywiście.Zapisywanie obrazów w programie Outlook 2007

Po zadaniu this question na superużytkownika, patrzę na pisanie prostego makra do przeciągnięcia wyświetlanego obrazu w wiadomości HTML (e-mail lub plik danych) w programie Outlook 2007 i pozwolenie na zapisanie go na dysku.

Niestety, nie udało mi się znaleźć miejsca w modelu obiektów OL, do których mogę odwoływać się do połączonych obrazów lub samej zawartości html. Odnalezienie załączonych plików jest łatwe, a połączone z nimi obrazy to mój problem.

Każda pomoc? Oczywiście, jeśli masz lepszą, nie programistyczną odpowiedź, z przyjemnością się to obejrzy - oczywiście na administratora, ...

Odpowiedz

2

Jest to oparte na dokumentach MSDN. Nie mam programu Outlook, aby go przetestować.

Zakładając, że wiadomość e-mail otwarty, można zadzwonić GetInspector metody na przykład MailItem że masz & używać jej HTMLEditor property aby obsłużyć do DOM.

Odtąd można wywoływać zwykłe metody, takie jak document.Images, aby uzyskać dostęp do wszystkich elementów obrazu. Nie wiem, jak można go zapisać lokalnie na dysku, ale jestem pewien, musi istnieć jakaś metoda, aby to zrobić.

1

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

+0

+1. Świetna odpowiedź! –

+0

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

+0

Zobacz moją zredagowaną odpowiedź. – marg

Powiązane problemy