Ich kenne zwei verschiedene Ansätze. Den einen hatte ich implementiert, war irre aufwendig - und wurde so dann doch nie richtig genutzt. Der andere läuft seit ein paar Wochen auf Server-Daten - und scheint das Problem insgesamt sehr effizient zu lösen:
Erste Technik: Den Mailserver so konfigurieren, daß eine Unzustellbarkeitsnachricht an ein bestimmtes Mailkonto geschickt wird. Das regelmäßig abfragen, die Mail (die bei Microsoft-SMTP als Multipart ankommt) in die Teile zerlegen, das decodieren, im Header der ursprünglichen Mail einen eindeutigen Zufallsschlüssel mitschicken, der ausgelesen und auf die Datenbank, dort auf die Tabelle mit den Mails abgebildet wird.
Zweite Technik, die inzwischen implementiert ist und seit einigen Wochen von mehreren Kunden genutzt wird: Der Datenbankserver startet einen Job, der das Versenden ausführt. Zunächst werden die Mailadressen aus einer Tabelle zusammengesammelt und die Mail individualisiert (Anrede, Abmeldelink bzw. Hinweis zu den Logindaten und zum Nutzernamen). Das wird pro Mail an eine externe gespeicherte Prozedur geschickt, die effektiv eine .NET - Prozedur aufruft. Diese prüft (geht über einen Betriebssystemaufruf von NsLookup), ob es den Domainnamen gibt und ermittelt den MX-Datensatz dafür. Wenn das scheitert, geht das mit einer entsprechenden Fehlernummer zurück. Anschließend wird mit dem TcpClient - Objekt eine Session auf Port 25 zu diesem Server aufgemacht mit im Prinzip folgender Befehlsfolge:
QUOTE HELO intern.server-daten.de (also das übliche Sich-Vorstellen)
MAIL FROM: <Absendermail>
RCPT TO: Empfängermail
QUIT
Läuft das alles korrekt durch, dann gibt es die Mail, anschließend wird die Mail an den lokalen SMTP-Server ausgeliefert, der die Mail tatsächlich verschickt. Gibt es einen Fehler (Antwort beginnt mit 5, bsp. Konto unbekannt), dann liefert die .NET-Prozedur das über einen Statuswert zurück. Das Ergebnis (positiv/negativ) protokolliert die aufrufende Routine in einer Tabelle. Bei einem Fehler wird die Mail als invalide markiert, so daß sie nicht mehr zum Versenden genutzt wird.
Allerdings gab es beim ersten derartigen Versuch stapelweise Fehler. Hintergrund war, daß diverse Mailserver einen merkwürdigen Spamschutz implementieren: Gibt es ein Tripel von Absendemail, Empfänger und Server zum ersten Mal, dann wird die Mail mit einem 450, 451 oder anderem temporären Fehler der 400-Klasse abgelehnt: Try again, greylistet, greylistet - retry in 300 seconds usw. Ein gewöhnlicher Mailserver schickt die Mail einfach nach wenigen Minuten nochmals. Das mußte dann auch für diese Routine implementiert werden - Mails mit 400-Fehler werden in eine Tabelle zwischengespeichert, diese wird nach 6 Minuten erneut abgearbeitet, erneutes Zwischenspeichern der 400-Fehler, erst nach dem dritten Versuch beendet sich diese Routine schließlich.
Praktisch ist das inzwischen ein sehr leistungsfähiges Tool geworden.
Technisch läuft das als einmaliger Sql-Server - Job direkt auf dem Datenbankserver, der Code braucht durchaus eine halbe bis dreiviertel Stunde, falls es solche GreyListed - Mails gibt.