SmtpClient sehr langsam - etwa 2 Sekunden lang gedrückt, um zu senden eine sehr kleine E-Mail
Im mit SmtpClient senden eine einfache E-Mail.
Die E-Mail-constist von etwa 25 Zeichen (plaintext) so seine kleinen.
Es dauert jedoch die SmtpClient über 2000 Millisekunden zu senden, einer von Ihnen. Ich schaffen nicht die SmtpClient für jede sende - erstellte Programm starten, so ist die einzige Sache, die getan wird, ist dies:
DateTime start = DateTime.Now;
MailMessage oMsg = new MailMessage();
//TODO: Replace with sender e-mail address.
oMsg.From = new MailAddress(settings._Username);
oMsg.To.Add(new MailAddress(emailEvent._ContactItemToUse.Data));
oMsg.Subject = emo._Subject;
oMsg.BodyEncoding = Encoding.UTF8;
oMsg.IsBodyHtml = emo._IsHtmlText;
oMsg.Body = emo._Text;
client.Send(oMsg);
TimeSpan timeWasted = DateTime.Now.Subtract(start); //between 1000-2000 ms
Dies ist natürlich sehr schlecht, und ich kann nicht herausfinden, warum. Können Sie? =)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die SmtpClient-Klasse glaube ich nicht, dass die Wiederverwendung der gleichen Verbindung für jede gesendete E-Mails (edit: anscheinend ist dies jetzt möglich .NET 4.0, die Unterschiede sehen Sie in der Dokumentation für SmtpClient). Öffnen Sie eine neue Verbindung ist teuer, und das ist wahrscheinlich das, was Zeit braucht. Es gibt kommerzielle SMTP-Komponenten und bieten eine wesentlich höhere Leistung. Je nach SMTP-server und E-mail-Größe, ist es möglich, etwas zu erreichen, wie mindestens 50mails/Sekunde.
Jedoch könnte dies nicht ein Problem für Sie, wenn Sie ändern die Architektur leicht. Was ich in meiner Anwendung ist, dass SmtpClient liefert mails in einen Ordner, indem Sie mit smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory und Einstellung der PickupDirectoryLocation auf das gewünschte Verzeichnis. Was dies bedeutet ist, anstelle von senden der E-mail-Nachrichten über das Netzwerk, schreibt er Sie in den angegebenen Ordner als standard-mime-Nachrichten (.eml-format).
Hier können Sie entweder den IIS-SMTP-server oder einfach eine andere hintergrund-thread/Prozess zu konsumieren die .eml-Dateien erstellt und liefern Sie an die Empfänger oder an andere SMTP-server.
Dieser Ansatz, den ich denke, ist viel besser, einfach weil:
Als einen einfacheren Ansatz, können Sie mit SendAsync anstatt zu Senden, aber es nicht geben alle die unmittelbaren Ansätze der PickupDirectory Ansatz geben.
Ein paar Dinge in den Sinn kommen.
First off, einige Websites werden gezielt verlangsamt die Verbindung, um zu machen es weniger profitabel für Spammer E-mail zu senden, um Ihre Systeme. Dies wird als Tarpitting.
Interessanterweise die E-mail-server Ihrer site verwendet, um broadcast-könnte auch diese eingeschaltet. ( http://winzenz.blogspot.com/2005/12/enabling-smtp-tarpitting-in-windows.html )
Andere Sachen, die möglicherweise Probleme verursachen, wenn der empfangende mail-server eine kurze TTL für DNS-Einstellungen und/oder IHREN web-server hat einige schlechte (z.B. tot oder überlastet) DNS-Server die IP-setup.
Geschwindigkeit der SmtpClient-Klasse ist meist abhängig von der SMTP-server, den Sie verbinden & Geschwindigkeit Ihrer Internetverbindung. Der beste Weg zur Optimierung Ihrer durch-Ausgang mit
SmtpClient.SendAsync
und die Schaffung von bis zu 10 oder mehr optimierte verbindungen zum smtp-server. Nachdem alle, dies ist dieselbe Strategie, die von allen modernen web-Browsern zu tun, um speed up browsing.Vielleicht ist es nicht dein problem. Zu senden, einen server zu erhalten. Abhängig von Ihrem server kann einige Zeit in Anspruch nehmen. Haben Sie überprüft, dass ein Teil auch?
Versuchen telnetting und emulieren, das Protokoll des smtp-server in Frage und sehen Sie, welcher Befehl eigentlich, dass Verzögerungen Ihrer Kommunikation.
Meine Vermutung ist, dass der RCPT TO-Befehl macht eine Art von Bestätigung, die einige Zeit in Anspruch nimmt.
hatte exakt das gleiche Problem. ~2 Sekunden pro E-Mail.
für uns fest es:
Konfigurieren Der Eigenschaften Von Empfangsconnectors