Protokoll von msdb.dbo.sp_send_dbmail

ny_unity

SQL-Guru
Beiträge
195
Guten Morgen liebe Gemeinde,

ich habe eine Schleife, in der bei Bedarf eine E-Mail über einen Mailserver nach extern verschickt wird. Der Mailserver ist ebenfalls extern, der über das SQL-E-Mail-Profil angesprochen wird. Die synstax der msdb.dbo.sp_send_dbmail ist sicher bekannt:
Code:
EXEC msdb.dbo.sp_send_dbmail 
    @recipients = 'meineMail@mail.com', 
    @profile_name = 'congratulation',
    @subject = @sub,
    @body = @tableHTML,
    @body_format = 'HTML'

Nach Durchlauf meines SQL bekomme ich nur die Info, das E-Mal 1546 in die Warteschlange übergeben wird. Danach erhalte ich keinerlei Infos mehr, was mit dieser E-Mail passiert.

Gibt es eine Möglichkeit des Status der E-Mail zu verfolgen und ob der Mailserver diese E-Mail angenommen hat und wie dessen Status ist?

Vielen Dank!

Erik
 
Werbung:
Ich habe die Funktion selbst noch nicht genutzt aber ich kann mir das nur schwer vorstellen. Wenn du mit Telnet eine E-Mail an einen SMTP Server sendest ist die Kommunikation mit Annahme der E-Mail ja beendet, nichts anderes wird hier der Fall sein.

Natürlich kann dein E-Mail Server die weitere Verarbeitung irgendwie protokollieren aber die Datenbank kommuniziert ja nicht mehr mit dem E-Mail Server.

Kommt die Mail denn überhaupt an oder funktioniert das noch gar nicht?
 
der E-Mailversand funktioniert tadellos. Die Sache ist die, ich sende automatisiert eine Geburtstagsemail an Kunden. Ich möchte halt protokollieren, wenn die E-Mail nicht versandt werden konnte, durch was auch immer für Ereignisse, z.B. offline des SMTP Servers oder so. Auf Syntax-Fehler der E-Mail kann ich noch vor dem Versand prüfen, aber alles andere ist schwierig. Es könnte ja auch sein, das irgendwann mein SMTP Server feststellt das ich SPAM versende, er nimmt die Mail an, aber versendet diese nicht, das würde ich ja nie mitbekommen...

Verstehst was ich mein?
 
Okay also Meldungen wie SMTP Server nicht erreichbar oder Annahme verweigert bekommst du möglicherweise gut protokolliert. Du müsstest nur die Rückgabemeldung irgendwo hin schreiben in eine Tabelle
Rückgabecodewerte
Ein Rückgabecode von 0 steht für Erfolg. Ein beliebiger anderer Wert steht für Fehler. Der Fehlercode für die fehlgeschlagene Anweisung befindet sich in der @@ERROR Variable.
Also @@ERROR auslesen und das Ergebnis speichern oder aufgrund eines anderen Ergebnisses als 0 eine Handlung ausführen.

Wenn die Mail Kette an einer anderen Stelle versagt wird es immer schwierig. Hier kann höchstens der Mail Server irgendwas tun wenn entweder er die Mail nicht weiter geleitet bekommt, eine Fehlermeldung vom Empfänger zurück gegeben wird oder die E-Mail eine Empfangsbestätigung anfragt und diese vom Mail Server empfangen wurde. Das sind aber alles Dinge die passieren wenn die Verbindung DB zu Mailserver schon nicht mehr besteht daher glaube ich nicht das hier sozusagen ein E-Mail Empfang durch die DB vorgesehen ist.[/QUOTE]
 
Werbung:
Ich habe nochmal recherchiert, man kann aus dem msdb.dbo.sp_send_dbmail die Mail-ID lesen, diese kann man dann in der Tabelle msdb.dbo.sysmail_mailitems abfragen und erhält
0 = 'Unsent'
1 = 'Sent'
2 = 'Failed'
3 = 'Retrying'

Das ist zwar sehr allgemein, aber ich kann anhand einer separaten Abfrage mich per E-Mail an einem jeden Abend oder Morgen darüber informieren lassen, welche E-Mails den status <> 1 haben und diese dann genauer prüfen.

Danke für die Hilfe... falls sich jemand fragt wie man die ID der E-Mail ausliest:

Code:
DECLARE @MailItemID AS INT;

EXEC msdb.dbo.sp_send_dbmail 
    @recipients = 'test@mail.de,
    @profile_name = 'profil',
    @subject = 'test',
    @body = 'Das ist eine Test E-Mail für den Error-Code',
    @body_format = 'HTML',
    @mailitem_id = @MailItemID OUTPUT
Über
Code:
SELECT @mailitem_id
bekommt man die ID.
 
Zurück
Oben