Benutzer mit den meisten Antworten
Versenden von Mails via system.net: Es läuft bereits ein asynchroner Aufruf. Err muss abgeschlossen oder abgebrochen werden, bevor Sie diese Methode aufrufen können.

Frage
-
Liebe NG,
ich verwende ein vb.net Programm zum Versenden von Bulk Mails, welches die Methode
mySmtpsvr.SendAsync(smtpMailMessage, userstate)
innerhalb eines Schleifendurchlaufs verwendet. Das läuft nun schon seit Jahren ohne Probleme. Bis heute. Evtl. hängt die Umstellung auf unseren neuen E-Mail Provider (MS Exchange / Office 365) damit zusammen. Der Versand wird nun nach der ersten Mail mit der obigen Meldung abgebrochen.
Frage: Kann der Providerwechsel die Ursache hierfür sein? Müssen evtl. irgendwo Einstellungen vorgenommen, die asynchrones Senden wieder erlauben? Welche Möglichkeiten gibt es, das Problem zu umgehen? Gibt es evtl. Tools für vb.net die sich providerunabhängig verwenden lassen? Ich war der Meinung, dass SendAsync genau solche Fehler vermeiden soll. Wie kommt es überhaupt zu dieser Meldung?
Gruß
Thomas
Antworten
-
Hallo Tom,
wenn ich für jede Mail diese Instanzen neu definiere scheint das wieder zu funktionieren.
mySmtpsvr = New SmtpClient()
myCredentials = New System.Net.NetworkCredential
smtpMailMessage = New MailMessageAuf jeden Fall kommt der Fehler nicht mehr und die Mails werden auch versendet. Bin aber nicht sicher, ob diese Methode ganz sauber ist.
Hilfreich wäre ein kleines Beispiel, wie SendAsync innerhalb einer for each.. Schleife verwendet werden kann. Der schematische Aufbau würde mir genügen. Möglichst als Hintergrundprozess, da während des Versands noch personalisierte PDF Anlagen erzeugt werden. Das blockiert z.Zt. noch den Dialog.
Gruß
Thomas
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 12. Januar 2016 07:02
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 20. Januar 2016 08:05
-
Hallo Thomas,
um alles in einer foreach-Schleife abzuarbeiten dürfte deine Variante die beste sein.Ich kenne mich aber zu wenig mit der Thematik aus ob es nicht vielleicht besser wäre nur eine Verbindung zum SMTP Server offen zu halten und nicht maximal so viele wie es E-Mails gibt.
Für den Fall müsstest du dir eine Liste (Stack<T> o.ä.) erstellen welche die Liste der zu sendenden E-Mails enthält. Sobald nun das SendCompleted-Event eintritt kannst du wieder eine neue E-Mail versenden und diese aus dem Stack löschen. Das ist meiner Meinung nach der sauberste Weg, wenn auch nicht der einfachste.
Um gegen das Blockieren des Dialogs vorzugehen musst du nun einfach alles in einen 2. Thread auslagern. Das ist aber ein anderes Thema.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 12. Januar 2016 07:01
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 20. Januar 2016 08:05
-
Hallo Thomas,
ich würde die Liste der zu sendenden MailMessage Objekte in eine List<...> stecken und im SendCompleted Ereignis prüfen, ob noch welche zu senden sind. Falls ja, die SendAsync Methode nochmal aufrufen bis eben keine Mails mehr in der Liste stehen bzw. alle den Status "gesendet" haben (müsstest Du selbst einbauen und deine List entsprechend aufbauen).
Falls Du lokal einen SMTP Dienst wie bspw. den von IIS nutzen kannst, wäre es ggfs. auch sinnvoll, nicht direkt an den Ziel SMTP zu senden, sondern über die SmtpClient Einstellungen dafür zu sorgen, dass das Ergebnis in eine Datei geschrieben wird. Die IIS SMTP Queue holt sich dann die Mails ab und sendet diese selbst. Dort kannst Du dann auch euren Exchange als Smarthost angeben. Das reduziert doch einiges an Last.
http://weblogs.asp.net/gunnarpeipman/asp-net-using-pickup-directory-for-outgoing-e-mails
http://www.systemnetmail.com/faq/4.7.aspx
Insbesondere die letztgenannte Website ist eine gute Ressource für alles rund um System.Net.Mail
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 12. Januar 2016 07:02
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 20. Januar 2016 08:05
Alle Antworten
-
Hallo Thomas,
verwendet ihr die normale SmtpClient-Klasse? In der Doku von SendAsync ist folgender Hinweis zu finden:
InvalidOperationException - This SmtpClient has a SendAsync call in progress.
Ich nehme daher mal an dass auch hier nur eine Mail nach der anderen gesendet werden kann. Die nächste E-Mai senden kannst du erst wieder wenn das SendCompleted-Event ausgelöst wurde.
In wie Fern das mit einem Anbieterwechsel zusammen hängt kann ich nicht sagen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo Tom,
wenn ich für jede Mail diese Instanzen neu definiere scheint das wieder zu funktionieren.
mySmtpsvr = New SmtpClient()
myCredentials = New System.Net.NetworkCredential
smtpMailMessage = New MailMessageAuf jeden Fall kommt der Fehler nicht mehr und die Mails werden auch versendet. Bin aber nicht sicher, ob diese Methode ganz sauber ist.
Hilfreich wäre ein kleines Beispiel, wie SendAsync innerhalb einer for each.. Schleife verwendet werden kann. Der schematische Aufbau würde mir genügen. Möglichst als Hintergrundprozess, da während des Versands noch personalisierte PDF Anlagen erzeugt werden. Das blockiert z.Zt. noch den Dialog.
Gruß
Thomas
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 12. Januar 2016 07:02
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 20. Januar 2016 08:05
-
Hallo Thomas,
um alles in einer foreach-Schleife abzuarbeiten dürfte deine Variante die beste sein.Ich kenne mich aber zu wenig mit der Thematik aus ob es nicht vielleicht besser wäre nur eine Verbindung zum SMTP Server offen zu halten und nicht maximal so viele wie es E-Mails gibt.
Für den Fall müsstest du dir eine Liste (Stack<T> o.ä.) erstellen welche die Liste der zu sendenden E-Mails enthält. Sobald nun das SendCompleted-Event eintritt kannst du wieder eine neue E-Mail versenden und diese aus dem Stack löschen. Das ist meiner Meinung nach der sauberste Weg, wenn auch nicht der einfachste.
Um gegen das Blockieren des Dialogs vorzugehen musst du nun einfach alles in einen 2. Thread auslagern. Das ist aber ein anderes Thema.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 12. Januar 2016 07:01
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 20. Januar 2016 08:05
-
Hallo Thomas,
ich würde die Liste der zu sendenden MailMessage Objekte in eine List<...> stecken und im SendCompleted Ereignis prüfen, ob noch welche zu senden sind. Falls ja, die SendAsync Methode nochmal aufrufen bis eben keine Mails mehr in der Liste stehen bzw. alle den Status "gesendet" haben (müsstest Du selbst einbauen und deine List entsprechend aufbauen).
Falls Du lokal einen SMTP Dienst wie bspw. den von IIS nutzen kannst, wäre es ggfs. auch sinnvoll, nicht direkt an den Ziel SMTP zu senden, sondern über die SmtpClient Einstellungen dafür zu sorgen, dass das Ergebnis in eine Datei geschrieben wird. Die IIS SMTP Queue holt sich dann die Mails ab und sendet diese selbst. Dort kannst Du dann auch euren Exchange als Smarthost angeben. Das reduziert doch einiges an Last.
http://weblogs.asp.net/gunnarpeipman/asp-net-using-pickup-directory-for-outgoing-e-mails
http://www.systemnetmail.com/faq/4.7.aspx
Insbesondere die letztgenannte Website ist eine gute Ressource für alles rund um System.Net.Mail
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Dienstag, 12. Januar 2016 07:02
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Mittwoch, 20. Januar 2016 08:05