Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

SQL 2008: E-Mail verschicken, wenn Datensätze vorhanden

370 views
Skip to first unread message

Manuel Kobloch

unread,
Mar 10, 2009, 4:44:36 AM3/10/09
to
Hallo,

ich hätte gerne gewusst, wie ich von SQL Server 2008 E-Mails
verschicken kann, wenn in einer bestimmten Tabelle Datensätze drin
sind. Ich schildere das Problem mal genauer:

In der Tabelle "EMail_versand" gibt es die Spalten "Empf_email",
"Betreff", "Text", "Anhang"

Per Agent möchte ich alle 10 Minuten prüfen, ob ein neuer Datensatz in
dieser Tabelle existiert. Wenn ja, soll für jeden Datensatz eine E-
Mail geformt werden. Empfänger, Text und die anderen Daten der Mail
stehen im Datensatz selbst. Nach dem Versenden, soll der Datensatz
gelöscht werden.

Da ich mich mit SSIS nicht auskenne habe ich kurzerhand ein kleines
Tool geschrieben, welches vom Agent alle 10 Minuten aufgerufen wird,
das auf die Datenbank zugreift und die Mails per Winsock verschickt.

Es geht allerdings auch bestimmt bequem über TSQL bzw SSIS. Kann mir
da jemand weiterhelfen? Ich möchte möglichst auf Tools verzichten.

Danke für alle Antworten.

Manuel

Gerald Aichholzer

unread,
Mar 10, 2009, 5:28:05 AM3/10/09
to
Hallo Manuel,

wenn du SSIS nicht gut kennst, ist es mit TSQL einfacher. Dort gibt
es eine gespeicherte Prozedur mit dem Namen xp_sendmail. Weitere
Details findest du hier:
http://msdn.microsoft.com/de-de/library/ms189505.aspx

Mit SSIS würde ich die Mailversandtabelle mit dem Excecute-SQL-Task
in eine Variable einlesen. Dann mit der Foreach-Schleife die Daten-
sätze in der Variablen durchgehen und mit dem Send-Mail-Task die E-
Mails versenden.

hth,
Gerald

Christoph Muthmann

unread,
Mar 10, 2009, 5:25:10 AM3/10/09
to


Hallo Manuel,
grundsätzlich sollte etwas in dieser Art gehen:
If exists(select * from testtabelle )
begin
exec master..sp_send_dbmail ...
delete from testtabelle
end

Einen schönen Tag noch,
Christoph
--
Microsoft SQL Server MVP
http://www.insidesql.org


Elmar Boye

unread,
Mar 10, 2009, 5:36:10 AM3/10/09
to
Gerald Aichholzer schrieb:

> Hallo Manuel,
>
> Manuel Kobloch wrote:
>> ich hätte gerne gewusst, wie ich von SQL Server 2008 E-Mails
>> verschicken kann, wenn in einer bestimmten Tabelle Datensätze drin
>> sind. Ich schildere das Problem mal genauer:
>>
>> Es geht allerdings auch bestimmt bequem über TSQL bzw SSIS. Kann mir
>> da jemand weiterhelfen? Ich möchte möglichst auf Tools verzichten.
>
> wenn du SSIS nicht gut kennst, ist es mit TSQL einfacher. Dort gibt
> es eine gespeicherte Prozedur mit dem Namen xp_sendmail. Weitere
> Details findest du hier:
> http://msdn.microsoft.com/de-de/library/ms189505.aspx

wenn dann bitte mit DB Mail:
<URL:http://msdn.microsoft.com/de-de/library/ms190307.aspx>
denn das obige ist ein Auslaufprodukt und in seiner
Konfiguration wesentlich problematischer.

Gruß Elmar

Gerald Aichholzer

unread,
Mar 10, 2009, 5:46:35 AM3/10/09
to
Gerald Aichholzer wrote:
>
> Manuel Kobloch wrote:
>> ich hätte gerne gewusst, wie ich von SQL Server 2008 E-Mails
>> verschicken kann, wenn in einer bestimmten Tabelle Datensätze drin
>> sind. Ich schildere das Problem mal genauer:
>>
[...]

> wenn du SSIS nicht gut kennst, ist es mit TSQL einfacher. Dort gibt
> es eine gespeicherte Prozedur mit dem Namen xp_sendmail. Weitere
> Details findest du hier:
> http://msdn.microsoft.com/de-de/library/ms189505.aspx

Ich habe gerade gelesen, dass diese Methode veraltet ist.
Besser ist es, die von Christoph vorgeschlagene Lösung
mit sp_send_dbmail zu verwenden:
http://msdn.microsoft.com/de-de/library/ms190307.aspx

lg,
Gerald

Moby

unread,
Mar 10, 2009, 6:51:19 AM3/10/09
to
Hallo Manuel

Ich finde SSIS extrem smart. Hier eine kurze Beschreibung für das SSIS


Zunächst brauchst Du eine Tabelle mit den Informationen für Empfänger,
Text, Attachment und weitere mögliche Properties zur Mail
hier im Beispiel nur Empfänger (MailTo) und Attachment (Attachment).

Innerhalb des Paketes erstelle bitte drei neue Variablen
Name Scope DataType Value
Attachment Package String
MailTo Package String
Liste Package Object SystemObject


Baue einen Execute SQL Task mit der Abfrage auf Deine Tabelle. Bei mir
ist das:
SELECT MailTo, Attachment
FROM C_MailTo

In den Eigenschaften des SQL Tasks Result Set füge die neue Variable
"Liste" mit dem Result Wert "0" (wichtig) ein

Anschliessend ziehe ein ForEachLoop Container in das Paket. In diesen
Container einen Send Mail Task

Den ForEach stellst du in der Collection im Enumerator als ForEach ADO
Enumerator
in der ADO Object source variable stelle die Variable "Liste" mit ein

In Variable Mapping wählst du die beiden Variablen. Über den manuellen
Eintrag Index wählst du die Spaltenreihenfolge, in welcher diese
verarbeitet werden sollen
Hier können zum späteren Zeitpunkt von dir natürlich alle Spalten
verarbeitet werden, die dein SQL Resultset zurück gibt
Weitere Infos zum ForEach, SQL Task etc. immer wieder gerne
nachgeschaut unter http://www.sqlis.de/ADOLoop.htm

Im letzten Schritt musst du noch den Mail Task parametrisieren
bei mir lasse ich diesen über eine Connection laufen, die sich auf
unseren SMTP Server bezieht, die du in der Connection auswählen musst.
statische Informationen kannst du sofort manuell eintragen
in den Expressions wählst du dir die Eigenschaften aus, die du
dynamisch mit der Variable befüllen möchtest. Diese ziehst du aus den
Expressions

alles in allem nur drei Task, die innerhalb von weniger als 10 Minuten
aufgebaut werden können

noch eine Anmerkung.
ich musste feststellen, das bspw. bei dem Absender jeder beliebiger
Eintrag möglich ist. Bisher weiss ich nicht ob Bug oder Feature.
Vielleicht kann mir das ja mal jemand sagen. Sehe ich als
Sicherheitsrisiko an.


entschuldige bitte bei der Beschreibung die teilweise englischen
Bezeichnung der SSIS Objekte. Das liegt halt an meiner englischen
Version

Gruss Moby

dark....@web.de

unread,
Mar 10, 2009, 8:01:45 AM3/10/09
to
> nachgeschaut unterhttp://www.sqlis.de/ADOLoop.htm

>
> Im letzten Schritt musst du noch den Mail Task parametrisieren
> bei mir lasse ich diesen über eine Connection laufen, die sich auf
> unseren SMTP Server bezieht, die du in der Connection auswählen musst.
> statische Informationen kannst du sofort manuell eintragen
> in den Expressions wählst du dir die Eigenschaften aus, die du
> dynamisch mit der Variable befüllen möchtest. Diese ziehst du aus den
> Expressions
>
> alles in allem nur drei Task, die innerhalb von weniger als 10 Minuten
> aufgebaut werden können
>
> noch eine Anmerkung.
> ich musste feststellen, das bspw. bei dem Absender jeder beliebiger
> Eintrag möglich ist. Bisher weiss ich nicht ob Bug oder Feature.
> Vielleicht kann mir das ja mal jemand sagen. Sehe ich als
> Sicherheitsrisiko an.
>
> entschuldige bitte bei der Beschreibung die teilweise englischen
> Bezeichnung der SSIS Objekte. Das liegt halt an meiner englischen
> Version
>
> Gruss Moby

Danke für die ausführliche Erklärung. Ich werde es gleich mal
ausprobieren. :)

dark....@web.de

unread,
Mar 10, 2009, 8:54:11 AM3/10/09
to
On 10 Mrz., 11:51, Moby <dhuert...@web.de> wrote:
> nachgeschaut unterhttp://www.sqlis.de/ADOLoop.htm

>
> Im letzten Schritt musst du noch den Mail Task parametrisieren
> bei mir lasse ich diesen über eine Connection laufen, die sich auf
> unseren SMTP Server bezieht, die du in der Connection auswählen musst.
> statische Informationen kannst du sofort manuell eintragen
> in den Expressions wählst du dir die Eigenschaften aus, die du
> dynamisch mit der Variable befüllen möchtest. Diese ziehst du aus den
> Expressions
>
> alles in allem nur drei Task, die innerhalb von weniger als 10 Minuten
> aufgebaut werden können
>
> noch eine Anmerkung.
> ich musste feststellen, das bspw. bei dem Absender jeder beliebiger
> Eintrag möglich ist. Bisher weiss ich nicht ob Bug oder Feature.
> Vielleicht kann mir das ja mal jemand sagen. Sehe ich als
> Sicherheitsrisiko an.
>
> entschuldige bitte bei der Beschreibung die teilweise englischen
> Bezeichnung der SSIS Objekte. Das liegt halt an meiner englischen
> Version
>
> Gruss Moby

Dass du jede E-Mail Adresse als Absender nutzen kannst, ist auf dem
Mail Server konfigurierbar. Unser Mail Server ist so eingestellt, dass
er nur ihm bekannte Mail Accounts als Absender akzeptiert. Wenn ich
diese Sperre entferne, kann ich auch jede beliebige Adresse eingeben.

Zurück zum Problem:

Ich habe versucht alles möglichst so zu konfigurieren, wie Du es
beschrieben hast. Doch kommt bei mir eine Fehlermeldung. Da ich die
Lösung über SSIS bevorzuge, möchte ich da jetzt dran bleiben. Daher
habe ich von all meinen Einstellungen inklusive Fehlermeldung ein
Screenshot gemacht.

Vielleicht kannst du mir so besser weiterhelfen. Bei einigen Dingen
war ich mir nicht ganz sicher, ob es so richtig ist.

http://voodoo.myrabbits.de/priv/fehlerscreens.zip

Hoffe es ist hier erlaubt Links zu posten.

Moby

unread,
Mar 10, 2009, 9:51:15 AM3/10/09
to
Hallo Manuel

Das Erste was ich feststellen konnte ist, dass du den SQL Task als
ConnectionType ADO.Net eingestellt hast. Bei mir funktioniert das über
OLEDB. Sollte aber nicht das Problem ergeben, solange Du ein Resultset
erhälst
Im Mail senden hast du in E-Mail einen Eintrag in "To". Ich habe ihn
leer gelassen. Wird ja später über die Variable in der Schleife
befüllt.

schau sonst mal in deine Private Mailadresse

Gruss Moby

0 new messages