smtpexception net mail form está enviar disponible credenciales correo con buzón archivo adjunto .net asp.net smtp smtpclient system.net.mail

.net - net - enviar email c# windows form



.NET El mejor método para enviar correo electrónico(System.Net.Mail tiene problemas) (7)

Esto parece ser bastante sencillo. Necesito enviar un correo electrónico desde algunas aplicaciones ASP.NET. Necesito hacer esto de manera consistente, sin errores extraños y sin la utilización de la CPU a través del techo. No estoy hablando de correos electrónicos masivos, solo correos electrónicos ocasionales.

System.Net.Mail parece estar horriblemente roto. El SmtpClient no emite el comando Salir (puede deberse a que Microsoft (R) no está interesado en las siguientes especificaciones), por lo tanto, la conexión queda abierta. Por lo tanto, si alguien intenta enviar un correo electrónico antes de que esa conexión finalmente se cierre, puede obtener errores del servidor SMTP acerca de demasiadas conexiones abiertas. Este es un error que Microsoft (R) no tiene ningún interés en solucionar. Mira aquí:

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711

Además, si miras a tu alrededor, algunos sugieren usar este código para resolver este problema:

smtpClient.ServicePoint.MaxIdleTime = 1; smtpClient.ServicePoint.ConnectionLimit = 1;

Ok, sí, eso "resuelve" el problema de las conexiones que se dejan abiertas. Sin embargo, esto de manera consistente, pruébelo en un servidor si lo desea, hace que la CPU en la que se está ejecutando el proceso (en este caso w3wp.exe) se salte y permanezca al 100% hasta que su grupo de aplicaciones se recicle. Por la razón que sea, el hilo que ejecuta mscorwks.dll! CreateApplicationContext es el culpable.

Esto tiene el efecto secundario muy bueno de que si está ejecutando un host web que frunce el ceño con un uso sostenido del 100% de la CPU, su grupo de aplicaciones se desactivará. Así que esto no es tan trivial como algunos sugieren.

¿Entonces mi pregunta es qué hacer? Lo que necesito hacer es tan simple; Sin embargo, no es aceptable obtener esos errores de "demasiadas conexiones abiertas" y tampoco lo es el uso del 100% de la CPU. No quiero comprar un componente de terceros, no porque sea barato, sino que compro suficientes componentes y una suscripción a MSDN que parece una locura tener que desembolsar entre $ 100 y $ 300 para una funcionalidad SMTP simple.

Leí que establecer el MaxIdleTime más alto puede ayudar pero soy escéptico de eso. No quiero arriesgarme a que mi grupo de aplicaciones esté deshabilitado solo porque Microsoft no quiere seguir la especificación SMTP.

Edición: miré los componentes de quiksoft.com, sin embargo, no admite la autenticación SMTP y cuesta $ 500. Tiene que haber una solución a este problema.


Aunque no he tenido ningún problema específico con System.Net.Mail hasta ahora, siempre se puede usar la API System.Web.Mail más antigua, que es un contenedor para CDOSYS.


En .NET 4.0, SmtpClient ahora es desechable. El comando SMTP QUIT se emite al desechar, como cuando se utiliza en un bloque de uso.


Envío la mayor parte de mi correo usando un Sproc. Incluso puedo adjuntar un archivo.

CREATE PROCEDURE [dbo].[sendMail_With_CDOMessage] @to VARCHAR(64), @CC VARCHAR(1024)='''', @BCC VARCHAR(1024)='''', @subject VARCHAR(500)='''', @body VARCHAR(8000)='''' , @from VARCHAR(64), @filename VARCHAR(255)='''', @priority INT = 0 AS BEGIN SET NOCOUNT ON DECLARE @handle INT, @return INT, @s VARCHAR(64), @sc VARCHAR(1024), @up CHAR(27), @server VARCHAR(255) SET @s = ''"http://schemas.microsoft.com/cdo/configuration/'' SELECT @s = ''Configuration.Fields('' + @s, @up = ''Configuration.Fields.Update'', @server = ''smtp.yourdomain.com'' EXEC @return = sp_OACreate ''CDO.Message'', @handle OUT SET @sc = @s + ''sendusing").Value'' EXEC @return = sp_OASetProperty @handle, @sc, ''2'' SET @sc = @s + ''smtpserver").Value'' EXEC @return = sp_OASetProperty @handle, @sc, @server EXEC @return = sp_OAMethod @handle, @up, NULL EXEC @return = sp_OASetProperty @handle, ''To'', @to EXEC @return = sp_OASetProperty @handle, ''CC'', @CC EXEC @return = sp_OASetProperty @handle, ''BCC'', @BCC EXEC @return = sp_OASetProperty @handle, ''From'', @from EXEC @return = sp_OASetProperty @handle, ''Subject'', @subject EXEC @return = sp_OASetProperty @handle, ''HTMLBody'', @body EXEC @return = sp_OASetProperty @handle, ''Priority'', ''cdoHigh'' IF @filename IS NOT NULL EXEC @return = sp_OAMethod @handle, ''AddAttachment'', NULL, @filename EXEC @return = sp_OAMethod @handle, ''Send'', NULL IF @return 0 BEGIN PRINT ''Mail failed.'' IF @from IS NULL PRINT ''From address undefined.'' ELSE PRINT ''Check that server is valid.'' END ELSE PRINT ''Mail sent.'' EXEC @return = sp_OADestroy @handle END


He usado Quicksoft en el pasado y no tengo quejas. Otra cosa que puede intentar es cambiar la configuración SMTP para usar una carpeta de recolección en lugar de enviar usando la red que debería solucionar el problema "no envía QUIT".


Hemos utilizado hMailserver con gran éxito. La configuración puede tardar un tiempo en acostumbrarse, pero ha sido un producto de servidor de correo excelente y gratuito.

Si desea rodar el suyo propio (lo que hice hace años cuando estaba teniendo un tiempo con CDONTS), puede comenzar con el código a continuación y personalizarlo según el contenido de su corazón. Utiliza el TcpClient para crear una conexión TCP directamente al servidor de correo. No es que lo recomiende cuando hay tantas soluciones establecidas y depuradas, pero esto me pareció muy útil para la depuración y para determinar dónde estaba el problema con los componentes de correo de MS prefabricados.

private void Send_Email() { #region Email Sending Function string strMail = ""; try { // See RFC821 http://www.faqs.org/rfcs/rfc821.html for more specs // TcpClient is an abstraction of a TCP Socket connection TcpClient myTCP = new TcpClient(); // Connect to the mail server''s port 25 myTCP.Connect(mailserver, 25); // Open a network stream which sends data to/from the TcpClient''s socket System.Net.Sockets.NetworkStream ns = myTCP.GetStream(); // The data to send to the mail server, basically a raw SMTP mail message strMail = "HELO/n"; strMail += "MAIL FROM:[email protected]/n"; strMail += "RCPT TO:" + recipient + "/n"; strMail += "DATA/n"; strMail += "Subject: mySubject/n"; strMail += "To:" + recipient + "/n"; strMail += "From: /"From Real Name/" <[email protected]>/n"; strMail += "/n"; strMail += " ---------------------------------------/n"; strMail += "Name: " + txtName.Text + "/n"; strMail += "Address1: " + txtAddress1.Text + "/n"; strMail += "Address2: " + txtAddress2.Text + "/n"; strMail += "City: " + txtCity.Text + "/n"; strMail += "State: " + txtState.Text + "/n"; strMail += "Zip: " + txtZip.Text + "/n"; strMail += "Email: " + txtEmail.Text + "/n"; strMail += "Dealer: " + txtDealer.Text + "/n"; strMail += " ---------------------------------------/n"; strMail += "THIS IS AN AUTOMATED EMAIL SYSTEM. DO NOT REPLY TO THIS ADDRESS./n"; strMail += "/n./n"; // Defines encoding of string into Bytes (network stream needs // an array of bytes to send -- can''t send strings) ASCIIEncoding AE = new ASCIIEncoding(); byte[] ByteArray = AE.GetBytes(strMail); // send the byte-encoded string to the networkstream -> mail server:25 ns.Write(ByteArray, 0, ByteArray.Length); //ns.Read(ByteArray, 0, ByteArray.Length); //lblStatus.Text = ByteArray.ToString(); // close the network stream ns.Close(); // close the TCP connection myTCP.Close(); } catch(Exception ex) { throw new Exception("Couldn''t send email: <p>" + ex.Message); } #endregion }


Me enfrenté al mismo problema de utilización de la CPU con la configuración descrita. Terminé abriendo un ticket con Microsoft para determinar la causa del problema. El problema de utilización de la CPU se encuentra en la clase ServicePoint. Internamente en la clase de ServicePoint, hay un temporizador que se ejecuta cada (MaxIdleTime / 2) milisegundos. ¿Ves el problema? Al cambiar el valor de MaxIdleTime a 2, la utilización de la CPU bajará a los niveles normales.