2008-12-30 9 views
5

Escribí una aplicación VBA que abre una carpeta en Outlook y luego repite los mensajes. Necesito escribir los cuerpos del mensaje (con algunos ajustes) en un solo archivo plano. Mi código es el siguiente ...Escribir mensajes de correo electrónico a archivos planos en Outlook con VBA

Private Sub btnGo_Click() 
    Dim objOutlook As New Outlook.Application 
    Dim objNameSpace As Outlook.NameSpace 
    Dim objInbox As MAPIFolder 
    Dim objMail As mailItem 
    Dim count As Integer 

    Set objNameSpace = objOutlook.GetNamespace("MAPI") 
    Set objInbox = objNameSpace.GetDefaultFolder(olFolderInbox) 
    count = 0 

    For Each objMail In objInbox.Items 
     lblStatus.Caption = "Count: " + CStr(count) 
     ProcessMailItem (objMail) 
     count = count + 1 
    Next objMail 

    End If 
End Sub 

La pieza en cuestión es "ProcessMailItem". Como no estoy demasiado preocupado por el rendimiento en esta etapa, la muy ineficaz metodología de archivo "abrir, adjuntar, cerrar" está bien para este ejemplo.

Sé que podría pasar algún tiempo buscando la respuesta con google, pero lo miré primero y no hubo buenas respuestas para esto. Como soy fanático de Stackoverflow, espero que poner esto aquí ayude a los futuros desarrolladores a buscar respuestas. Gracias por su paciencia.

Respuesta

6

Puede salirse con la escritura en un archivo sin necesidad de utilizar ningún objeto, simplemente utilizando el construido en VBA herramientas de archivo:

Open "C:\file.txt" for append as 1 
Print #1, SomeStringVar 
Close #1 
+0

elegí esta respuesta porque es muy VBA céntrica. ¡La respuesta de Eric Ness también es válida! – Craig

4

Si no le importa volver a abrir el archivo de salida cada vez que agrega texto, esto debería funcionar.

Private Sub ProcessMailItem(objMail As MailItem) 

    Dim fso As New FileSystemObject 
    Dim ts As TextStream 

    Set ts = fso.OpenTextFile("C:\Outputfile.txt", ForAppending, True) 

    ts.Write(objMail.Body) 

    ts.Close() 
    Set ts = Nothing 
    Set fso = Nothing 

End Sub 

También deberá agregar una referencia a la biblioteca Microsoft Scripting Runtime. Esto tiene FileSystemObject en él.

1

También tiene que cuidar de la ventana emergente de seguridad "tratar de acceder a direcciones de correo electrónico "que se cubre en Outlook "Object Model Guard" Security Issues for Developers

Public Sub ProcessMailItem(objMail As MailItem) 
Dim FSO As New FileSystemObject 
Dim ts As TextStream 
Dim loc As String 
Dim subject As String 
Dim strID As String 
' per http://www.outlookcode.com/article.aspx?ID=52 
Dim olNS As Outlook.NameSpace 
Dim oMail As Outlook.MailItem 

strID = MyMail.EntryID 
Set olNS = Application.GetNamespace("MAPI") 
Set oMail = olNS.GetItemFromID(strID) 
subject = oMail.subject 
Set ts = FSO.OpenTextFile("C:\Documents and Settings\tempuser\My Documents\EMAILS\" + subject, ForAppending, True) 
ts.Write (oMail.Body) 
ts.Close 
Set ts = Nothing 
Set FSO = Nothing 
Set oMail = Nothing 
Set olNS = Nothing 

End Sub

+0

todavía hay algún problema con la ruta en el OpenTextFile. No obtengo resultados consistentes en esa ruta frente a una ruta más corta sin espacios. – jim

Cuestiones relacionadas