Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Aktuellen Datensatz aus Formular per E-mail versenden
zurück: Funktion erwartet = weiter: Diagrammdaten je nach Optionsfeldauswahl Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Feedback Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Anna Schneider
Gast


Verfasst am:
04. Dez 2013, 12:15
Rufname:

Aktuellen Datensatz aus Formular per E-mail versenden - Aktuellen Datensatz aus Formular per E-mail versenden

Nach oben
       Version: Office 2007

Hallo liebe Forumsgemeinde,

ich bastle derzeit an einer Access-Datenbank und würde gerne immer den gerade angezeigten Datensatz eines Formulars per E-Mail versenden inklusive der Anlagen, die in der Datenbank hinterlegt sind. Ist dies möglich und falls ja hat hierfür jemand einen Code? Ich bin fast am verzweifeln und habe schon alle möglichen Sachen aus dem Forum ausprobiert....

Vielen Dank schon mal für eure Hilfe
Anna
Gast



Verfasst am:
05. Dez 2013, 03:03
Rufname:

AW: Aktuellen Datensatz aus Formular per E-mail versenden - AW: Aktuellen Datensatz aus Formular per E-mail versenden

Nach oben
       Version: Office 2007

Hallo Anna

Email versenden ab Access ist entweder optisch auf tiefem Level und mit manuellem Bestätigen möglich, oder aber mit ziemlichem Aufwand verbunden.

Die einfache Lösung ist der Befehl DoCmd.SendObject, Infos dazu findest Du in der Hilfe.
Vorteil: Sehr einfach umzusetzen, im Outlook (sofern Du damit arbeitest) findest Du das versendete Mail bei den gesendeten Mails.
Nachteil: Outlook verhindert seit ein paar Jahren das automatische Senden von Mails, aus Sicherheitsgründen. Nun muss nach dem Absetzen des Befehls 5 Sekunden gewartet und anschliessend ein Bestätigungsknopf gedrückt werden.

Andere Möglichkeit:
Im Internet finden sich diverse Lösungen wie diese Aufgabe über ein SMTP-Mail direkt gelöst werden kann. Habe ich nie fertig verfolgt, da ich so kein Mail in den versendeten Mails habe (und ich zu dem Zeitpunkt als ich die Lösungen fand, schon eine andere Lösung hatte...)

Dritte Möglichkeit: Im Outlook ein Mailobjekt erstellen und mit Daten abfüllen, anschliessend per VBA den "Senden"-Knopf drücken.
Vorteil: Lösung über Outlook inkl. aller Geschichtsschreibung, kein manueller Eingriff notwendig.
Nachteil: Es braucht einiges an Code. (Kann aber von hier kopiert werden.)
Dazu:
Erzeuge zuerst ein neues globales Modul, z.B. mit dem Namen "Mail". Ergänze die Verweise (Menü Extras --> Verweise) mit "Microsoft Visual Basic for Applications Extensibility 5.3" und "Microsoft Office 14.0 Object Library". Anschliessend füge im neuen Modul folgenden Code ein:
Code:
Option Compare Database
Option Explicit

Declare Function GetForegroundWindow Lib "user32" () As Long
Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliSec As Long)
Declare Function GetWindowText Lib "user32.dll" Alias _
    "GetWindowTextA" (ByVal hWnd&, ByVal sTitel$, ByVal lTitLen&) As Long
Declare Sub keybd_event Lib "user32" _
    (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long _
   , ByVal dwExtraInfo As Long)

Const VK_NUMLOCK = &H90
Const KEYEVENTF_KEYUP = &H2

Public Function GetActiveWindowTitle() As String
    Dim lhWnd As Long, s As String, l As Long
   
    lhWnd = GetForegroundWindow
    s = String(255, 32)
    l = GetWindowText(lhWnd, s, 255)
    If l > 0 Then s = Left$(s, l)
    GetActiveWindowTitle = s
End Function

Public Function Activate(sWindowTitle As String _
                       , Optional lTimeOutSek As Long = -1) As Long
    Dim s As String, l As Long, dt As Date
   
    l = 0
    If lTimeOutSek = -1 Then
        dt = Now + 1
      Else
        dt = DateAdd("s", lTimeOutSek, Now)
    End If
    While l < 200
        l = l + 1
        On Error GoTo aaErr
        AppActivate sWindowTitle
        Sleep 100
        DoEvents
        s = GetActiveWindowTitle
        If Left(s, Len(sWindowTitle)) = sWindowTitle Then l = 10000
        GoTo aaErrEnd
aaErr:
        Sleep 500
        s = GetActiveWindowTitle
        ' Falls notwendig Fehlerbehandler einbauen um störende Dialogfelder wegzubringen
        DoEvents
        Resume aaErrEnd
aaErrEnd:
        On Error GoTo 0
        If dt < Now Then l = 20000
    Wend
    If l < 10000 Then
        MsgBox "Fenster aktivieren misslungen!", vbInformation + vbOKOnly _
             , "Information"
        Activate = 0
      Else
        If l = 20000 Then Activate = 1 Else Activate = -1
    End If
End Function

Sub SetNumLock()
' NUM-Lock drücken
' Zunächst niederdrücken und dann wieder loslassen
    keybd_event VK_NUMLOCK, 1, 0, 0
    keybd_event VK_NUMLOCK, 1, KEYEVENTF_KEYUP, 0
End Sub

Sub AddHeader(sCode As String)
    sCode = sCode & "<HTML><BODY>"
End Sub

Sub AddLine(sCode As String, sText As String)
    If Len(sText) Then
        sCode = sCode & "<DIV><FONT face=Arial size=2><SPAN>" & sText _
              & "<br></SPAN></DIV>"
      Else
        sCode = sCode & "<br>"
    End If
End Sub

Sub AddFooter(sCode As String)
    sCode = sCode & "</BODY></HTML>"
End Sub

Function PressSend(sNachrichtTitel As String _
                 , Optional bMsgBoxFeedback As Boolean = True) As Boolean
    Sleep 2000
    If Not Activate(sNachrichtTitel) Then
        If bMsgBoxFeedback Then
            MsgBox "Die Nachricht '" & sNachrichtTitel & "' konnte nicht " _
                 & "aktiviert werden.", vbInformation + vbOKOnly, "Abbruch"
        en dif
        PressSend = False
      Else
        SendKeys "%s", True
        Sleep 1000
        If bMsgBoxFeedback Then
            MsgBox "Mail versendet.", vbInformation + vbOKOnly, "Info"
        en dif
        PressSend = True
    End If
End Function

Function SendeMail(sTo As String, sCC As String, sBetreff As String _
                 , sMitteilung As String, sAttachments As String _
                 , Optional bMsgBoxFeedback As Boolean = True) As Boolean
    ' sAttachements enthält 0, 1 oder mehrere Pfade zu den anzuhängenden Dateien. Wenn es mehrere Dateien sind, so sond die Dateien mit ; zu trennen
    Dim myOlApp As Object, myItem As Object, myAttachments As Object
    Dim sCommand As String, s As String, rs1 As Recordset, l As Long
   
    Set myOlApp = CreateObject("Outlook.Application")
    Set myItem = myOlApp.CreateItem(0)      ' 0 = olMailItem
    Set myAttachments = myItem.Attachments
    myItem.To = sTo
    myItem.cc = sCC
    myItem.Subject = sBetreff
    myItem.HTMLBody = sMitteilung
    s = sAttachments
    While InStr(s, ";")
        myAttachments.Add Left(s, InStr(s, ";") - 1), 1
        s = Mid(s, InStr(s, ";") + 1)
    Wend
    If Len(s) Then myAttachments.Add s, 1
    myItem.Display
    SendeMail = PressSend(sBetreff & " - Nachricht", bMsgBoxFeedback)
    SetNumLock
End Function
Die eigentliche Arbeit macht die Funktion "SendeMail". Die Übergabeparameter sind wohl selbsterklärend, als Verdeutlichung einfach nochmals:
- Es können mehrere Dateien mitgegeben werden. Einfach alle kompletten Pfade inkl. Dateinamen und Erweiterung strichpunktgetrennt im Parameter sAttachments übergeben.
- Der Inhalt des Parameters sMitteilung muss als gültigen HTML-Code übergeben werden. Dazu sind aber Hilfsfunktionen vorhanden, siehe untenstehenden Beispielaufruf.

Die Funktion öffnet das Mail zur Bearbeitung, drückt aber selbständig den "Senden"-Knopf. Dadurch wird die lästige Sicherheitsabfrage vom Outlook umgangen.

Beipielaufruf:
Code:
Private Sub Mail_Click()
    Dim s As String, sTo As String, rs1 As Recordset
   
    Set rs1 = CurrentDb.OpenRecordset("SELECT EMail" _
                                     & " FROM Empfaenger" _
                                    & " WHERE Gueltig = TRUE;", dbOpenSnapshot)
    While Not rs1.EOF
        sTo = sTo & ";" & rs1![Email]
        rs1.MoveNext
    Wend
    rs1.Close
    If Len(sTo) = 0 Then Exit Sub ' Es gibt keinen Empfänger...
    s = ""
    AddHeader s
    AddLine s, "Sehr geehrte Empfänger"
    AddLine s, ""
    AddLine s, "Hiermit erhaltet Ihr ein automatisch versendetes E-Mail." ' Hier können jetzt natürlich die Daten ab Formular eingefüllt werden.
    AddLine s, ""
    AddLine s, "Gruss"
    AddLine s, "Absender"
    SendeMail2 Mid(sTo, 2), "", "Betreff", s _
             , "C:\Daten\Datei1.pdf;C:\Daten\Datei2.xls;C:\Daten\Datei3.doc"
End Sub
Ich hoffe, dass Du damit weiter kommst.

Gruss
TomKelly
Anna Schneider
Gast


Verfasst am:
09. Dez 2013, 16:15
Rufname:

AW: Aktuellen Datensatz aus Formaular per E-mail versenden - AW: Aktuellen Datensatz aus Formaular per E-mail versenden

Nach oben
       Version: Office 2007

Hi vielen Dank schon mal Smile

Kannst du mir jetzt auch noch sagen wie ich den Anhang an die e-mail bekomme?
Also ich habe in meiner DB im Formular die Möglichkeit geschaffen Anhänge hochzuladen (PDF) und diese würde ich jetzt gerne an die E-Mail anhängen...
Vielen Dank schon mal Smile
Liebe Grüße
Anna
TomKelly
VBA-Freak


Verfasst am:
09. Dez 2013, 23:19
Rufname:

AW: Aktuellen Datensatz aus Formaular per E-mail versenden - AW: Aktuellen Datensatz aus Formaular per E-mail versenden

Nach oben
       Version: Office 2007

Hallo Anna

Die Anhänge müssen irgendwo als Datei gespeichert sein. Direkt aus der Datenbank geht meines Wissens nicht. Anschliessend kannst Du die einzelnen Dateien inkl. jeweils dem ganzen Pfad, strichpunktgetrennt in einer String-Variabeln der Funktion übergeben.
Im obenstehenden Beispiel:
Code:
    SendeMail2 Mid(sTo, 2), "", "Betreff", s _
             , "C:\Daten\Datei1.pdf;C:\Daten\Datei2.xls;C:\Daten\Datei3.doc"
werden im letzten Parameter 3 Dateien übergeben und angehängt.

Gruss
TomKelly
Anna Schneider
Gast


Verfasst am:
10. Dez 2013, 09:24
Rufname:

AW: Aktuellen Datensatz aus Formaular per E-mail versenden - AW: Aktuellen Datensatz aus Formaular per E-mail versenden

Nach oben
       Version: Office 2007

Hi TomKelly,

vielen lieben Dank Smile gibt es die Möglichkeit, dass ich einfach den Inhalt eines bestimmten Ordners versende? (Inhalt variabel)

Du bist mein Held Smile
TomKelly
VBA-Freak


Verfasst am:
20. Dez 2013, 14:42
Rufname:

AW: Aktuellen Datensatz aus Formaular per E-mail versenden - AW: Aktuellen Datensatz aus Formaular per E-mail versenden

Nach oben
       Version: Office 2007

Hallo Anna

Danke für das Kompliment Smile
Erweitere den Code im Mail_Click:
Code:
    Dim sPath As String, sAlle As String, sDat As String
   
    sPath = "C:\DeinPfad\" ' --> Hier muss natürlich der richtige Pfad eingetragen sein
    sDat = Dir(sPath & "*.*") ' --> Hier muss der richtige Dateifilter eingetragen sein
    While Len(sDat)
        If Len(sDat) > 2 Then ' Damit wird sichergestellt, dass die beiden Verzeichniswechsel "." und ".." nicht mitgenommen werden
            sAlle = sAlle & sPath & sDat & ";"
        End If
        sDat = Dir ' Die nächste Datei holen
    Wend
Der Mailaufruf sieht nun sinngemäss so aus:
Code:
    SendeMail2 Mid(sTo, 2) , "", "Betreff", s, Left(sAlle, Len(sAlle) - 1))

Gruss und schöne Festtage
TomKelly
Michael2014
Gast


Verfasst am:
04. Apr 2014, 08:00
Rufname:

AW: Aktuellen Datensatz aus Formaular per E-mail versenden - AW: Aktuellen Datensatz aus Formaular per E-mail versenden

Nach oben
       Version: Office 2010

Hallo zusammen,

gibt es eine Möglichkeit den oben aufgeführten Code so zu erweitern, dass man auch die Daten aus einer Tabelle oder Abfrage per Copy und Paste in den body Bereich der Mail einfügen kann?

Vielen Dank im Voraus
Willi Wipp
Moderator


Verfasst am:
26. Apr 2014, 16:47
Rufname:
Wohnort: Raum Wiesbaden

Re: Aktuellen Datensatz aus Formular per E-mail versenden - Re: Aktuellen Datensatz aus Formular per E-mail versenden

Nach oben
       Version: Office 2010

Hi Michael2014,

was genau verstehst Du in diesem Zusammenhang unter via "Copy und Paste" einfuegen?

_________________
Eine kurze Rueckmeldung waere nett
SL Willi Wipp

(Anleitung fuer das Anhaengen von Dateien: Klicke links auf [www], Gaeste muessen sich dafuer anmelden)
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: Aktionsabfrage in Formular -immer nur einen Datensatz ändern 6 blauvogel 1092 08. Okt 2004, 11:43
Skogafoss Aktionsabfrage in Formular -immer nur einen Datensatz ändern
Keine neuen Beiträge Access Tabellen & Abfragen: Zeile der Dateneingabe (*) in einem Formular verschieben 2 Albertus 790 08. Okt 2004, 09:17
Albertus Zeile der Dateneingabe (*) in einem Formular verschieben
Keine neuen Beiträge Access Tabellen & Abfragen: Datensatz nach Datum suchen?? 1 Hansen 1390 04. Okt 2004, 12:16
stpimi Datensatz nach Datum suchen??
Keine neuen Beiträge Access Tabellen & Abfragen: Einen Wert per Abfrage in mehreren Tabellenspalten suchen 2 Danny G. 606 10. Sep 2004, 18:22
Danny G. Einen Wert per Abfrage in mehreren Tabellenspalten suchen
Keine neuen Beiträge Access Tabellen & Abfragen: Suchfunktion mit mehreren Kriterien aus Formular 5 Danny G. 2218 09. Sep 2004, 11:08
Danny G. Suchfunktion mit mehreren Kriterien aus Formular
Keine neuen Beiträge Access Tabellen & Abfragen: bestimmte(n) Datensatz in abfrage ausschließen 2 Lene 3641 02. Sep 2004, 15:39
borstel bestimmte(n) Datensatz in abfrage ausschließen
Keine neuen Beiträge Access Tabellen & Abfragen: Tabelle, Formular, Abfrage...und nun ? 3 Gags 790 29. Aug 2004, 22:05
lothi Tabelle, Formular, Abfrage...und nun ?
Keine neuen Beiträge Access Tabellen & Abfragen: Abfragefeld nachträglich in Formular 3 Sebbl 1705 05. Aug 2004, 15:14
mabe38 Abfragefeld nachträglich in Formular
Keine neuen Beiträge Access Tabellen & Abfragen: Formular aus Endlosformular öffnen ? 10 G-Markus 1619 20. Jul 2004, 15:38
Gast Formular aus Endlosformular öffnen ?
Keine neuen Beiträge Access Tabellen & Abfragen: nur datensatz mit jüngstem datum ausgeben 2 Mordred 2199 16. Jul 2004, 17:10
Mordred nur datensatz mit jüngstem datum ausgeben
Keine neuen Beiträge Access Tabellen & Abfragen: mehrere Abfragen in einem Formular zum Auswerten 2 bpointz 1086 27. Mai 2004, 10:39
bpointz mehrere Abfragen in einem Formular zum Auswerten
Keine neuen Beiträge Access Tabellen & Abfragen: kriterium - datensatz nur in einer von zwei tabellen 3 budking82 1000 11. Mai 2004, 12:59
budking82 kriterium - datensatz nur in einer von zwei tabellen
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: HTML Editor Forum