2011-01-13 10 views
7

Al usar la configuración de system.net/mail web.config para configurar mi SmtpClient, falla al entregar correos electrónicos, con un "error de protocolo" descrito mejor por la codificación y autenticación Base64 problemas:SmtpClient no se autenticará cuando se infle desde web.config

Ejemplo:
con la siguiente configuración

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
      <network host="servermail.outsourced.com" 
        port="2525" 
        defaultCredentials="false" 
        userName="username" 
        password="password"/> 
     </smtp> 
    </mailSettings> 
</system.net> 

y el código:

var tmp = new SmtpClient(); 

MailMessage msg = new MailMessage(); 
msg.Subject = "test"; 
msg.From = new MailAddress("[email protected]"); 
msg.To.Add(new MailAddress("[email protected]")); 
msg.Body = "test"; 
tmp.Send(msg); 

genera el mensaje de error:

System.Net.Mail.SmtpException: The server committed a protocol violation The server response was: UGFzc3dvcmQ6 
    at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response) 
    at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException 
& exception) 
    at System.Net.Mail.SmtpClient.Send(MailMessage message) 

Sin embargo, en el siguiente código donde hice manualmente todas las propiedades, el código se ejecuta sin excepción y se entrega el correo electrónico.

var tmp2 = new SmtpClient("servermail.outsourced.com", 2525); 
tmp2.Credentials = new NetworkCredential("username", "password"); 
tmp2.UseDefaultCredentials = false; 

MailMessage msg = new MailMessage(); 
msg.Subject = "test"; 
msg.From = new MailAddress("[email protected]"); 
msg.To.Add(new MailAddress("[email protected]")); 
msg.Body = "test"; 
tmp2.Send(msg); 
+3

Si decodifica UGFzc3dvcmQ6, obtiene "Contraseña", por lo que aparentemente hay un problema con su autenticación. Lo he probado yo mismo sin ningún problema.Posible duplicado: http://stackoverflow.com/questions/2380531/problem-in-sending-mail-with-smtpclient – thomasvdb

+0

Esa fue mi sospecha inicial, excepto que las mismas credenciales producen un error cuando se configuran a través de la configuración web, y funcionan cuando se establece usando el código. –

+0

¿Qué es el servidor de correo en uso? – Hawxby

Respuesta

3

Probé los ajustes de configuración desde dentro LINQPad contra mi servidor de correo de hMailServer, y funcionó muy bien. Entonces, supongo que el servidor de correo con el que se está comunicando es el apretón de manos con el cliente de forma inesperada. Cuando era la prueba, he capturado el registro SMTP de mi servidor, y esto es lo que parecía (higienizado, por supuesto):

SENT: 220 my.mailserv.er ESMTP 
RECEIVED: EHLO CLIENTAPP 
SENT: 250-my.mailserv.er[nl]250-SIZE 25600000[nl]250 AUTH LOGIN 
RECEIVED: AUTH login bWFpbHRlc3RAbXkubWFpbHNlcnYuZXI= 
SENT: 334 UGFzc3dvcmQ6 
RECEIVED: *** 
SENT: 235 authenticated. 
RECEIVED: MAIL FROM:<[email protected]> 
SENT: 250 OK 
RECEIVED: RCPT TO:<[email protected]> 
SENT: 250 OK 
RECEIVED: DATA 
SENT: 354 OK, send. 

Mi servidor requiere autenticación SMTP, y se puede ver que después de mi cliente envía el El comando AUTH, el servidor responde con el código de estado 334 y la representación codificada en base 64 de Password:. Por lo tanto, recomendaría turning on the trace functionality para el SmtpClient para que pueda ver lo que está ocurriendo en ambos escenarios.

estaba corriendo LINQPad 4,31 y el archivo de linqpad.config contenía:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
     <network host="my.mailserv.er" port="25" userName="[email protected]" password="supersecure"/> 
     </smtp> 
    </mailSettings> 
    </system.net> 
</configuration> 

La consulta LINQPad fue el siguiente:

SmtpClient mailer = new SmtpClient(); 

Guid g = Guid.NewGuid(); 
g.Dump("Message GUID"); 

MailMessage msg = new MailMessage(); 
msg.Subject = "Test:" + g; 
msg.To.Add(new MailAddress("[email protected]")); 
msg.Body = "I HAS A BODY"; 
mailer.Send(msg); 
1

Pruebe a establecer el atributo deliveryMethod para forzar la configuración para utilizar la red-config

<system.net> 
    <mailSettings> 
     <smtp deliveryMethod="network" from="[email protected]"> 
      <network host="servermail.outsourced.com" 
        port="2525" 
        defaultCredentials="false" 
        userName="username" 
        password="password"/> 
     </smtp> 
    </mailSettings> 
</system.net> 
+0

Gracias por la recomendación. No tuvo efecto. –

+0

¿Ha intentado depurar y verificar las propiedades del servidor SMTP después de que se hayan completado correctamente al usar web.config para almacenar sus credenciales? Tal vez hay un valor incorrecto allí. – Scott

2

Añadir esta para iniciar sesión

Por favor, comentar lo Se utilizan AuthenticationModules (los encontrará indicados en network.log). En mi caja, SmtpLoginAuthenticationModule # se usa de forma constante, pero hay otros posibles.

<system.diagnostics> 
    <sources> 
     <source name="System.Net" tracemode="includehex"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
     <source name="System.Net.Sockets"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 
     <source name="System.Net.Cache"> 
     <listeners> 
      <add name="System.Net"/> 
     </listeners> 
     </source> 

    </sources> 
    <switches> 
     <add name="System.Net" value="Verbose"/> 
     <add name="System.Net.Sockets" value="Verbose"/> 
     <add name="System.Net.Cache" value="Verbose"/> 
    </switches> 
    <sharedListeners> 
     <add name="System.Net" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="network.log" 
     /> 
    </sharedListeners> 
    <trace autoflush="true"/> 

    </system.diagnostics> 
+0

¿Dónde se pueden ver esos registros? – brenjt

0

Guys este código no está mal Trato usando devsmtp para la máquina local y funcionar bien

secundario protegido (remitente de ByVal como objeto, ByVal e As EventArgs) Button1_Click Mangos Button1.Click

Using tmp = New SmtpClient() 
     Dim msg As New MailMessage() With {.Subject = "test", .From = New MailAddress("[email protected]")} 
     msg.[To].Add(New MailAddress("[email protected]")) 
     msg.Body = "test" 
     tmp.Send(msg) 
    End Using 

End Sub 

descargue el devsmtp para la máquina local desde

http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=smtp4dev&DownloadId=269147&FileTime=129575689693530000&Build=20393

Cuestiones relacionadas