jueves, 23 de agosto de 2007

Como enviar correo electrónico desde un Windows Forms y C#

Es posible enviar un correo electrónico mediante C#, mediante las clases System.Net, System.Net.Mail y System.Net.Mime

En el siguiente ejemplo se muestra un formulario que envia un simple correo electrónico a través del Servidor SMTP de GMAIL y se le adjunta un archivo .xls

1.- Preparamos un Windows Form con un boton, para enviar el mail. En el código es fácil reconocer donde se podría sustituir la cadena de texto por un TextBox y su propiedad Text. Por ejemplo, para el correo destinatario, el cuerpo, el asunto, etc.

2.- En el código, establecemos las siguientes clases:

using System.Net;
using System.Net.Mail;
using System.Net.Mime;

3.- Y agregamos el siguiente código en el evento de un Button, por mencionar un ejemplo:

private void button1_Click(object sender, EventArgs e)
{

//Se prepara un nuevo mensaje
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();

//Se establece el destinatario
msg.To.Add("mauriciomoo@gmail.com");

//Se establece el remitente, asi como el nombre que aparecerá en la
//bandeja de entrada, así como el formato de codificación
msg.From = new MailAddress("mauriciomoo@gmail.com", "Soy el Dr. Omm", System.Text.Encoding.UTF8);

//Se establece el asunto del mail
msg.Subject = "Prueba de correo by Dr. Omm";

//Formato de codificación del Asunto
msg.SubjectEncoding = System.Text.Encoding.UTF8;

//Se establece el cuerpo del mail
msg.Body = “Saludos del Dr Omm”;

//Se establece la codificación del Cuerpo
msg.BodyEncoding = System.Text.Encoding.Unicode;

//Se indica si al cuerpo del mail, se interpretara como código HTMl
//o no, esto funciona cuando queremos que aparezca centrado algo
//mediante
, etc
msg.IsBodyHtml = false;

//Se establece la cadena de texto con la ubicación del archivo a
//adjuntar
string file = "C:/Datos.xls";

//Se adjunta el archivo
Attachment data = new Attachment(file, MediaTypeNames.Application.Octet);
ContentDisposition disposition = data.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(file);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
msg.Attachments.Add(data);

//Se prepara el envio del mail
SmtpClient client = new SmtpClient();

//Se establecen las credenciales para enviar el mail, muy importante autentificarse con la cuenta de correo y la contraseña
client.Credentials = new System.Net.NetworkCredential("mauriciomoo@gmail.com", "XXXXXXXXXXXXXX");

//Se establece el puerto de envio
client.Port = 587;

//Se establece el servidor SMTP, en este caso GMAIL
client.Host = "smtp.gmail.com";

//Seguridad SSL?, si como no, prueben ettereal
client.EnableSsl = true;


//Se envia el Mail
try
{
client.Send(msg);
}
catch (System.Net.Mail.SmtpException ex)
{
Console.WriteLine(ex.Message);
Console.ReadLine();
}
}

4.- Como se menciono antes, es necesario contar con las clases indicadas, así como el archivo a adjuntar. Acerca de las credenciales, es importante tener una cuenta de correo electrónico en el cual podamos utilizar su servidor SMTP. GMAIL lo permite, pero parece ser que Hotmail no. Habría que probar con algún otro servidor de correo, como sería nuestro proveedor de internet, el del trabajo, etc.

Por último, este ejemplo se realizó en Visual Studio 2005 con C# en el Net Framework 2.0


Esperando que se útil, así como sus comentarios, se despide

Dr. Omm

4 comentarios:

Armando Reyes dijo...

Sabes por que archivos mayores a 500 kb marca un error de time out y como se puede solucionar?

Mauricio Moo Aguilar (Dr. Omm) dijo...

Que tal Armando...
Los archivos adjuntos suben directamente a lo que es el mail que utilizas, por lo que en teoría, debería de aceptartelo, sin embargo, habría tambien que revisar si eso mismo funciona, cuando debugueas o cuando corres directamente el exe. En ocasiones el debug se detiene después de un tiempo en no cambiar de estado, pero en el exe llega hasta el final.
Ojala pueda servirte de algo.

Alberto dijo...
Este comentario ha sido eliminado por el autor.
Alberto dijo...

Hola, respecto al problema es muy sercillo, yo tuve el mismo que nuestro compañero Armando y simplemente cambiando el Timeout (propiedad del objeto) a 100 segundos, ya era suficiente para poder enviar un archivo de 3mbs, un saludo...