2009-09-15 40 views
6

Par programme, bien sûr. Ayant déjà demandé this question sur superutilisateur, je cherche à écrire une simple macro pour dérouler l'image affichée dans un message HTML (email ou feed) dans Outlook 2007, et me permettre de l'enregistrer sur le disque.Enregistrer des images dans Outlook 2007

Malheureusement, je n'ai pas pu trouver où, dans le modèle d'objet OL, je peux référencer soit les images liées, soit le contenu html lui-même. Trouver des fichiers joints est facile, c'est les images liées/affichées qui sont mon problème.

Une aide? Bien sûr, si vous avez une meilleure réponse non-programmatique, je serai heureux de voir cela - sur le super-utilisateur, bien sûr ...

Répondre

2

Ceci est basé sur les documents MSDN. Je n'ai pas Outlook pour le tester.

En supposant que vous avez un message électronique ouvert, vous pouvez appeler la méthode GetInspector sur l'instance MailItem que vous avez & utiliser son HTMLEditor property pour obtenir la poignée au DOM. À partir de là, vous pouvez appeler les méthodes habituelles telles que document.Images pour gérer tous les éléments de l'image. Je ne sais pas, comment on peut l'enregistrer localement sur un disque mais je suis sûr, il doit y avoir une méthode pour le faire.

1

J'ai eu un second regard sur shahkalpeshs répondent et est venu avec la solution suivante: (écrit dans 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 

Ce code téléchargera toutes les images qui sont affichés dans votre ActiveWindow et les enregistrer dans un dossier.

Vous devrez ajouter une référence à Microsoft XML (toute version> = 2.6 devrait fonctionner) par Outils-> Références dans l'éditeur VBA

Si vous le souhaitez, vous pouvez également définir une référence à la bibliothèque d'objets Microsoft HTML et changement:

Dim htmldoc As Object 
    Dim currentImage As Object 

à:

Dim htmldoc As HTMLDocument 
    Dim currentImage As HTMLImg 

En ce qui concerne votre commentaire:

@marg, Merci pour la réponse détaillée. Je ne peux toujours pas croire que la solution doit être si compliquée - l'image est déjà affichée, pourquoi devrais-je devoir la télécharger à nouveau? Et si je veux enregistrer une seule image? (Dans Outlook 2003, vous pouviez faire un clic droit sur l'image et sélectionner enregistrer sous ... maintenant pas plus.) Puisque ceci est la solution pratique et qu'il n'y a pas de meilleure solution dans Outlook actuel - Je te donne la prime ...

Je n'ai pas 2007 pour chercher une solution de non-programmation.

Je ne crois pas que le MailItem objet (CurrentItem dans ma solution est un MailItem) diffère beaucoup entre les versions (mais je fonde cette hypothèse sur 0% recherche: D) et je n'ai pas pu trouver le chemin direct local où les images affichées sont stockées même si je suis assez sûr qu'elles devraient être dans votre dossier de cache de navigateurs. L'exploration de votre dossier pour un fichier portant le nom currentImage.nameProp et la copie dans votre dossier de destination constituerait une solution alternative. Le simple fait de télécharger à nouveau l'image ne devrait pas être si mauvais: D

+0

+1. Très bonne réponse! –

+0

Merci pour la réponse détaillée. Je ne peux toujours pas croire que la solution doit être si compliquée - l'image est déjà affichée, pourquoi devrais-je devoir la télécharger à nouveau? Et si je veux enregistrer une seule image? (Dans Outlook 2003, vous pouviez faire un clic droit sur l'image et sélectionner Enregistrer sous ... maintenant pas plus.) Puisque ceci est la solution pratique, et puisqu'il n'y a pas de meilleure solution dans Outlook actuel - Je te donne la prime ... – AviD

+0

Voir ma réponse éditée. – marg

Questions connexes