VBScript para guardar automáticamente archivos adjuntos Outlook

Hace poco uno de nuestros clientes comenzó a enviar facturas electrónicas para realizar tramites por medio de correo electrónico, el cual envia aproximadamente 30 facturas por hora en correos separados cada una, el cual para la persona encargada de realizar sus tramites su trabajo se torno un tanto tedioso y le quitaba tiempo en estar guardando en la carpeta manualmente cada factura, el cual optamos por automatizar esto.

En la empresa optamos por utilizar Attachment Save Add-In de Sperry Software [Ver articulo], pero si no deseamos comprar un programa o solo necesitamos algo con mayor configuración podemos utilizar un Script en Visual Basic el cual cumple perfectamente la función de guardar automáticamente los archivos adjuntos que se reciben por correo electrónico en Outlook.

Configurando el VBScript en Outlook

Nota: Outlook – Opción ejecutar un script (run a script) no aparece en las reglas

  • Es muy importante que tengamos la carpeta creada en el lugar que especificamos en el Script (Ejemplo en C:\XML o C:\Archivos [Que son los que se muestran en los ejemplos])create-folder
  • Ahora ya cada que nos llegue un correo que cumpla las condiciones especificadas en la configuración se ejecutara nuestro Script.

Códigos VBScript para guardar automáticamente archivos adjuntos en Outlook

VBScript que guarda todos los archivos recibidos (Remplaza existentes del mismo nombre).

Public Sub saveAttachtoDisk (itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = "C:\Archivos\"
     For Each objAtt In itm.Attachments        
          objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName        
          Set objAtt = Nothing    
     Next
End Sub

VBScript que guarda todos los archivos recibidos (No remplaza existentes agrega la fecha al archivo).

Public Sub saveAttachtoDisk (itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
    dateFormat = Format(Now, "yyyy-mm-dd H-mm")
saveFolder = "C:\Archivos"
     For Each objAtt In itm.Attachments        
          objAtt.SaveAsFile saveFolder & "\" & dateFormat & " - "& objAtt.DisplayName       
          Set objAtt = Nothing    
     Next
End Sub

VBScript que guarda archivos de cierto peso (tamaño), por ejemplo para evitar que guarde las imágenes de las firmas de los remitentes.

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = "C:\Archivos"
     For Each objAtt In itm.Attachments
        If objAtt.Size > 5000 Then 'Ajustar el tamaño al peso para excluir los archivos en Bytes
              objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
          End If
     Next
End Sub

VBScript que guarda cierto tipo de archivo (Ejemplo: .xml y remplaza archivos del mismo nombre).

Public Sub saveAttachtoDisk (itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = "C:\XML\"
     For Each objAtt In itm.Attachments        
    if InStr(objAtt.DisplayName, ".xml") Then
              objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
          end if
     Next
End Sub

VBScript que guarda varios tipos de archivos (Ejemplo: .xml y .pdf – remplaza archivos del mismo nombre).

Public Sub saveAttachtoDisk (itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = "C:\XML\"
     For Each objAtt In itm.Attachments        
    if ((InStr(objAtt.DisplayName, ".xml") Or InStr(objAtt.DisplayName, ".pdf"))) Then
              objAtt.SaveAsFile saveFolder & "\" & objAtt.DisplayName
          end if
     Next
End Sub

VBScript que guarda cierto tipo de archivo (Ejemplo: .xml y No remplaza existentes agrega la fecha al archivo).

Public Sub saveAttachtoDisk (itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
    dateFormat = Format(Now, "yyyy-mm-dd H-mm")
saveFolder = "C:\XML\"
For Each objAtt In itm.Attachments        
              if InStr(objAtt.DisplayName, ".xml") Then
              objAtt.SaveAsFile saveFolder & "\" & dateFormat & " - "& objAtt.DisplayName
          end if    
     Next
End Sub

VBScript que guarda todos los archivos recibidos (No remplaza existentes agrega la fecha al archivo y Nombre de la persona quien lo envió “From / De”).

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
Dim getFrom
    dateFormat = Format(Now, "yyyy-mm-dd H-mm")
    getFrom = itm.senderName
saveFolder = "C:\Archivos\"
     For Each objAtt In itm.Attachments
          objAtt.SaveAsFile saveFolder & "\" & dateFormat & " - " & getFrom & " - " & objAtt.DisplayName
          Set objAtt = Nothing
          Set itm = Nothing
     Next
End Sub

VBScript que guarda todos los archivos recibidos (No remplaza existentes agrega la fecha al archivo, Parte del Asunto (Subject))

En la linea 14 se utiliza Mid para extraer parte del subject este el primer numero indica a partir de que carácter comenzara a contar y el siguiente indica cuantos caracteres tomara.

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
Dim getSubject As String
dateFormat = Format(Now, "yyyy-mm-dd H-mm")
saveFolder = "C:\Archivos\"
' get Subject
getSubject = itm.Subject
 
    For Each objAtt In itm.Attachments
      If InStr(UCase(objAtt.DisplayName), ".XML") Then
        ReplaceIllegalChars getSubject, "-"
        finalSubject = Mid(getSubject, 4, 12)
        objAtt.SaveAsFile saveFolder & dateFormat & " – " & finalSubject & " – " & objAtt.DisplayName
       End If
    Next
End Sub
 
Private Sub ReplaceIllegalChars(getSubject As String, sChr As String)
  getSubject = Replace(getSubject, "/", sChr)
  getSubject = Replace(getSubject, "\", sChr)
  getSubject = Replace(getSubject, ":", sChr)
  getSubject = Replace(getSubject, "?", sChr)
  getSubject = Replace(getSubject, Chr(34), sChr)
  getSubject = Replace(getSubject, "<", sChr)
  getSubject = Replace(getSubject, ">", sChr)
  getSubject = Replace(getSubject, "|", sChr)
  getSubject = Replace(getSubject, "*", sChr)
End Sub

VBScript guarda archivos adjuntos sin duplicar agregando un consecutivo (1), (2), etc. a los archivos repetidos.

Se debe especificar la ruta donde se guardaran los archivos en la linea 11

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim strFileName As String
Dim strNewName As String
Dim fso
Dim intExtlen As Integer
Dim strPre As String
Dim strExt As String
Set fso = CreateObject("Scripting.FileSystemObject")
saveFolder = "C:\1-Tests\"
	'Revisa los adjuntos
     For Each objAtt In itm.Attachments
        strFileName = objAtt.DisplayName
		'Revisa si existe el archivo en la carpeta destino
        If fso.fileexists(saveFolder & "\" & strFileName) = True Then
            strNewName = strFileName
            intExtlen = Len(strFileName) - InStrRev(strFileName, ".") + 1
			'Revisa la extension del archivo
            If InStrRev(strFileName, ".") > 0 Then
                    strExt = Right(strFileName, intExtlen)
                    strPre = Left(strFileName, Len(strFileName) - intExtlen)
                Else
                    strExt = ""
                    strPre = strFileName
                End If
			'Revisa que consecutivo asignar al nombre (1), (2), (3), etc.
            While fso.fileexists(saveFolder & "\" & strNewName) = True
                    w = w + 1
                    strNewName = strPre & Chr(40) & w & Chr(41) & strExt
                Wend
                ' Asignar el nuevo nombre
                strFileName = strNewName
                w = 0
            End If
          'Guardar archivo con nuevo nombre
          objAtt.SaveAsFile saveFolder & "\" & strFileName
          AttachmentCount = AttachmentCount + 1
          Set objAtt = Nothing
     Next
End Sub

 

Leer:  VBScript - Guardar Correos Seleccionados en un mismo Archivo Doc (Word)

VBScript Crea Carpeta con Nombre de Remitente y Guarda Adjuntos en la carpeta correspondiente.

En la linea 11 se especifica el folder raíz donde se guardaran las subcarpetas de cada remitente.

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
Dim getFrom
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

    dateFormat = Format(Now, "yyyy-mm-dd H-mm")
    getFrom = itm.senderName
    saveFolder = "C:\Archivos\" & getFrom & "\"

If Not oFSO.FolderExists(saveFolder) Then
  oFSO.CreateFolder saveFolder
End If

     For Each objAtt In itm.Attachments
          objAtt.SaveAsFile saveFolder & "\" & dateFormat & " - " & objAtt.DisplayName
          Set objAtt = Nothing
          Set itm = Nothing
     Next
End Sub

VBScript Crea Carpeta con Nombre del Dominio del Remitente (Sin Extencion .com, .es, .mx, etc) y Guarda Adjuntos en esta Carpeta

En linea 15 se especifica la ruta del folder raiz donde se almacenan los adjuntos.

Nota: Se debe ajustar domain = Left(sDomain, InStr(1, sDomain, “.”, 1) – 1) cuando crea nombres incorrectos cuando el dominio cuenta con mas de un punto.

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
Dim getFrom As String
Dim sDomain As String
Dim oFSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

    dateFormat = Format(Now, "yyyy-mm-dd H-mm")
    getFrom = itm.SenderEmailAddress
    sDomain = Right(getFrom, (Len(getFrom) - InStr(1, getFrom, "@", 1)))
    domain = Left(sDomain, InStr(1, sDomain, ".", 1) - 1)
    
    saveFolder = "C:\1-Tests\" & domain & "\"

If Not oFSO.FolderExists(saveFolder) Then
  oFSO.CreateFolder saveFolder
End If

     For Each objAtt In itm.Attachments
          objAtt.SaveAsFile saveFolder & "\" & dateFormat & " - " & objAtt.DisplayName
          Set objAtt = Nothing
          Set itm = Nothing
     Next
End Sub
Fernando O.

Fernando O.

Soy analista de sistemas actualmente trabajo en una empresa con mas de 200 empleados que utilizan equipo de computo al cual se les da soporte en el departamento.
Uno de mis pasatiempos fuera de la empresa es escribir artículos para PortalMasTips donde documento los problemas, inquietudes y detalles interesantes que se presentan.
Fernando O.

Latest posts by Fernando O. (see all)

319
Deja una respuesta

avatar
 
Archivos de fotos e imágenes
 
 
 
Archivos de audio y video
 
 
 
Otros tipos de archivos
 
 
 
53 Hilos de comentarios
266 Respuestas de hilo
1 Seguidores
 
Comentario más reaccionado
Hilo de comentarios más caliente
86 Autores de comentarios
Fernando O.guillermo barattaManuel Martin GilPaul LudeñaMiriam Autores de comentarios recientes

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

  Suscribir  
el más nuevo más antiguo más votado
Notificar de
Wilmer F. Hernandez G
Guest
Wilmer F. Hernandez G

Hola Buenos dias,

mi inconveniente es mas desde la base.
No encuentro en mi outlook la opcion “run a script”, como hago para habilitarla estoy usando Outlook 2010, Gracias de antemano

RICARDO GONZALEZ
Guest
RICARDO GONZALEZ

Buenas Tardes

Me ha servido de mucho tu código pero presente un dilema quisiera saber si hay manera de que el archivo se renombre con el remitente y la fecha exceptuando el nombre original del archivo recibido esto debido a que estoy creando un informe con estos archivos pero la persona que me envía la información los nombra por decirlo “coberturas diarias productos x + productos y 36 sabado” y a mi se me haría mas fácil algo como “coberturas cierre de semana 36” solo quiero saber si se puede renombrar dicho archivo desde el código al momento de guardarlo para no batallar y de no ser así buscar otra opción de antemano agradezco la atención brindada

Alexander
Guest
Alexander

Buenas tardes Fernando, gracias por el ayuda que nos brindas en esta pagina, me a funcionado mucho para archivar los correos y los adjuntos que recibo en volumen, pero tengo ahora una solicitud, una vez importado el adjunto de excel, creer una macro para que estos pasen a otro excel nuevo, pero necesito vincular los datos de la primera columna del nuevo excel con el correo descargado en la carpeta, esto es posible, mil gracias de nuevo y quedo atento.

andrea carvajal
Guest
andrea carvajal

hola…realice los pasos propuestos y no me queda lso archivos en la carpeta que asigne …alguien me puede colaborar
gracias

Jorge S.
Guest
Jorge S.

Bueno días,
Me pasa lo mismo que a Andrea , estoy usando el primero y guardando en C:\Archivos , y no me guarda ningún archivo , le he quitado la barra diagonal final, he configurado la seguridad de las macros para que los ejecute y tampoco, mi Office es el 2013.

saludos

Jorge S.
Guest
Jorge S.

Hola, lo pongo asi?:

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
dateFormat = Format(Now, “yyyy-mm-dd H-mm”)
saveFolder = “C:\Archivos”
MSGBOX (“ARCHIVO: ” & SAVEFOLDER & “\” & OBJATT.DISPLAYNAME)
For Each objAtt In itm.Attachments
objAtt.SaveAsFile saveFolder & “\” & dateFormat & ” – ” & objAtt.DisplayName
Set objAtt = Nothing
Next
End Sub

Carlos
Guest
Carlos

Buenos días.

Y si los adjuntos que yo me quiero bajar no están en la Bandeja de Entrada sino que los tengo almacenados en diferentes .pst ya almacenados en local ¿como lo hago para que me descargue todos los adjuntos de correos ya clasificados y archivados en pst?

Muchas gracias.

Victor
Guest
Victor

GRACIAS FERNANDO!! estos tips me han salvado la vida!! …gracias.

González Martín
Guest

Hola Fernando: Estoy buscando lo siguiente: Tengo acceso a un buzón donde llegan facturas PDF y XML de nuestro proveedor de servicio. Necesido descargar esos adjuntos pero sin tener que abrir los archivos. Tengo la versión 2013 ¿se puede?

Javier
Guest
Javier

Hola, como puedo hacer para que el script NO tome las imagenes ANEXAS al cuerpo del mensaje de correo (por ejemplo las utilizadas en las firmas y otras) y solo tome las imagenes que estan efectivamente enviadas como ADJUNTOS

Javier
Guest
Javier

Excelente. Gracias por la actualizacion “custom”. Y por la rapida respuesta. Realmente es una excelente fuente tu blog, gracias por tenerlo y mantenerlo. Peruebo la adicion y en caso de cualquier cosa la comento, pero parece bastante sencillo.

Javier
Guest
Javier

Hola de nuevo. Ya probe la sugerencia para evitar guardar imagenes que sean MENORES a cierto tamaño y funciona perfectamente (OutLook 2013). La observacon aqui es si habrá otro criterio para seleccionar solo las imagenes anexas (adjuntas) y NO las embebidas en el cuerpo del documento. El problema es que algunas imagenes que se embeben en el cuerpo del mensaje de coorreo, pueden sobrepasar el limite impuesto y guardarse indebidamente, mientras que otras, genuinas y validas, pudieran ser eliminadas. Un ejemplo: el mensaje contiene la firma del remitente en una imagen con su logo y esta pesa 50 kB. Incluye como adjunto la imagen AUTO.jpg y esta pesa 35 kB. En este caso si nosotro slimitamos a que sean guardadas solo las imagenes MAYORES a 40 kB, se guardaria la FIRMA pero NO la imagen AUTO.jpg, o sea totalmente opuesto a lo deseado. Este es un caso real d elos tamaños de firma e imagen. Habra otro metodo para discriminar entre iamgenes EMBEBIDAS y ADJUNTAS? No se si Outlook hace alguna diferenciacion en alguna caracteristica de una imagen embebida y una adjunta??? Por cierto, me tome la libertad e hice algunas combinaciones con tu codigo y resulto este que les comparto, que lo que hace es: – checar que solo se guarden imagenes arriba del tamaño deseado – guardar solo los tipos de imagen deseado – guardar los anexos en una ruta especifica – darles el nombre: asunto _ nombre del anexo removiendo todos los caracteres ilegales que podrian impedir el guardado. Public Sub Anexos(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim getSubject As String saveFolder = "C:\Users\Imagenes" getSubject = itm.Subject For Each objAtt In itm.Attachments If objAtt.Size > 36000 Then 'este loop es para que se discriminen todas las imagenes abajo del tamaño indicado en… Leer mas»

Javier
Guest
Javier

mmm puede ser una buena opcion ya que las imagenes recibidas como adjuntos son lo que realmente importa y no las embebidas ni el formato. Se puede instruir a los que envian las imagenes a que solo las manden como ADJUNTOS o si no, no serían procesadas. Gracias por la ayuda, Fernando. Buen dia.

Angela
Guest
Angela

Lo felicito es un buen aporte, en mi caso llegan correos de varias personas y cada una con un adjunto, luego de procesar la solicitud debo reenviar ese adjunto a un grupo de personas incluyendo a la persona que lo envio y ademas del adjunto debo poner cierta informacion como es nombre, numero de solicitud y codigo. Es tedioso porque asi debo hacerlo con cada correo que llega hay alguna forma que eso se haga de forma automatica¿¿?? que la macro de FW al correo con el adjunto, a las personas determinadas y la informacion en el cuerpo del correo¿¿??

Victor
Guest
Victor

Fernando si uso Outlook en el movil, ya cuando estoy en la laptop me deja de funcionar el script y me aparece un msj en el cual me indica que: se ejecutara cuando compruebe mi correo y que ya no funcionara hasta comprobarlo en linea o desde otro dispositivo de correo

Victor
Guest
Victor

Buen dia Fernando…no muestra error alguno, probablemente el pst este dañado…gracias por tu atencion.

Obed
Guest
Obed

Que tal, solo para agradecer este articulo me ha salvado de horas y horas de trabajo, y aprovecharia para saber si me puedes apoyar en un caso pero en excel, necesito automatizar unos procesos, te cuento de manera breve, imagina una tabla en una columna tengo destinos con puntos intermedios ej: ciudad1-ciudad2-ciudad3, en las 3 columnas siguientes tengo como encabezado destino1, destino2, destino3, , y en la siguiente columna necesito saber el kilometraje total de la ruta es decir si de ciudad1 a ciudad 3 son 500 km, me ponga esos 500 km ahi , pero , si solo llego al destino de ciudad2(destino2), solo me ponga el equivalente del total de la ruta, cabe decir que en las columna de destinos solo puedo poner numeros “1”, si tengo 3, unos”1″, es el total de la ruta si en destino1 y destino 2 es donde solo tengo el “1”, es donde haga la equivalencia, saludos y excelente trabajo

Fernando C
Guest
Fernando C

Hola que tal he intentado configurar esta regla con el script pero al momento de crearla no aparece en las opciones Ejecutar un script. tengo office 2016

Juan G
Guest
Juan G

Tengo el mismo problema que el comentario de arriba. He de mencionar que la opción de habilitar todas las macros se encuentra activada, pero al momento de crear la regla, en el segundo paso no aparece la opción de “ejecutar un script”. ¿A qué se deberá, podrías sugerirme alguna solución por favor? Gracias anticipadas. Saludos!

Benjamin
Guest
Benjamin

Que pasa si no viene archivo adjunto? como le hago para crear un IF donde si no trae adjunto haga otra accion?

ludmila R.
Guest

Hola como estas! agradezco me puedas ayudar con lo siguiente: Realice todos los pasos pero al momento de descargar los archivos se ejecuta el script pero cuando voy a la carpeta no hay nada, necesito crearlo porque recibo casi 400 Facturas por día de diferentes proveedores y las bajo siempre una a una, pierdo muchísimo tiempo, intente buscar en todos los comentarios hay usuarios a los que le paso lo mismo y lograron solucionarlo, yo probé todo lo que indicas y no logro solucionarlo, como puedo hacer para que me baje únicamente los archivos adjuntos de los mails que llegan y se marquen como leídos, necesito que cree una carpeta única, si recibo mail hoy entonces que cree una carpeta con fecha 04/2 si los recibo mañana otra carpeta con fecha 05/02 y así sucesivamente.
Espero puedas ayudarme.

muchas gracias.

sebastian vega
Guest
sebastian vega

Buenisimo, combine algunos codigos para que me guarde en la carpeta de quien envía, junto con el titulo del mensaje y el nombre del archivo.
Solo como nota, en el codigo para crear carpetas por quien envía, considerar utilizar tambien la línea…
ReplaceIllegalChars getFrom, “-“

Petty
Guest
Petty

Gracias por el Post. He realizado toda la configuración. La primera vez me ha funcionado, pero a partir ha dejado de funcionar. He vuelto a realizar todos los pasos e incluso he visto que la configuración de las macros esté habilitada, pero nada.
Al ejecutarla de regla de forma manual, parece que hiciese algo pero no copia los ficheros ¿alguna idea de lo que pueda estar pasando?

Miguel Núñez
Guest
Miguel Núñez

Buen dia, muchas gracias por la ayuda, tengo un problema, con el codigo que copia parte del asunto, al parecer se ejecuta, muestra la ventana donde se supone esta copiando los archivos, hice la solucion anterior, de agregar esta linea “MsgBox (“VBScript ejecutado”)”, no aparece ningun mensaje, pero estoy casis eguro q la macro si se ejecuta, de hecho utilizo macros en excel, pero ahora no se que pasa, copie y pegue la direccion de la carpeta en el codigo donde corresponde pero no aparecen los adjuntos descargados, agradeceria mucho su ayuda, gracias.
Atentos saludos.

Miguel Núñez
Guest
Miguel Núñez

Buenos dias, ayuda con el script que guarda con parte del asunto, lo ejecuto y trabaja, pero no se guarda nada en la carpeta de destino, ayuda. !!

David Garzón
Guest
David Garzón

Estimado Fernando:
Agradecerte de antemano el gran trabajo realizado y compartido.

Tengo una duda sobre el Vscript que guarda y reemplaza el nombre del archivo (el primer caso que expones). Lo he copiado y cuando lo ejecuto con la regla prevista, me guarda el archivo recibido con un nombre nuevo “Data Sheet” y no me reemplaza el original. Le he dado vueltas al asunto pero no consigo ver el problema.

Espero puedas ayudarme.

Agradecido de antemano.
David

ROBERTO ROBLEDANO
Guest
ROBERTO ROBLEDANO

buenos dias,

como podria separarlo si el mismo remitente con el mismo asunto me manda dos correos con el mismo adjunto (por dentro es diferente) es decir el correo es exactamente igual a la misma hora y mismo asunto y nombre del adjunto pero quiero que me guarde ambos como independientes sin reemplazarlos. ¿como podria hacerlo?

Wilberth JAquez
Guest
Wilberth JAquez

José Alberto Medina30 julio, 2016 at 12:31 pm Hola, antes que nada muchas gracias por esta página y sobretodo por tu excelente labor compartiendo tus conocimientos en favor de los demás y resolviendo los problemas que con nuestro poco o mucho conocimiento no logramos solucionar. En mi caso aún no pruebo ninguno de los VBScript del principio de esta página ya que en mis ratos libres del trabajo voy leyendo cada uno de los mensajes y sus soluciones, por cierto excelentes. Con esto de la facturación electrónica en México y la recepción de archivos XML y PDF por correo muchas personas no entienden la importancia de guardar, organizar y controlar está información, de hecho aún siguen pensando que guardar el papel es más importante que guardar los archivos electrónicos (situaciones personales realmente vividas) y no se están preocupando por guardarlo y peor aún por organizarlos para su fácil y rápida consulta en caso de una revisión por parte de la autoridad. Trabajo en una empresa que aún tienen la forma de pensar que describí arriba pero yo veo todo lo contrario ya que soy parte de la comunidad informática y por eso quiero adelantarme a lo que algún día sucederá y al único que culparán es al informático de la empresa (es decir yo). Bueno después de tanto preámbulo lo que quiero hacer es guardar y organizar todos los correo de las facturas electrónicas que se reciban de nuestros proveedores, para esto ya tengo una dirección de correo exclusiva para dicho fin en Outlook 2010. Necesito guardar en carpetas los archivos XML y PDF que vienen en el mensaje de correo pero que el nombre de las carpetas sea el valor que viene en el atributo “Emisor rfc” del archivo XML y en caso de que no exista la carpeta… Leer mas»

Emanuel
Guest

Buenas, quiero hacer un script que configure mi outlock, eso puede ser?

Miguel Angel
Guest
Miguel Angel

Buen dia Fernando

Muchas Felicidades por el post ciertamente me ha ayudado mucho tu script, lamentablemente la macro me ha dejado de funcionar. Actualmente estoy utilizando Office 365 ProPlus, al querer revisar paso por paso “F8” no realiza accion alguna.. cuando quito esta parte (itm As Outlook.MailItem) corre pero evidentemente al llegar a itm.SenderName me marca error. podrias ayudarme de favor para detectar el problema que tengo…

Estoy utilizando tu script original

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
Dim dateFormat
Dim getFrom
Dim oFSO
Set oFSO = CreateObject(“Scripting.FileSystemObject”)

dateFormat = Format(Now, “yyyy-mm-dd H-mm”)
getFrom = itm.SenderName
saveFolder = “C:\Archivos\” & getFrom & “\”

If Not oFSO.FolderExists(saveFolder) Then
oFSO.Createfolder saveFolder
End If

For Each objAtt In itm.Attachments
objAtt.SaveAsFile saveFolder & “\” & dateFormat & ” – ” & objAtt.DisplayName
Set objAtt = Nothing
Set itm = Nothing
Next
End Sub

Muchas Gracias de antemano

NICOLAS D.
Guest
NICOLAS D.

Hola Fernando,

Muchas gracias por este gran aporte. Quisiera solicitarte una ayuda extra. Estoy usando tu script en Outlook 2013 para guardar archivos XML sin reemplazar archivos, el punto es que necesito separar los archivos XML entre los que llegan desde Proveedores (Facturas de Compra) y desde Clientes (Acuses de Recibo) para factura electrónica. Todos llegan al mismo correo electrónico.

Los asuntos de los mails recibidos no son uniformes, por lo que la única opción que tendría para separar los XML por carpeta o a través de 3 scripts para distintos destinos, sería si se pudiese crear un script para Outlook que pudiese leer dentro del archivo adjunto XML algún campo o atributo.

Para proveedores, el XML contiene el campo RutReceptor con el dato del Rut de mi empresa, la línea dice: 55555555-5

Para clientes, el XML contiene el campo RutRecibe con el dato del Rut de mi empresa, la línea del XML dice: 55555555-5

Si el script lograse leer el XML y utilizar esos criterios para definir una ruta para guardar el archivo sería espectacular.

Estuve leyendo este sitio http://analystcave.com/vba-xml-working-xml-files/ en el cual hacen manejo de XML con VB y se acerca un poco a lo que necesito, pero no se aplicarlo al Script de Outlook para leer el adjunto.

Otra opción sería que una vez descargado se usara otro script para buscar los criterios de Proveedor o Cliente y separase en una carpeta, pero tampoco lo se hacer.

De antemano muchas gracias.

NICOLAS D.
Guest
NICOLAS D.

Hola, muchas gracias por tu excelente artículo. Estoy usando el script para guardar XML con Outlook 2013 y ningún problema, graba todo lo que recibo. Mi pregunta es:

Es posible que en el script se pueda leer dentro de los campos contenidos en el archivo XML y si contiene un campo “A” con un dato “111111-1”, envíe el archivo a la carpeta “FolderA” y si contiene un campo “B” con un dato “111111-1” lo envíe a la carpeta “FolderB”?

Estuve viendo esta página (http://analystcave.com/vba-xml-working-xml-files/) y al parecer se podría hacer, pero no se como usarlo.

Gracias

arzuq03
Guest

Buenos días,

Tengo el siguiente codigo para ejecutar:
Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim paco As String
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
‘saveFolder = “D:\Usuarios\iecgp\Downloads\Adjuntos_Allot\”
For Each objAtt In itm.Attachments

paco = Left(objAtt.DisplayName, 12)
paco = Right(paco, 8)
If paco = “INTRANET” Then
saveFolder = “C:\prueba\”
objAtt.SaveAsFile saveFolder & “\” & objAtt.DisplayName
Set objAtt = Nothing
ElseIf paco = “INTERNET” Then
saveFolder = “D:\Informes_Allot\INTERNET\”
objAtt.SaveAsFile saveFolder & “\” & objAtt.DisplayName
Set objAtt = Nothing
Else
saveFolder = “D:\Informes_Allot\”
objAtt.SaveAsFile saveFolder & “\” & objAtt.DisplayName
Set objAtt = Nothing
End If
Next
End Sub

tengo el outlook 2013, me ha estado funcionando estos dias atras, pero hoy asi sin mas lo ejecuto con una regla a diario manualmente y hoy me ha dejado de funcionar, ejecuto la regla y la barra de ejecución se ejecuta pero no me descarga los ficheros en las carpetas correspondientes… Tengo windows 7 de 32 bits, no se que ha podido pasar…
Alguien me puede ayudar?

Jason Ben
Guest
Jason Ben

Hola muy util todo este aporte, 2 consultas amigo:

1. Qué deberia hacer para pasar estos scripts a un modo de ejecucion, es decir ejecutar la macros manualmente, es decir que empiece como Sub y no como Public Sub
2. Como hago para agregar la fecha de recepción del correo ya que con el dateFormat solo puedo poner la fecha con la que descargué los archivos.
Gracias!!!

arzuq03
Guest

Buenas, correcto, por cada mail con la direccion destino que pongo me sale el mensaje diciendo hola. No obstante debía ser algun error en los ficheros, pues ahora me ha vuelto a funcionar…

Muchas gracias por la ayuda.

arzuq03
Guest

Buenas, finalmente cerré el outlook y lo volví abrir y a día de hoy me ha funcionado… no entiendo porque dejaría de funcionar esos dias…
Gracias por el tiempo empleado. Un saludo.

Pablo Navia
Guest

Fernando, buenas… seguí todos los pasos para ejecutar script en Outlook y cuan lo ejecuto desde la regla me indica “Regla-nombre error El Script “” no existe o no es valido” poseo Outlook 2016

mi regla se llama DescargaXMLAdjuntos

estoy usando el siguiente script:

Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = “C:\XML\”
For Each objAtt In itm.Attachments
If (InStr(UCase(objAtt.DisplayName), “.XML”) Or (InStr(UCase(objAtt.DisplayName), “.PDF”))) Then
objAtt.SaveAsFile saveFolder & “\” & objAtt.DisplayName
End If
Next
End Sub

Jason Ben
Guest
Jason Ben

Hola Fernando ya no se que hacer ando muy pensativo, lo que pasa es que trato de que se guarden los archivo y comparo y comparo y no doy con el problema. Ayer te comente algo sobre mi problema hasta le puse un Msgbox “hola mundo” para ver si corria el script.
Hoy me pasé por otro post tuyo https://www.portalmastips.com/vbscript-guarda-los-archivos-adjuntos-la-carpeta-del-remitente-catalogado-fecha/ para ver si es que me corre el script con las reglas y parece que el problema esta en que no guarda ningun archivo, pero si me crea las carpetas, no se que podria estar mal ya que solo modificando la ruta en tu codigo deberia funcionar. Espero me puedas ayudar o haber visto un caso similar. Gracias.

Jason Ben
Guest
Jason Ben

Ahí lo copio, solo cambie la ruta de savefolder, le agregué un msgbox “hola” y uno de “adios”, para ver si corre el script y si me sale, pero nada de nada de descargar los archivos, espero me puedas ayudar porque hasta tensiona esto jeje, de repente has visto un caso similar y me aconsejes. Mi outlook 2010. Muchas gracias. Public Sub SCRIPT(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim strFileName As String Dim strNewName As String Dim fso Dim intExtlen As Integer Dim strPre As String Dim strExt As String Set fso = CreateObject(“Scripting.FileSystemObject”) Dim w As Integer MsgBox (“Hola”) saveFolder = “C:\Users\jhuamani.LOYALTY\Documents\Z\” ‘Revisa los adjuntos For Each objAtt In itm.Attachments strFileName = objAtt.DisplayName ‘Revisa si existe el archivo en la carpeta destino If fso.fileexists(saveFolder & “\” & strFileName) = True Then strNewName = strFileName intExtlen = Len(strFileName) – InStrRev(strFileName, “.”) + 1 ‘Revisa la extension del archivo If InStrRev(strFileName, “.”) > 0 Then strExt = Right(strFileName, intExtlen) strPre = Left(strFileName, Len(strFileName) – intExtlen) Else strExt = “” strPre = strFileName End If ‘Revisa que consecutivo asignar al nombre (1), (2), (3), etc. While fso.fileexists(saveFolder & “\” & strNewName) = True w = w + 1 strNewName = strPre & Chr(40) & w & Chr(41) & strExt Wend ‘ Asignar el nuevo nombre strFileName = strNewName w = 0 End If ‘Guardar archivo con nuevo nombre objAtt.SaveAsFile saveFolder & “\” & strFileName AttachmentCount = AttachmentCount + 1 Set objAtt = Nothing Next MsgBox (“Adios”) End Sub

David Paredes Rodriguez
Guest
David Paredes Rodriguez

Buenos días. He utilizado un refrito de las scripts que nos propones para conseguir: 1.- Extraer los adjuntos de los mails seleccionados y recibidos en el inbox en la carpeta seleccionada. 2.- Al tener varios adjuntos con el mismo nombre, he conseguido que me los renombre (1), (2)…. 3.- Como a veces el proceso tardaba un tiempo le he puesto un Userform que indique que está descargando adjuntos 3.- Finalmente con un MsgBox me avisa que ha terminado y me propone abrir la carpeta de destino. Realmente me ha ayudado mucho todo lo leído aquí y para alguien iniciándose en VBA es todo un logro haber conseguido todo esto. Aun me queda una cosa por conseguir y por mas que busco y pruebo soy incapaz. Quisiera que después de todos estos procesos, los correos seleccionados de los que he descargado los adjuntos se marcaran automáticamente como leídos. Alguna idea de como hacerlo?. Pego mi script a continuación. Hay algún proceso más que no he detallado, como limpiar la carpeta receptora antes de descargar adjuntos… Muchas gracias Sub GuardarAdjuntosNuevo() Dim FSOI As Object Dim MyPath As String Set FSOI = CreateObject(“scripting.filesystemobject”) MyPath = “Z:\Mensajes\” ‘< 0 Then ‘si hay algun adjunto For Each Adjunto In mensaje.Attachments ‘explora cada adjunto en el mensaje strFileName = Adjunto.DisplayName ‘Revisa si existe el archivo en la carpeta de destino If FSO.fileexists(Carpeta & “\” & strFileName) = True Then StrNewName = strFileName intExtlen = Len(strFileName) – InStrRev(strFileName, “.”) + 1 ‘Revisa la extension del archivo If InStrRev(strFileName, “.”) > 0 Then strExt = Right(strFileName, intExtlen) strPre = Left(strFileName, Len(strFileName) – intExtlen) Else strExt = “” strPre = FileName End If ‘Revisa que consecutivo asignar al nombre (1), (2), (3), etc. While FSO.fileexists(Carpeta & “\” & StrNewName) = True w = w + 1 StrNewName = strPre… Leer mas»

Daniel Hernán
Guest
Daniel Hernán

Hola Fernando, buenas tardes.

Muchas gracias por compartir tos conocimientos. Tengo una duda a ver si me puedes dar una mano: necesito que de los correos con un asunto puntual (siempre es el mismo) descargar los adjuntos y guardarlos sin reemplazar los que ya están.

He intentado uniendo códigos, pero no he podido.

GRACIAS POR LA AYUDA QUE ME PUEDAS BRINDAR.

Daniel Hernán
Guest
Daniel Hernán

Se les puede introducir fecha y hora para diferenciar, don procesos automáticos de sistema de los cuales recibo información. El nombre del adjunto siempre es el mismo. Muchas gracias.

Daniel Hernán
Guest
Daniel Hernán

Hola Fernando, buenos días:

Efectivamente yo tengo una regla para que los correos de ese destinatario me lleguen a una carpeta puntual, pero lo que no he conseguido es que los adjuntos de ese asunto lleguen a la carpeta que requiero para que desde allí hagan otro proceso.

La idea es que apenas ingrese el correo con el adjunto, me guarde una copia en la carpeta local y ya desde allí me realice otro proceso.

Ricardo Guerrero
Guest
Ricardo Guerrero

Hola Fernando:

Espero te encuentres bien….Te comento mi problema…resulta que modificando uno de tus script para descargar archivos adjuntos de tipo TXT en la cual se creo una regla par descargarlos y ademas de realizar las modificaciones pertinentes al centro de confianza de Macros en la cual se habilitó todas las macros y tambien verificando que el complemento VBA para Outlook estuviera ACTIVADO… funcionó la primera vez…pero despues de ahi ya no se ejecuto …ni siquiera aparece en el listado de macros en el editor de VBA al quererlo ejecutar…el codigo existe en el Modulo1…..he checado en varios foros y en uno de ellos parece que fue una actualizacion de Outlook de Junio de 2017.

Podrias apoyarme a resolver esto…La version de Outlook que uso es 2016.

En espera de tus comentarios.

Saludos.

Moctezuma Pichardo
Guest
Moctezuma Pichardo

Hola, buen día.

Antes que nada me gustaría agradecerte por el apoyo, personas que no sabemos mucho de programación realmente batallamos bastante desarrollando/modificando scripts. Estuve jugando con varios códigos de los que hay por aquí pero no logro realizar la modificación que requiero. Te explico: Recibo facturas diariamente por lo que almacenarlas se vuelve algo tedioso y de plano a veces ni lo hago. Lo que estoy tratando de lograr es crear una condición que chequee si en el correo viene un archivo .xml, de ser cierto debe descargar ese y los demas datos adjuntos (generalmente el pdf de la factura), si no viene xml no debe descargar nada. También estuve jugando con el autoguardado por carpeta con el nombre del remitente pero no logro hacerlo, las carpetas que va creando están vacías o crea carpetas repetidas, lo que hace que en 30 segundos me cree decenas de carpetas vacias con el mismo nombre del remitente pero diferente fecha/hora.

Te agradecería mucho si me apoyas con este tema, ya estuve una buena parte del día batallando con esto y no lo puedo lograr. XC

Saludos y

Pablo Navia
Guest

Fernando, estoy utilizando el código que sugeriste y me da el error ‘-2147024894 (80070002)’ en tiempo de ejecución: No se pudo guardar los datos adjuntos. No se encuentra el archivo…..

esto me pasa cuando el correo posee mas de un archivo adjunto y en este caso tiene un XML y un PDF y se cae en la línea objAtt.SaveAsFile saveFolder & objAtt.DisplayName

que me sugieres?

saludos…
Pablo

Neiser Custodio Pizan
Guest
Neiser Custodio Pizan

Hola Fernando Disculpa, como haría para especificar de que carpeta quiero que me descargue los archivos adjuntos, ya que quiero que me descargue los adjuntos solamente de la “Bandeja de Entrada” Espero que respondas..
Saludos!!!

Marcelo bussetti
Guest
Marcelo bussetti

Fernando, sólo darte las gracias. Los scripts son plenamente funcionales y la explicación de implementación fácil de seguir.
Mil gracias!!!

Miriam
Guest
Miriam

Hola Fernando
Una consulta como hago si deseo que el nombre del archivo del fiel extraido del outlook convserve el nombre del archivo persé,
Estoy usando la siguiente script
Public Sub saveAttachtoDisk(itm As Outlook.MailItem)
Dim objAtt As Outlook.Attachment
Dim saveFolder As String
saveFolder = “C:\XML\”
For Each objAtt In itm.Attachments
If ((InStr(objAtt.DisplayName, “.xml”) Or InStr(objAtt.DisplayName, “.pdf”))) Then
objAtt.SaveAsFile saveFolder & “\” & objAtt.DisplayName
End If
Next
End Sub

Pero en el nombre del archivo me sale todo esto:
{BE} CASE-Status-1-YYY-26-Jun-2018-165518.626.pdf

Mi archivo adjunto se llama: Status-1-YYY-26-Jun-2018-165518.626

Quisiera que sólo se llame: Status-1-YYY-26-Jun-2018

Gracias:

Paul Ludeña
Guest
Paul Ludeña

Hola, mi consulta es si se puede modificar el nombre al descargarse los archivos. En mi caso, la descarga se da cuando se trata de ciertos remitentes, es por eso que, he especificado “cierto texto” en la dirección de remitente. Dado que se trata de algunas empresas, me serviría mucho que los documentos que se descargan se guarden con el nombre de la empresa o con el criterio del texto que he indicado al script. Asimismo, quiero que este archivo sea reemplazado porque solo es uno por día y no me es relevante guardar un histórico. Gracias de antemano. Saludos

Compartir2
Twittear
Pin