# Habilitando la autenticación SMTP con CDOSYS (System.Web.Mail)

<datetime class="hidden">2004-02-20T00:00</datetime>

<!-- category -- mostlylucidcouk, Imported, ASP.NET, C# -->
Uno de los problemas más comunes con el uso [CDOSYS](http://msdn.microsoft.com/library/en-us/cdosys/html/_cdosys_about_cdo_for_windows_2000.asp) (que es la clase subyacente utilizada por [Sistema.Web.Mail)](http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemwebmail.asp) es la falta de autenticación para el envío de correo a través de SMTP, [Darren Jefford](http://blogs.gotdotnet.com/darrenj/) [publicó un método](http://blogs.gotdotnet.com/darrenj/permalink.aspx/abb9e979-98dd-4172-b07c-2c4919ed94bf) para hacer esto, lo he reproducido a continuación ya que actualmente está alojado en GotDOtNwet y así puede desaparecer en algún momento:

### System.Web.Mail y autenticación

Una pregunta surgió recientemente sobre cómo enviar correo electrónico desde .NET, System.Web.Mail ofrece un buen MailMessage y SmtpMail clase que hace el truco.

Las clases son un envoltorio sobre el [CDOSYS](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/e2k3/e2k3/_techsel_tech_1.asp)funcionalidad que ha estado alrededor por un tiempo, y son mucho más agradables que la interfaz bastante torpe CDOSYS :)

Es muy directo para enviar un correo:

*System.Web.Mail.MailMessage msg = new System.Web.Mail.MailMessage(); msg.Subject = "Testing";msg.Body = "Hello World";msg.From = "yourname@domain.com* *";msg.To = "* *someone@domain.com* *";*

*Sistema.Web.Mail.SmtpMail.SmtpServer = "YOUREXCHANGESERVER";System.Web.Mail.SmtpMail.Enviar( msg );*

Sin embargo, cuando lo estaba probando contra un servidor de Exchange se negó a enviar, devolviendo este error:

*System.Runtime.InteropServices.COMException (0x8004020E): El servidor rechazó la dirección del remitente. La respuesta del servidor fue: 454 5.7.3 El cliente no tiene permiso para enviar correo a este servidor.*

Por defecto (y sabiamente) Exchange no permite a los usuarios no autenticados enviar correo a través de SMTP para evitar los spammers, etc. Para cortar un disparo de historia muy larga la clase SmtpMail no maneja la autenticación al servidor Exchange lo que significa que no se puede utilizar la clase en los escenarios más seguros.

Después de mucho cavar encontré que CDOSYS [lo hace](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_schema_configuration_smtpauthenticate.asp)tienen código de autenticación como usted esperaría, sin embargo la clase MailMessage o SmtpMail no expone ninguna manera de activarlo. Después de un poco más de excavación encontré que el equipo de Everett (.NET Framework 1.1) se dio cuenta de esto y añadió una nueva propiedad llamada Campos, que como usted puede [ver](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwebmailmailmessageclassfieldstopic.asp)falta alguna documentación ;-)

Por lo tanto, después de alguna investigación más he encontrado que usted puede autenticarse contra un servidor, si usted tiene la versión 1.1 del marco, y esta es la línea que usted tiene que añadir al código anterior:

msg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",2);

Cuando el 2 especifica NTLM, 1 para básico, 0 para ninguno (el predeterminado)

Por supuesto, también puede configurar el [miríada](http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_schema_configuration.asp)de otras opciones de configuración a través de esta colección de campos

Siento que viene un artículo de MSDN HOWTO, y tal vez pidiendo políticamente que se cargue alguna documentación de MSDN! :-)