Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Mail per VBA mit PDF-Anhang

Forumthread: Mail per VBA mit PDF-Anhang

Mail per VBA mit PDF-Anhang
Ralf
Hallo,
ich werkle schon geraume Zeit an folgendem Problem rum:
Ich muss für einen Kunden aus einer Excel-Mappe heraus eine Mail versenden können.
Dabei gibt es folgende Bedingungen:
1. Als Attachement gibt es eine PDF-Datei, die vorher erzeugt wurde.
(Name und Speicherpfad sind bekannt)
2. Die Anwender haben als Mail-Client meistens Novell Groupwise oder Lotus Notes,
selten auch MS Outlook (muss also unabhängig von dieser Software funktionieren).
3. Es muss übergeben werden: eine Empfänger-Adresse, ein Subject und das Attachement.
Der Befehl Application.Dialogs(xlDialogSendMail).Show kommt nicht in Frage, da Attachements
nicht definiert werden können.
Ich habe beim Suchen die Windows API-Funktion ShellExecute gefunden.
Aber in keiner Dokumentation stand die Übergabe eines Attachements erläutert.
Ich bin für alle Ideen und Lösungsansätze sehr dankbar.
Grüße
Ralf
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Mail per VBA mit PDF-Anhang
05.02.2012 22:14:08
Ralf
Hallo Sepp,
vielen Dank für Deinen Hinweis.
Ich habe auch schon überlegt, Blat zu benutzen (auch ein bekanntes Plattform-unabhängiges Tool)
zu benutzen, da ich damit Erfahrungen habe. Ich möchte aber, da es um ca. 250 Anwender geht,
nichts mit zusätzlichen Installationen etc. zu tun haben.
Daher bevorzuge ich eine Lösung, die ich mit VBA-Bordmitteln hinbekomme.
Gruß
Ralf
Anzeige
AW: Mail per VBA mit PDF-Anhang
05.02.2012 22:21:06
Josef

Hallo Ralf,
für CDO braucht nichts installiert zu werden!

« Gruß Sepp »

Anzeige
AW: Mail per VBA mit PDF-Anhang
06.02.2012 21:55:37
Ralf
Hallo Sepp,
sorry, hab es mir nicht so genau angesehen, aber Du hast Recht.
Wenn ich etwas mehr Zeit habe, werde ich es ausprobieren.
Vielen Dank noch mal.
Grüße
Ralf
AW: Mail per VBA mit PDF-Anhang
08.02.2012 21:59:46
Ralf
Hallo Sepp,
ich habe die Prozedur nach Vorlage entwickelt:
Sub Mail_Senden()
Dim objMessage As Object
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Example CDO Message"
objMessage.From = "mail@compucare-ac.de"
objMessage.To = "mail@compucare-ac.de"
objMessage.TextBody = "This is some sample message text."
objMessage.AddAttachment "D:\CC\Kunden\regio iT\Bestellungen aus Warenkorb\Test.pdf"
objMessage.Send
End Sub
Die Bibliothek ist per Verweis eingebunden, aber das Senden klappt nicht.
Es kommt auch kein Err-Code zurück.
Hast Du eine Idee?
Grüße
Ralf
Anzeige
AW: Mail per VBA mit PDF-Anhang
08.02.2012 22:07:52
Josef

Hallo Ralph,
ich glaube, da fehlt noch einiges, bei mir sieht der Code z. B. so aus.
' **********************************************************************
' Modul: Modul2 Typ: Allgemeines Modul
' **********************************************************************

Option Explicit

'Don't Change!
Private Const cstrSchema As String = "http://schemas.microsoft.com/cdo/configuration/"
'End Don't Change!

Private Const cstrSMTPServer As String = "mail.provider.com" 'Fill in your SMTP-Server!
Private Const cstrUSERNAME As String = "Your Username" 'Fill in your Mailaccount Username
Private Const cstrPASSWORD As String = "Your Password" 'Fill in your Mailaccount Password
Private Const cstrADDRESS As String = "name@domain.com" 'Your Mail-Address

Sub sendMail_CDO()
  'original code from http://www.rondebruin.nl/cdo.htm
  Dim rng As Range, rngF As Range
  Dim objMsg As Object, objConf As Object
  Dim vntFields As Variant, strBody As String
  Dim vntAttach As Variant, lngIndex As Long
  
  'Body - always use vbCrLf or vbNewLine to separate lines, don't use vbLf!
  Const strMsg As String = vbCrLf & vbCrLf & "Anbei die Datei zur Einsicht." & vbCrLf & vbCrLf & _
    "Mit freundlichen Grüßen." & vbCrLf & "Ich"
  
  'Attachment(s)
  'One File
  Const cstrAttachment As String = "C:\Testfile.txt"
  
  ''More Files
  'Const cstrAttachment As String = "C:\Testfile.txt;C:\AnotherFile.pdf"
  
  ''None
  'Const cstrAttachment As String = ""
  
  On Error GoTo ErrExit
  
  Set objMsg = CreateObject("CDO.Message")
  Set objConf = CreateObject("CDO.Configuration")
  
  objConf.Load -1 ' CDO Source Defaults
  Set vntFields = objConf.Fields
  With vntFields
    .Item(cstrSchema & "sendusing") = 2
    .Item(cstrSchema & "smtpserver") = cstrSMTPServer
    .Item(cstrSchema & "smtpserverport") = 25
    
    'When you also get the Authentication Required Error you can add this three lines.
    ' .Item(cstrSchema & "smtpauthenticate") = 1
    ' .Item(cstrSchema & "sendusername") = cstrUSERNAME
    ' .Item(cstrSchema & "sendpassword") = cstrPASSWORD
    
    .Update
  End With
  
  With Application
    .EnableEvents = False
    .ScreenUpdating = False
  End With
  
  With Sheets("Tabelle1")
    Set rngF = .Range(.Cells(2, 8), .Cells(.Cells(.Rows.Count, 8).End(xlUp).Row, 8))
  End With
  
  'Mailadressen stehen in Spalte H, Namen mit Anrede in Spalte G
  For Each rng In rngF
    If rng Like "*@*.*" Then
      With objMsg
        strBody = "Sehr geehrte" & IIf(Left(rng.Offset(0, -1).Text, 1) = "F", " " & _
          rng.Offset(0, -1).Text, "r " & rng.Offset(0, -1).Text) & "!" & strMsg
        
        Set .Configuration = objConf
        .To = rng.Text
        .CC = ""
        .BCC = ""
        .From = cstrADDRESS 'Absender
        .Subject = "Testmail" 'Betreff
        .TextBody = strBody
        
        If Len(cstrAttachment) Then
          vntAttach = Split(cstrAttachment, ";")
          For lngIndex = 0 To UBound(vntAttach)
            If Dir(vntAttach(lngIndex), vbNormal) <> "" Then .AddAttachment vntAttach(lngIndex)
          Next
        End If
        
        ' ' Set importance or Priority to high
        ' .Fields("urn:schemas:httpmail:importance") = 2
        ' .Fields("urn:schemas:mailheader:X-Priority") = 1
        '
        ' ' Request read receipt
        ' .Fields("urn:schemas:mailheader:return-receipt-to") = cstrADDRESS
        ' .Fields("urn:schemas:mailheader:disposition-notification-to") = cstrADDRESS
        '
        ' ' Update fields
        ' .Fields.Update
        
        .Send
      End With
    End If
  Next
  
  ErrExit:
  
  If Err.Number <> 0 Then
    MsgBox "Fehler:" & vbTab & Err.Number & vbLf & vbLf & Err.Description & _
      vbLf & vbLf, vbExclamation, "Fehler"
  End If
  
  With Application
    .EnableEvents = True
    .ScreenUpdating = True
  End With
  
  Set rng = Nothing
  Set rngF = Nothing
  Set objConf = Nothing
  Set objMsg = Nothing
End Sub



« Gruß Sepp »

Anzeige
;
Anzeige

Infobox / Tutorial

Mailversand per VBA mit PDF-Anhang in Excel


Schritt-für-Schritt-Anleitung

Um eine E-Mail mit PDF-Anhang über VBA in Excel zu versenden, kannst Du die CDO (Collaboration Data Objects) Bibliothek verwenden. Hier ist eine Schritt-für-Schritt-Anleitung:

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Neues Modul hinzufügen: Klicke mit der rechten Maustaste im Projekt-Explorer und wähle Einfügen > Modul.

  3. CDO-Bibliothek einfügen: Stelle sicher, dass Du die CDO-Bibliothek in Deinem Projekt hast. Du kannst dies in den Referenzen überprüfen.

  4. Code einfügen: Kopiere den folgenden Code in das Modul:

    Sub Mail_Senden()
       Dim objMessage As Object
       Set objMessage = CreateObject("CDO.Message")
       objMessage.Subject = "Dein Betreff"
       objMessage.From = "deine.email@domain.com"
       objMessage.To = "empfaenger@domain.com"
       objMessage.TextBody = "Hier ist der Text Deiner E-Mail."
       objMessage.AddAttachment "D:\Pfad\zur\Datei.pdf"
       objMessage.Send
    End Sub
  5. Anpassungen vornehmen: Ändere die E-Mail-Adressen, den Betreff und den Dateipfad entsprechend Deinen Anforderungen.

  6. Makro ausführen: Speichere und führe das Makro aus, um die E-Mail zu senden.


Häufige Fehler und Lösungen

  • Fehler: Keine Fehlercodes zurück: Wenn das Senden nicht funktioniert und kein Fehlercode zurückgegeben wird, stelle sicher, dass die SMTP-Server-Einstellungen korrekt sind. Füge eventuell Authentifizierungsdetails hinzu.

  • Problem mit Anhang: Wenn der Anhang nicht gesendet wird, überprüfe den Pfad zur PDF-Datei. Stelle sicher, dass die Datei existiert und der Pfad korrekt ist.


Alternative Methoden

Falls Du eine plattformunabhängige Lösung suchst, kannst Du auch mailto verwenden, um eine E-Mail zu generieren. Beachte jedoch, dass dies in der Regel keine Anhänge unterstützt. Eine Alternative wäre die Verwendung von Blat, das jedoch zusätzliche Installationen erfordert.

Hier ein Beispiel für mailto:

Sub MailtoMitAnhang()
    Dim email As String
    email = "mailto:empfaenger@domain.com?subject=Betreff&body=Hier ist der Text."
    Shell "cmd /c start " & email, vbHide
End Sub

Praktische Beispiele

Hier ist ein Beispiel, wie Du eine E-Mail an eine Liste von Empfängern in einer Excel-Tabelle versenden kannst. Angenommen, die E-Mail-Adressen stehen in Spalte A:

Sub MailAnListe()
    Dim rng As Range
    Dim cell As Range
    Set rng = ThisWorkbook.Sheets("Tabelle1").Range("A1:A10") ' Bereich anpassen

    For Each cell In rng
        If cell.Value Like "*@*.*" Then
            Mail_Senden cell.Value
        End If
    Next cell
End Sub

Tipps für Profis

  • Error Handling: Füge Error-Handling in Deinen Code ein, um Fehler besser zu diagnostizieren. Verwende On Error GoTo um gezielte Fehlerbehandlungen zu implementieren.

  • SMTP-Server Konfiguration: Achte darauf, die korrekten SMTP-Serverdaten für die E-Mail zu verwenden. Diese findest Du in der Regel im Handbuch Deines E-Mail-Anbieters.

  • Testumgebung: Teste Deine VBA-Lösungen in einer sicheren Umgebung, bevor Du sie in einer Produktionsumgebung einsetzt.


FAQ: Häufige Fragen

1. Kann ich E-Mails ohne SMTP-Server senden? Es ist nicht möglich, E-Mails ohne einen SMTP-Server zu versenden. Du benötigst die Serverdaten Deines E-Mail-Anbieters.

2. Funktioniert das auch mit Groupwise? Ja, das Senden von E-Mails über CDO sollte auch mit Groupwise funktionieren, solange die entsprechenden SMTP-Einstellungen korrekt sind.

3. Wie kann ich den Anhang als PDF versenden? Du kannst den Anhang in der AddAttachment-Methode angeben. Stelle sicher, dass der Pfad zur PDF-Datei korrekt ist.

4. Was ist, wenn ich die Signatur ändern möchte? Die Signatur kann in den E-Mail-Einstellungen Deines E-Mail-Clients angepasst werden. VBA hat darauf keinen Einfluss.

5. Wie kann ich mehrere Anhänge hinzufügen? Du kannst mehrere Dateien mit AddAttachment hinzufügen, indem Du sie in einer Schleife bearbeitest oder die Pfade durch ein Trennzeichen wie ";" angeben.

6. Ist dies in allen Excel-Versionen kompatibel? Diese Anleitung sollte in den meisten aktuellen Excel-Versionen funktionieren, die VBA unterstützen, einschließlich Excel 2010 und neuer.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige