PDA

Vollständige Version anzeigen : Abfrage & E-Mail versenden


sonnenschein07
12.06.2012, 11:50
Hallo,

ich habe eine Abfrage mit mehreren Empfängern (Schüler,E-Mail).

Die Empfänger sollen alle eine Mail mit Anhang (Excel Datei, liegt auf Laufwerk C:\“….ABC“)
erhalten.

Wie kann ich über einen Button im Formular die ganze Aktion automatisch ablaufen lassen?

VG
Sonnenschein07

CptChaos
12.06.2012, 12:50
Hier wirst Du um eine Outlookautomatisierung nicht umhin kommen.
Suche hier im Access-Forum mal nach Outlook oder den OLConnector von Sascha.

hcscherzer
12.06.2012, 13:33
Hier wirst Du um eine Outlookautomatisierung nicht umhin kommenEs gibt freilich auch noch die Möglichkeiten
a) Mail per Lotus Notes oder anderem Client versenden
b) direkt per SMTP versenden
c) einen Aufruf der Funktion Shell() mit Angabe von mailto:// ruft den Standard-Mail-Handler auf

maikek
12.06.2012, 13:50
Moin,
du könntest auch über die Funktion SQL Liste (http://dbwiki.net/wiki/VBA_Tipp:_Liste_per_SQL_aufbauen) die Namen in den String stTo schreiben und die Excel Datei in eine Abfrage (SELECT Anweisung als Querydef.SQL) wandeln. Dann per SendObject losschicken (dies funktioniert auch mit Thunderbird ;)):

Private Sub ButEmail_Click()
Dim stTo As String, stCC As String, stSub As String, stMes As String
'Hier SQL-Liste einbauen
stTo = "Schueler1@MailAdresse1.de; Schueler2@MailAdresse2.de; Schueler3@MailAdresse3.de"
stCC = "Lehrer1@MailAdresse.de"
stSub = "Betreffthema vom " & Format(Date, "dd. mmmm yyyy")
stMes = "Hallo ..., " & vbCrLf & " im Anhang findet ihr ... " & _
Format(Date, "dd. mmmm yyyy") & "." & _
vbCrLf & vbCrLf & "Viele Grüße von ... "
'Hier Abfrage von Exceldatei erzeugen
DoCmd.SendObject acSendQuery, "NameAbfrageExExcelDatei", acFormatXLS, stTo, stCC, , stSub, stMes, True
End Sub
maike

CptChaos
12.06.2012, 13:56
Es gibt freilich auch noch die Möglichkeiten
a) Mail per Lotus Notes oder anderem Client versenden
b) direkt per SMTP versenden
c) einen Aufruf der Funktion Shell() mit Angabe von mailto:// ruft den Standard-Mail-Handler auf
Das stimmt natürlich; sorry, ich hatte/habe die MS-Brille auf ;)
Und da liegt Outlook natürlich nahe...

sonnenschein07
12.06.2012, 14:46
Hallo maikek,

in der Abfrage gibt es die Spalte "E-Mail", es soll eine Mail an alle Mailadressen versendet werden.

Es soll nicht jeder Mailadresse im Code eingebaut sein.

VG

hcscherzer
12.06.2012, 15:12
Dann musst Du eine kleine Prozedur schreiben, die Dir alle E-Mail Adressen aus nicht-leeren Feldern hintereinander in einen String einfügt. Beispiel für so was findest Du, wenn Du hier im Forum nach "Felder verketten" suchst.

Und den String, der sich da ergibt, den übergibst Du der von Dir gewählten Lösung ... aber bitte in BCC und nicht in TO ;)

sonnenschein07
13.06.2012, 10:11
Hallo,

hier mal meine Test-DB.

Im frm_Schüler_Übersicht soll über die Schaltfläche E-Mail eine Mail an alle
Schüler gehen, die durch die Abfrage gefiltert werden.

VG
sonnenschein07

Claypool
13.06.2012, 10:44
Hallo!

Voraussetzung:
Outlook ist dein Standard-Mail-Programm
Alle Schüler haben eine Mailadresse (sonst müsste man noch in der Abfrage auf "Nicht Ist Null" prüfen)


Füge deinem E-Mail-Button folgende COde hinzu:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> cmdEMail_Click()
<span class="TOKEN">Dim</span> Mailtext <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> Empfaenger <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> rs <span class="TOKEN">As</span> DAO.Recordset
<span class="TOKEN">Set</span> rs = CurrentDb.OpenRecordset(&quot;Abfrage1&quot;)
Mailtext = &quot;Hallo!&quot; &amp; vbCrLf &amp; vbCrLf &amp; &quot;Dies ist eine automatisierte Mail.&quot; &amp; vbCrLf
&nbsp;
&nbsp;
rs.MoveFirst
<span class="TOKEN">Do</span> <span class="TOKEN">Until</span> rs.EOF
<span class="TOKEN">If</span> rs.NoMatch <span class="TOKEN">Then</span>
<span class="TOKEN">Exit Do</span>
<span class="TOKEN">Else</span>
Empfaenger = Empfaenger &amp; &quot;;&quot; &amp; rs![E-Mail]
rs.MoveNext
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Loop</span>
&nbsp;
DoCmd.SendObject , , , Mid(Empfaenger, 2), , , &quot;Betreff&quot;, Mailtext, <span class="TOKEN">True</span>
<span class="REM"> 'oder, wenn die Empf&auml;nger in Bcc stehen sollen</span>
DoCmd.SendObject , , , , , Mid(Empfaenger, 2), &quot;Betreff&quot;, Mailtext, <span class="TOKEN">True</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr>&nbsp;</pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Grüße
Ingo

PS: Du hättest auch ein paar mehr Schüler erfassen können, damit man das auch testen kann.

sonnenschein07
14.06.2012, 07:50
Hallo,

der Code funktioniert.

Über DoCmd.SendObject versuche ich eine Excel Datei vom Pfad C: mit als Anhang zu schicken.
Die Mail öffnet sich in Outlook und eine Fehlermeldung "Laufzeitfehler 2501" kommt.

Habe ich in der Codezeile einen Fehler?

DoCmd.SendObject , acFormatXLS, "C:\Dokument\Test03.XLS", Mid(Empfaenger, 2), , , "Betreff", Mailtext, True

VG
Sonnenschein07

CptChaos
14.06.2012, 08:42
Einen Anhang wirst Du mit SendObject so nicht hinbekommen.
SendObject versendet das anzugebene Datenbankobjekt (ggf. im XLS-Format).
Weitere Informationen hierzu in der OnlineHilfe (am besten Cursor auf SendObject und F1 drücken!)

Ansonsten bleibt die bereits angesprochene Automatisierung von Outlook.

Claypool
14.06.2012, 09:04
Hallo!

Sorry. Da habe nicht richtig gelesen und den Anhang vergessen...

Grüße
Ingo

sonnenschein07
14.06.2012, 09:48
Hallo,

den Laufzeitfehler 2501 konnte ich schon selbst erledigen, dieser Fehler kam sobald man nicht sendet.

Kann ich den Anhang (Excel Datei) nicht erst in Access kopieren und dann als Anhang an die Mail anhängen?

Private Sub cmdEMail_Click()

Dim Mailtext As String
Dim Empfaenger As String
Dim rs As DAO.Recordset
Set rs = CurrentDb.OpenRecordset("Abfrage1")
Mailtext = "Hallo!" & vbCrLf & vbCrLf & "Dies ist eine automatisierte Mail." & vbCrLf


rs.MoveFirst
Do Until rs.EOF
If rs.NoMatch Then
Exit Do
Else
Empfaenger = Empfaenger & ";" & rs![E-Mail]
rs.MoveNext
End If
Loop

On Error Resume Next

DoCmd.SendObject , , , Mid(Empfaenger, 2), , , "Betreff", Mailtext, True
'oder, wenn die Empfänger in Bcc stehen sollen
DoCmd.SendObject , , , , , Mid(Empfaenger, 2), "Betreff", Mailtext, True

If Err.Number <> 2501 Then
MsgBox Err.Description

End If
End Sub


VG

CptChaos
14.06.2012, 09:52
Nochmal:
SendObject kann keine Anhänge verwalten. Schau Dir doch mal die, bereits angesprochene, OnlineHilfe zu SendObject an.

Wenn diese Exceldatei etwas ist, was aus der DB erstellt wurde (z.B. eine exportierte Abfrage) kannst Du diese Abfrage als "Objekt" senden... einen Anhang im Sinne von "Ich hänge noch x Dateien an die Mail an" geht mit SendObject nicht.

Claypool
14.06.2012, 10:06
Hallo!

Lies doch mal die Antwort von Benny. Mit DoCmd.SendObject geht das nicht. Du musst (sofern vorhanden) mit Outlook arbeiten. Ich bin gerade dabei ein Beispiel zusammenzustellen.

Alternativ verwendest du meinen Code und fügst per Hand die Exceldatei an die Mail.

Wirst du Outlook mit dieser Datenbank verwenden?

Grüße
Ingo

CptChaos
14.06.2012, 10:17
@Ingo: ausgehend von dieser Aussage:Hallo,
...Die Mail öffnet sich in Outlook und eine Fehlermeldung "Laufzeitfehler 2501" kommt...gehe ich davon aus, dass Outlook vorhanden ist ;)

Claypool
14.06.2012, 14:22
Hallo!

@Ingo: ausgehend von dieser Aussage:
...Die Mail öffnet sich in Outlook und eine Fehlermeldung "Laufzeitfehler 2501" kommt...gehe ich davon aus, dass Outlook vorhanden ist ;)

Hmpfgrmbl. Ja ;-) Du hast recht. Ich lese zu unkonzentriert.
Das Beispiel dauert noch ein klein wenig...

Grüße
Ingo

Claypool
14.06.2012, 14:50
Hallo!
Das Beispiel dauert noch ein klein wenig...

Hier:
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> cmdEMail_Click()
<span class="REM">'Codeteile stammen con http://www.jans-hp.de/?q=node/21</span>
<span class="TOKEN">Dim</span> Betreff <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> Empfaenger <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> Mailtext <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> PfadUndNameZurDatei <span class="TOKEN">As</span> <span class="TOKEN">String</span>
<span class="TOKEN">Dim</span> rs <span class="TOKEN">As</span> DAO.Recordset
&nbsp;
<span class="TOKEN">Dim</span> objOutlook <span class="TOKEN">As</span> Outlook.Application
<span class="TOKEN">Dim</span> objNameSpace <span class="TOKEN">As</span> Outlook.NameSpace
<span class="TOKEN">Dim</span> objDefaultEMail <span class="TOKEN">As</span> Outlook.MAPIFolder
<span class="TOKEN">Dim</span> objEMail <span class="TOKEN">As</span> Outlook.MailItem
&nbsp;
<span class="TOKEN">Set</span> objOutlook = <span class="TOKEN">New</span> Outlook.Application
<span class="TOKEN">Set</span> objNameSpace = objOutlook.GetNamespace(&quot;MAPI&quot;)
<span class="TOKEN">Set</span> objDefaultEMail = objNameSpace.GetDefaultFolder(olFolderOutbox)
<span class="TOKEN">Set</span> objEMail = objDefaultEMail.Items.Add(olMailItem)
<span class="TOKEN">Set</span> rs = CurrentDb.OpenRecordset(&quot;Abfrage1&quot;)
&nbsp;
<span class="REM">'Hier die Werte anpassen!</span>
Betreff = &quot;Betreffzeile&quot;
Mailtext = &quot;Hallo!&quot; &amp; vbCrLf &amp; vbCrLf &amp; &quot;Dies ist eine automatisierte Mail.&quot; &amp; vbCrLf
PfadUndNameZurDatei = &quot;C:\Dokument\Test03.XLS&quot;
<span class="REM">'Bis hier</span>
&nbsp;
rs.MoveFirst
<span class="TOKEN">Do</span> <span class="TOKEN">Until</span> rs.EOF
<span class="TOKEN">If</span> rs.NoMatch <span class="TOKEN">Then</span>
<span class="TOKEN">Exit Do</span>
<span class="TOKEN">Else</span>
Empfaenger = Empfaenger &amp; &quot;;&quot; &amp; rs![E-Mail]
rs.MoveNext
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
<span class="TOKEN">Loop</span>
&nbsp;
<span class="REM">'//Verk&uuml;rzen des Schreibaufwands</span>
<span class="TOKEN">With</span> objEMail
<span class="REM"> 'Empf&auml;nger</span>
.To = Empfaenger
.CC = &quot;&quot; <span class="REM">'Carbon Copy</span>
.BCC = &quot;&quot; <span class="REM">'Blind Carbon Copy</span>
<span class="REM"> 'Betreff</span>
.Subject = &quot;Betreffzeile&quot;
.Body = Mailtext
<span class="REM"> 'Anhang anf&uuml;gen</span>
.Attachments.Add PfadUndNameZurDatei
<span class="REM"> 'Mail Anzeigen</span>
.Display
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">With</span>
&nbsp;
Clean:
<span class="TOKEN">Set</span> objOutlook = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Set</span> objNameSpace = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Set</span> objDefaultEMail = <span class="TOKEN">Nothing</span>
<span class="TOKEN">Set</span> objEMail = <span class="TOKEN">Nothing</span>
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span><hr></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

Grüße
Ingo

sonnenschein07
15.06.2012, 09:25
Hallo Claypool,

es kommt der Fehler, siehe Bild.

VG
sonnenschein07

maikek
15.06.2012, 09:53
Moin,
da fehlt unter Extras/Verweise der Verweis auf Microsoft Outlook, den anhaken und es müsste gut sein.
maike

Claypool
15.06.2012, 14:09
Hallo!

Ja, sorry. Maike hat recht. Hab' vergessen zu sagen dass der Verweis gesetzt werden muss, damit das funktioniert.

Grüße
Ingo