Access-o-Mania

Access-Forum (Deutsch/German) => Access Programmierung => Thema gestartet von: thorstens1304 am August 05, 2011, 09:46:48

Titel: Mail mit Anhang aus VBA
Beitrag von: thorstens1304 am August 05, 2011, 09:46:48
Hallo,

wie kann ich über ein VBA Script eine Mail inklusive einer Excel Datei im Anhang versenden?
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: database am August 05, 2011, 09:59:31
Hallo,

Wenn du auf der Seite mit deinem Beitrag nach unten scrollst kommt folgendes zum Vorschein ... ;)

http://www.access-o-mania.de/forum/index.php?topic=4167.0 (http://www.access-o-mania.de/forum/index.php?topic=4167.0)

HTH


Titel: Re: Mail mit Anhang aus VBA
Beitrag von: thorstens1304 am August 12, 2011, 10:08:01
Hallo,

erst einmal Danke für den Hinweis. Leider kriege ich in der Zeile:

Dim ool As Outlook.Application

den Fehler "Benutzerdefinierter Typ nicht definiert". Was muss ich ändern?
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: database am August 12, 2011, 11:19:38
Hallo,

du musst im VB-Editor unter Extras Verweise einen Verweis auf die 'Microsoft Outlook xx.0 Object Library' setzen

xx steht für deine Verwendetet Office-Version (10, 11, 12, 14)

HTH
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: thorstens1304 am August 12, 2011, 12:53:38
Aah Danke. der Fehler ist weg. Ein kleines Problem noch: Die Mail wird geöffnet aber nicht versandt. Wie kriege ich die noch automatisch versendet?

Public Function SendMail(Empfaenger, Anhang, Betreff As String)
  Dim ool As Outlook.Application
  Dim oMail As Outlook.MailItem
'Anhang
  Dim myattachments As Variant


  ' Verweis zu Outlook + neue Nachricht
  Set ool = CreateObject("Outlook.Application")
  Set oMail = ool.CreateItem(olMailItem)
  Set myattachments = oMail.Attachments

  ' Befreff-Zeile
  oMail.Subject = Betreff

  ' An-Zeile (Empfänger)
  oMail.To = Empfaenger
  oMail.Display

  ' Texteingabe (Nachricht selbst)
  oMail.Body = "Hallo, anbei finden Sie die Kundendaten zu den Ihnen aktuell übersandten Lizenzbestellungen."
           
           
  myattachments.Add Anhang
End Function
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Jonny am August 12, 2011, 13:04:27
Hallo versuch es mal hiermit:

SendKeys "%s"

am Ende der Function.

Gruß

Johann

Titel: Re: Mail mit Anhang aus VBA
Beitrag von: database am August 12, 2011, 13:27:03
Hallo,

im Code steht ja auch, dass sie angezeigt werden soll  --->   oMail.Display
Von Senden ist da nix ...   ;)

versuch mal so:


Public Function SendMail(Empfaenger, Anhang, Betreff As String)
 Dim ool As Outlook.Application
 Dim oMail As Outlook.MailItem
'Anhang
 Dim myattachments As Variant


 ' Verweis zu Outlook + neue Nachricht
 Set ool = CreateObject("Outlook.Application")
 Set oMail = ool.CreateItem(olMailItem)
 Set myattachments = oMail.Attachments

 ' Befreff-Zeile
 oMail.Subject = Betreff

 ' An-Zeile (Empfänger)
 oMail.To = Empfaenger
 ' Texteingabe (Nachricht selbst)
 oMail.Body = "Hallo, anbei finden Sie die Kundendaten zu den Ihnen aktuell übersandten Lizenzbestellungen."
                 
 myattachments.Add Anhang

'-------- Mail versenden -----
 oMail.Send
'----------------------------------

End Function



HTH
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am Februar 27, 2013, 15:08:17
Hallo zusammen,

ich hänge bei dieser Sache. Der Code funktioniert soweit außer dass es mit den Anhang aus dem Datensatz nicht anfügt, sondern einen Fehler produziert.
ZitatLaufzeitfeler '440' Die Dateianlage kann nicht hinzugefügt werden. Es wurde keine Datenquelle bereitgestellt.

Wenn ich im Code eine Datei direkt angebe "C:\temp\xxx.pdf" funktioniert es. Also stimmt wohl irgendwas mit dem Verweis auf das Feld "Anlage" nicht. Ich habe es auch schon mit anlage.Value, Anlage.FileData und Anlage.FileName versucht, aber das funktioniert auch nicht.

Mein Code als Sub (bin zu blöd eine public function aufzurufen)  ;)
Private Sub Befehl19_Click()

Dim Empfaenger, Anlage, Betreff As String
   Dim ool As Outlook.Application
  Dim oMail As Outlook.MailItem
'Anhang
  Dim myattachments As Variant


  ' Verweis zu Outlook + neue Nachricht
  Set ool = CreateObject("Outlook.Application")
  Set oMail = ool.CreateItem(olMailItem)
  Set myattachments = oMail.Attachments

  ' Befreff-Zeile
  oMail.Subject = Betreff

  ' An-Zeile (Empfänger)
  oMail.To = Empfaenger
  oMail.Display

  ' Texteingabe (Nachricht selbst)
  oMail.Body = "Hallo, anbei finden Sie die Kundendaten zu den Ihnen aktuell übersandten Lizenzbestellungen."
           
           
  myattachments.Add Anlage
 

End Sub


Bin ratlos!
Gruß
Klaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: DF6GL am Februar 28, 2013, 10:11:44
Hallo,

"Anlage"  ist eine Variant-Variable und nirgends initialisiert/gesetzt... Was soll da angehängt werden?


Außerdem wäre es besser "Empfaenger" und "Anlage" als vom Datentyp TEXT zu deklarieren.

Wenn der Dateiname für die EMail-Anlage aus einem Anlage-Feld in einer Tabelle stammt, dann muss mit z. B. der Recordset-Eigenschaft des Anlage-Feldes der eigentliche Dateiname extrahiert und einer String-Variablen zugewiesen werden, die wiederum bei der .Add-Methode benutzt wird.


Wenn "Betref"f und "Empfaenger" (evtl. gebundene)  Form-Textfelder sind , dann wäre syntaktischer eher so zuschreiben:

oMail.Subject = nz(Me!Betreff,"kein Betreff")
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am März 05, 2013, 15:30:36
Hallo,

jetzt offenbahrt sich, dass ich von VBA keine Ahnung habe.

Ich dachte "...as String" ist gleich mit "Text" (gibt übrigens eine Fehlermeldung).

Ich habe das Feld mal umbenannt in Anhang (um es deutlich vom Typ zu unterscheiden) und dem Feld den Dateinamen zugewiesen (das klappt auch), aber ich bekomme trotzdem einen Fehler.
Zitat(Die Datein kann nicht gefunden werden. Überprüfen sie den Pfad und Dateinamen.)

Private Sub Befehl19_Click()

Dim Empfaenger, Betreff, Anhang As String
   Dim ool As Outlook.Application
  Dim oMail As Outlook.MailItem
'Anhang
  Dim myattachments As Variant

...
           
  Anhang = Me.Anlage.FileName
             
  myattachments.Add Anhang
 


End Sub


...das mit dem Recordset habe ich nicht verstanden.

Gruß
KLaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: DF6GL am März 05, 2013, 15:52:59
Hallo,

irgendwie geht es aneinander vorbei..



Private Sub Befehl19_Click()

Dim txtEmpfaenger As String, txtBetreff as String, txtAnhang As String
   Dim ool As Outlook.Application
  Dim oMail As Outlook.MailItem
'Anhang
  Dim myattachments As Object...
  Dim rs as Dao.Recordset
set rs = Me!Anlage.Value       
  txtAnhang = rs(0)!FileName  'evtl. noch Filetype berücksichtigen
  .
.
.           
  myattachments.Add txtAnhang
 


End Sub
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am März 05, 2013, 17:04:48
HAllo Franz,

habe jetzt Deinen Code versucht.

Allerding bleibt er bei
"Set rs = Me!Anlage.Value" hängen mit der Fehlermeldung: "Objekt unterstützt diese Eigenschaft oder Methode nicht"

???

Gruß
Klaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: DF6GL am März 06, 2013, 10:51:50
Hallo,

sollte bei nur einem Eintrag im Anlagefeld auch so gehen:

Private Sub Befehl19_Click()

Dim txtEmpfaenger As String, txtBetreff as String, txtAnhang As String
   Dim ool As Outlook.Application
  Dim oMail As Outlook.MailItem
'Anhang
  Dim myattachments As Object...
.

  txtAnhang = Me!Anlage.Filename
.
.           
  myattachments.Add txtAnhang
 


End Sub
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am März 06, 2013, 11:14:53
Hallo Franz,

funktioniert leider auch nicht.

Die Variabel hat den korrekten Wert "xyz.pdf", aber die Prozedur bleibt bei

myattachments.Add txtAnhang  mit der Fehlermeldung "(Die Datein kann nicht gefunden werden. Überprüfen sie den Pfad und Dateinamen.)" hängen.

Der Dateiname stimmt ja mal, aber ich habe ja keinen Pfad (ist ja im Datensatz gespreichert).

Gruß
KLaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: DF6GL am März 06, 2013, 20:26:09
Hallo,


ja, da gibt es tatsächlich das Problem, das das Attachment aus einer real gespeicherten Datei bestehen muss. Insofern muss, wenn die Anlage das Datei-Objekt (Dateiinhalt) enthält und nicht (auch) als Datei in irgendeinem Verzeichnis der Festplatte liegt , dieses Datenabbild  erst in eine Festplatten-Datei geschrieben (exportiert) werden. 

Google mal nach

Function Restoreblob


Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am April 08, 2013, 15:42:13
Hallo zusammen,

habe eine Idee für einen Workaround. Ich lasse die Dateien wo sie hingehören: im Dateisystem und speichere im DS nur den Ort.
Jetzt könnte ich ganz einfach den Anhang definieren, WENN ich den Namen der Datei auslesen könnte.

Hab' mich schon wundgesucht, aber nix passendes gefunden.
Der Pfad is kein Problem, aber wie lese ich den(die)  Dateinamen incl. Dateiwereiterung für einen bestimmten Pfad aus.
Bei objekt.getfilename bin ich an der Definition des "Objekt" gescheitert.

Wäre echt happy über einen Tipp.

Gruß
Klaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: database am April 08, 2013, 21:07:59
Hallo,

Zitatund speichere im DS nur den Ort

und wenn du ALLES speicherst - Pfad und Dateiname  ... z.B.   D:\Ordner1\Ordner2\Anhang.pdf

ersparst du dir das ganze Gewürge mit Auslesen, konvertieren usw.

Die elegantere Methode ist es aber die Files aus einem Dialog auszuwählen ...

sieh dazu:
http://www.dbwiki.net/images/f/fb/AccSampleFileDialogs.zip (http://www.dbwiki.net/images/f/fb/AccSampleFileDialogs.zip)

HTH
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Diskus am April 08, 2013, 21:15:58
Hab hier mal nen Standard Modul was du anpassen könntest. Beschreibungen sind dazu ja vorhanden. Und wenn ich als Newbee das geschafft habe schaffst du das bestimmt das anzupassen :)

'<pre>
'Funktion des Codes:
'Email mit Dateianhängen erstellen (in diesem Fall zwei exportierte Berichte)
'und einem Bericht direkt im Bodybereich des Mails.


'Falls Du nur diesen Code hast, mußt Du folgendermaßen vorgehen um ihn ausprobieren zu können (OL98/A97)
'
'1) Diesen Code komplett in ein neues Modul einfügen.
'2) In einer Datenbank eine Tabelle mit Namen "Verteiler" erstellen, die ein Feld namens "Name" enthält
'   (dort werden die Empfängeradressen eingegeben).
'3) drei Berichte "Bericht1" + "Bericht2", die als Attachments erscheinen sollen und einen "Bericht3",
'   der später im Bodybereich angezeigt wird.
'   Die Formatierungen (Schriftart, Breite, Farbe) des Berichts bleiben erhalten, Linien, Diagramme etc. nicht !
'4) zum Schluß muß noch ein Verweis auf Outlook eingerichtet werden (Extras->Verweise)
'5) Die Funktion "Senden_Html()" ausführen.

Function Senden_Html()
Dim objOutlook As Outlook.Application
Dim objOutlookMsg As Outlook.MailItem
Dim objOutlookRecip As Outlook.Recipient
Dim Betreff As String: Betreff = "Ihr Monatlicher Bericht"
Dim Nachricht As String, an As String, ATT1
Dim db As Database, rs As Recordset
 
  'DoCmd.Echo False, "Visual Basic-Code wird ausgeführt."
  'Verzeichnis erstellen und Berichte reinschieben
 
 
  'Berichte ausgeben
  'Der dritte Bericht wird im HTML- Format als Textdatei gespeichert
  'Es müssen keine Berichte sein, wenn was anderes gewünscht wird, in die Hilfe vom "OutputTo" schauen.
  'DoCmd.OutputTo acOutputQuery, "Abfrage1", "CSV(*.csv)", "C:\temp\Ber_verz\Bericht1.csv", False, ""
  'DoCmd.OutputTo acReport, "Bericht2", "RichTextFormat(*.rtf)", "C:\temp\Ber_verz\Bericht2.rtf", False, ""
  'DoCmd.OutputTo acReport, "Bericht3", "HTML(*.html)", "C:\temp\Beispiel.txt", False, ""
  ATT1 = "C:\test1.csv"
  'ATT2 = "C:\temp\Ber_verz\Bericht2.rtf"
  'Quelltext vom dritten Bericht einlesen.
  'Nachricht = readTxtFile("C:\temp\beispiel.txt")
 
  'Mailobjekt erstellen
  Set objOutlook = CreateObject("Outlook.Application")
  Set objOutlookMsg = objOutlook.CreateItem(0)
 
  'Tabelle "Verteiler" auslesen.
  Set db = CurrentDb
  Set rs = db.OpenRecordset("Verteiler", dbOpenDynaset)
  DoCmd.Echo True
  If rs.EOF Then MsgBox "Keine Empfänger im Verteiler", vbExclamation: GoTo Ex
 
  With objOutlookMsg
    'Durch alle Empfänger
    Do While Not rs.EOF
      an = Nz(rs!Name, "")
      If an <> "" Then .Recipients.Add an
      rs.MoveNext
    Loop
   'Inhalt des Mails festlegen
    .Importance = 0 ' niedrige priorität
    .Subject = Betreff
    .HTMLBody = Nachricht   'HTML-Format
    .Attachments.Add ATT1 'Berichte anhängen
    '.Attachments.Add ATT2
    For Each objOutlookRecip In .Recipients
      objOutlookRecip.Resolve 'Namen überprüfen
    Next
    '.Display 'Nachricht wird angezeigt
    .Send   'Nachricht wird sofort gesendet
  End With

Ex:
  On Error Resume Next
  rs.Close
  Set objOutlook = Nothing
  'Verzeichnis und Dateien werden gelöscht
  Kill "C:\temp\Ber_verz\*.*"
  Kill "C:\temp\Beispiel.txt"
  RmDir "C:\temp\Ber_verz"
  Exit Function
 
Er:
  MsgBox Err.Description
  Resume Ex
End Function

Function readTxtFile(ByVal strFile As String) As String
'Dieses Modul liest den Quelltext des exportierten Bericht3 in einen String ein.
'Dim strLineBuffer As String
  'Open strFile For Input Access Read As #1
' Do While Not EOF(1)
    'Line Input #1, strLineBuffer
    'readTxtFile = readTxtFile & vbCrLf & strLineBuffer
  'Loop
  'readTxtFile = Mid(readTxtFile, 3)
  'Close #1

'Ex:
  'Exit Function
 
'Er:
  'MsgBox Err.Description
  'Resume Ex
End Function
'</pre>



Gruß Diskus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am April 09, 2013, 13:26:48
Hallo Peter,

wenn das einfacher ist lese ich gerne auch den ganzen Pfad mit aus. Wie geht das?

Also zur Anwendung: Ich habe im Formular ein Webbrowersteuerelement, welches auf ein Verzeichnis verweist, das mit einem definierten Namen (Projektnummer_Einsatznummer) beim Anlegen eines Datensatzes erstellt wird.
In dieses verzeichis kann man per Drag und Drop Dateien und Anhänge aus MAils speichern.
Wird später durch einen Button ein (Einsatz-)Bericht erstellt und per Mail verschickt, sollen die Dateien im entsprechenden Verzeichnis angehängt werden.

D.h. es soll automatisch ablaufen, ohne Auswahl der Dateien, sondern einfach alles was im Verzeichnins ist; ich kenne die Dateinamen nicht und es kann natürlich sein, dass es gar keine Datei in diesem Verzeichnins gibt.

Aus diesen Gründen ist der (sehr komfortable) Auswahldialog hier ungeeignet.

Gruß
Klaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am April 09, 2013, 13:33:07
HAllo Diskus,

vielen Dank.
Wenn ich Deinen Code richtig verstanden habe, "kennst" Du den Dateinamen und den Pfad der Dateien, die Du anhängen willst.
In meinem Fall kenne ich nur den Pfad, weiß aber nicht wie die Datei(en) heiß(t)en.
Das muss ich zur automatischen Veraberitung aber wissen.

Gruß
Klaus
Titel: Re: Mail mit Anhang aus VBA
Beitrag von: DF6GL am April 09, 2013, 13:41:46
Hallo,



warum durchläufst Du nicht in einer Schleife das (bekannte)  Verzeichnis , z. B. mit der Dir()-Funktion oder den FileScripting-Objekt-Methoden und liest die darin vorhandenen Dateinamen aus, die dann als Attachment an die Email angehängt werden ?


Titel: Re: Mail mit Anhang aus VBA
Beitrag von: Klaus S. aus B am April 09, 2013, 13:56:15
HAllo Franz,

das mit dem DIR() war der Tipp, der mir gefehlt hat.

Super, vielen Dank!

Jetzt bastele ich mal an der Schleife.  ;D

Gruß
KLaus