VBA Outlook 2003 - Dateien automatisch versenden

  • #1
M

Mr_Tom

Bekanntes Mitglied
Themenersteller
Dabei seit
06.04.2005
Beiträge
211
Reaktionspunkte
0
Hallo.

Ich habe folgendes Problem. Ich muss regelmäßig *.csv Dateien in einzelnen Mails an eine bestimmte Adresse schicken. Da ich bei >50 Dateien leicht aus dem Rhythmus komme, welche bereits Versand ist und welche nicht, war meine Idee eine Prozedur zu schreiben, die die Dateien zählt, für jede eine neue Mail anlegt und jeweils eine dieser Dateien anhängt. Der automatische Emailversand steht bereits:

Code:
Option Explicit
Sub senden()

Dim fso As Object, a as Byte
Dim ol As Outlook.Application
Dim olMail As MailItem

Set ol = CreateObject(Outlook.Application)
Set olMail = ol.CreateItem(olMailItem)
Set fso = CreateObject(Scripting.Filesystemobject)


For a = 1 To fso.getfolder(C:/bla/bla).Files.Count

With olMail
  .To = email@empfänger.de
  .Subject = Betreff
  .Attachments.Add (strgAnhang)-> hier soll jeweils die nächste Datei eingefügt werden
  .Send
End With

Set olMail = Nothing
Set ol = Nothing
Set fso = Nothing


Next a
End Sub

Komme hier leider nicht weiter. Wer kann mir helfen?

Dankeschön
 
  • #2
Hallo Mr_Tom,

also mir stellen sich noch einige Fragen:

a) Aus welchem Programm heraus soll das makro gestartet werden ?
b) Wie wird der Zusammenhang csv-datei <-> mail-Adresse hergestellt (Excel-Tabelle ?) ?
c) Wo ist der Ablageort der jeweiligen Datei beschrieben (Excel-Tabelle) ?
d) Warum werden nicht alle Dateien gleichzeitig versendet ?
e) Wenn Zähler, wie und wann soll der wieder zurückgesetzt werden ?
...
Beschreib bitte den Prozess mal etwas ausführlicher.

Matjes :)
 
  • #3
Hallo Matjes.

Nach Möglichkeit soll das Makro direkt aus MS Outlook 2003 gestartet werden. Die Mailadresse ist immer
die gleiche, der Zusammenhang zwischen Datei und Mailadresse muss somit nicht auf besondere Weise hergestellt werden. Der Ablageort der Dateien ist auch statisch, es sollen immer alle Dateien des Ordners C:/bla/bla versendet werden. Bei der Empfängeradresse handelt es sich um eine Systemadresse, die leider immer nur einen Mailanhang verarbeiten kann, deswegen können nicht alle Dateien in eine Mail eingefügt werden, es darf immer nur eine Datei pro Mail gesandt werden. Der Zähler soll einmal alle Dateien im Ordner zählen, diese Anzahl an Mails schreiben und anschließend werden die Dateien manuell von mir gelöscht. Beim nächsten Durchlauf dann halt wieder von vorn.
Ich hoffe ich konnte Dir ausführliche Informationen liefern, ich komme bei diesem Thema allein leider immernoch nicht weiter.

Vielen Dank
 
  • #4
Mr_Tom schrieb:
Der Ablageort der Dateien ist auch statisch, es sollen immer alle Dateien des Ordners C:/bla/bla versendet werden. Bei der Empfängeradresse handelt es sich um eine Systemadresse, die leider immer nur einen Mailanhang verarbeiten kann, deswegen können nicht alle Dateien in eine Mail eingefügt werden, es darf immer nur eine Datei pro Mail gesandt werden.

Wer oder was hindert dich daran, die Datein vor dem Versand in ein Archiv (.zip oder .rar) zu packen? ???
 
  • #5
Wie gesagt, die Empfängeradresse ist eine Systemadresse, die die *.csv Dateien automatisch weiterverarbeitet und lediglich einen Anhang pro Mail im *.csv Format lesen kann.
 
  • #6
Die Dateien lassen sich vor der Weiterverarbeitung nicht wieder auspacken?

Wer keine Arbeit hat, macht sich halt welche. :)
 
  • #7
Hallo ex tempore,

das Leben könnte ja so einfach sein ... Leider habe ich auf die Verarbeitung nach dem Versandt meiner Mail keinen Einfluss.
 
  • #8
Hallo Mr_Tom,

dann probier es mal mit folgendem Makro. Die Konstanten mußt du noch an deine Gegebenheiten anpassen.

Gruß Matjes :)
Code:
Sub OL_DateienImVerzVersenden()

 Const c_VERZEICHNIS_PFAD = C:/bla/bla
 Const c_FILES_EXTENSION = .csv
 
 Dim f() As String->Feld für LangeDateiNamen

 If Not FilesImVerzeichnisBestimmen(c_VERZEICHNIS_PFAD, c_FILES_EXTENSION, f()) Then GoTo AUFRAEUMEN
 If Not FilesPerOutlookVersenden(f()) Then GoTo AUFRAEUMEN

AUFRAEUMEN:
End Sub

'************************************************************************
Private Function FilesPerOutlookVersenden(f() As String) As Boolean

 Const c_MAIL_ADRESSE = [email protected]
 Const c_MAIL_BETREFF = mail an mein Programm
 Const c_MAIL_TEXT = Dies ist eine automatisch erstellte mail.
 
 Dim oOL As Outlook.Application
 Dim oMail As MailItem
 Dim x As Long

 On Error GoTo AUFRAEUMEN

 Set oOL = New Outlook.Application
 For x = LBound(f()) To UBound(f())
  Set oMail = oOL.CreateItem(olMailItem)
  With oMail
    .To = c_MAIL_ADRESSE
    .CC = 
    .BCC = 
    .Subject = c_MAIL_BETREFF
    .Body = c_MAIL_TEXT
    .Attachments.Add f(x)
    .OriginatorDeliveryReportRequested = False
    .ReadReceiptRequested = False
       ->.Display->mit .Display wird die mail erzeugt, aber nicht abgeschickt werden.
   -> .Send ist in diesem Fall auszukommentieren
    .Send
  End With
  Set oMail = Nothing
 Next
 Set oOL = Nothing

 FilesPerOutlookVersenden = True
AUFRAEUMEN:
 If Err.Number <> 0 Then
  MsgBox _
  FehlerNr:  & Err.Number & vbLf & _
  Beschreibung:  & Err.Description & vbLf, _
  vbOKOnly, Fehler beim Mail-Versand
 End If
End Function

'************************************************************************
Private Function FilesImVerzeichnisBestimmen(sPfad As String, sExtension As String, f() As String) As Boolean

 Dim oFso As Object, oFiles As Object, oF As Object
 Dim fCnt As Long, x As Long
 Dim sName As String

-> Verweis auf das FileSystemObject erstellen
 On Error Resume Next: Set oFso = CreateObject(Scripting.FileSystemObject): On Error GoTo 0
 If oFso Is Nothing Then
  MsgBox Scripting.FileSystemObject nicht vorhanden.
  GoTo AUFRAEUMEN
 End If

->prüfen, ob der Pfad vorhamdem ist
 If Not oFso.FolderExists(sPfad) Then
  MsgBox Verzeichnis nicht vorhanden:  & vbLf & sPfad: GoTo AUFRAEUMEN
 End If
 Set oFiles = oFso.getFolder(sPfad).Files

->prüfen, ob Files vorhamden sind
 If oFiles.Count < 1 Then
  MsgBox Keine Datei im Verzeichnis vorhanden:  & vbLf & sPfad
  GoTo AUFRAEUMEN
 End If
 
->Dateiendung prüfen, vollen Dateinamen merken
 fCnt = 0
 ReDim f(1 To oFiles.Count)
 For Each oF In oFiles
  sName = oF.Name
  If LCase(Right(sName, Len(sExtension))) = LCase(sExtension) Then
   fCnt = fCnt + 1
   f(fCnt) = oF.Path
  End If
 Next
 
->prüfen, ob relevante Files vorhanden sind
 If fCnt < 1 Then
  MsgBox Keine relevanten Dateien im Verzeichnis vorhanden:  & vbLf & sPfad
  GoTo AUFRAEUMEN
 End If
 ReDim Preserve f(1 To fCnt)
 
 FilesImVerzeichnisBestimmen = True
AUFRAEUMEN:
 On Error GoTo 0
 Set oFso = Nothing: Set oFiles = Nothing: Set oF = Nothing
End Function
 
  • #9
Vielen Dank Matjes,

es funktioniert ausgezeichnet. Die genaue Funktionsweise konnte ich mir allerdings noch nicht anschauen, werde dies aber noch tun.
 
Thema:

VBA Outlook 2003 - Dateien automatisch versenden

ANGEBOTE & SPONSOREN

Statistik des Forums

Themen
113.840
Beiträge
707.963
Mitglieder
51.494
Neuestes Mitglied
Flensburg45
Oben