2009-09-15 20 views
6

Programáticamente, por supuesto.Guardar imágenes en Outlook 2007

Al haber pedido this question en superusuario, estoy buscando escribir una macro simple para desplegar la imagen mostrada en un mensaje HTML (correo electrónico o fuente) en Outlook 2007, y permitirme guardarlo en el disco.

Desafortunadamente, no he podido encontrar dónde en el modelo de objetos OL puedo hacer referencia a las imágenes enlazadas, o al contenido html. Encontrar archivos adjuntos es fácil, son las imágenes vinculadas/que aparecen las que son mi problema.

¿Algún ayuda? Por supuesto, si tiene una mejor respuesta no programática, me alegra ver que, sobre superusuario, por supuesto ...

Respuesta

2

Esto se basa en los documentos de MSDN. No tengo Outlook para probarlo.

Asumiendo que tiene un mensaje de correo electrónico abierto, puede llamar al método GetInspector en el MailItem instancia que tiene & usar su HTMLEditor property para conseguir manejar al DOM.

A partir de ahora, puede llamar a los métodos habituales como document.Images para obtener el control de todos los elementos de la imagen. No sé cómo se puede guardar localmente en un disco, pero estoy seguro de que debe haber algún método para hacerlo.

1

tuve un segundo vistazo a shahkalpeshs respuesta y se le ocurrió la siguiente solución: (escrito en 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 

Este código se descargará todas las imágenes que se muestra en su ActiveWindow y guárdalos en una carpeta.

Usted tendrá que añadir una referencia a Microsoft XML (cualquier versión> = 2.6 debería funcionar) a través de Herramientas-> Las referencias en el Editor de VBA

Si lo desea, también puede establecer una referencia a la biblioteca de objetos HTML de Microsoft y el cambio:

Dim htmldoc As Object 
    Dim currentImage As Object 

a:

Dim htmldoc As HTMLDocument 
    Dim currentImage As HTMLImg 

En cuanto a su comentario:

@marg, Gracias por la respuesta detallada. Todavía no puedo creer que la solución tenga que ser tan intrincada: la imagen ya se está visualizando, ¿por qué debería volver a descargarla? ¿Y qué pasa si quiero guardar solo una imagen? (En Outlook 2003, usted pudo hacer clic con el botón derecho en la imagen y seleccionar guardar como ... ahora no más.) Dado que esto es el cierre de una solución viable real, y ya que no parece haber una solución mejor en Outlook actual - Te doy la recompensa ...

No tengo 2007 para buscar una solución sin programación.

No creo que la MailItem Objeto (CurrentItem en mi solución es una MailItem) difiere mucho entre las versiones (pero basar esa suposición en la investigación del 0%: D) y yo no era capaz de localizar la ruta local directa donde se almacenan las imágenes mostradas, aunque estoy bastante seguro de que deberían estar en la carpeta de caché de su navegador. Arrastrar su carpeta para un archivo con el nombre currentImage.nameProp y copiarlo a su carpeta de destino sería una solución alternativa. Simplemente volver a descargar la imagen no debería ser tan malo: D

+0

+1. ¡Gran respuesta! –

+0

Gracias por la respuesta detallada. Todavía no puedo creer que la solución tenga que ser tan intrincada: la imagen ya se está visualizando, ¿por qué debería volver a descargarla? ¿Y qué pasa si quiero guardar solo una imagen? (En Outlook 2003, usted pudo hacer clic con el botón derecho en la imagen y seleccionar guardar como ... ahora no más.) Dado que esto es el cierre de una solución viable real, y ya que no parece haber una solución mejor en Outlook actual - Te estoy dando la recompensa ... – AviD

+0

Ver mi respuesta editada. – marg

Cuestiones relacionadas