Buscar

lunes, 4 de mayo de 2009

Enviar email c# (outlook), con archivo adjunto

Esta funcion envia un correo desde c#, y adjunta un archivo, lo he probado con gmail y desde un servidor de correo empresarial, espero les sirva.

librerias


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



class clsMail
{


public static bool Enviar()
{
//Ruta de archivo adjunto (Si lo lleva)
string PathFile = @"Z:\archivo.rar";

//Creo el mensaje del mail.
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();

//Agrego los destinatarios, pueden ir varios
msg.To.Add("Paraquienvaelcorreo@empresa.com.co");

//Agrego la direccion del que manda el email, puede ser falsa o verdadera, pero si es falsa puede que el servidor de correo lo detecte como spam, tambien depende de las credenciales que se ponen mas abajo
msg.From = new MailAddress("jaas.jaas@gmail.com", "Jaas", System.Text.Encoding.UTF8);

//Pongo el asunto
msg.Subject = "Asunto" ;

//El tipo de codificacion del Asunto
msg.SubjectEncoding = System.Text.Encoding.UTF8;

//Escribo el mensaje Y su codificacion
msg.Body = "Mensaje del correo";
msg.BodyEncoding = System.Text.Encoding.UTF8;

//Especifico si va ha ser interpertado con HTML
msg.IsBodyHtml = false;

//Agrego el archivo que puse en la ruta anterior "PathFile", y su tipo.
Attachment Data = new Attachment(PathFile, MediaTypeNames.Application.Zip );

//Obtengo las propiedades del archivo.
ContentDisposition disposition = Data.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(PathFile);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(PathFile);
disposition.ReadDate = System.IO.File.GetLastAccessTime(PathFile);
//Agrego el archivo al mensaje
msg.Attachments.Add(Data);

//Creo un objeto de tipo cliente de correo (Por donde se enviara el correo)
SmtpClient client = new SmtpClient();

//Si no voy a usar credenciales pongo false, Pero la mayoria de servidores exigen las credenciales para evitar el spam
//client.UseDefaultCredentials = false;

//Como voy a utilizar credenciales las pongo
client.Credentials = new System.Net.NetworkCredential("jaas.jaas@gmail.com", "Password");
//Si fuera gmail seria 587 el puerto, si es un servidor outlook casi siempre el puerto 25, yo utilizo un servidor propio de correo
//client.Port = 587;
client.Port = 25;

//identifico el cliente que voy a utilizar
client.Host = "Miservidor.com.co";

//Si fuera a utilizar gmail esto deberia ir en true, esto es un certificado de seguridad
//client.EnableSsl = true;
client.EnableSsl = false;


try
{
//Envio el mensaje
client.Send(msg);
return true;
}
catch (System.Net.Mail.SmtpException ex)
{
return false;
}
}

}

34 comentarios:

  1. No me funciona me da el siguiente error:

    Error de compilación

    Descripción: Error durante la compilación de un recurso requerido para dar servicio a esta solicitud. Revise los detalles de error específicos siguientes y modifique el código fuente en consecuencia.

    Mensaje de error del compilador: CS0007: Error de inicialización inesperado de Common Language Runtime - 'Cuota insuficiente para procesar este comando. '

    Error de código fuente:


    [Líneas de código fuente no relevantes]

    Archivo de origen: Línea: 0

    ResponderEliminar
  2. Anonimo; el código lo he utilizado en bastantes programas y no he tenido ningún problema, estuve buscando el error que comentas arriba y encontré que el error, que te aparece es posible que no sea del código sino del motor del frame work, creo que lo recomendado es que instales de nuevo el frame work y trates de compilarlo de nuevo
    http://msdn.microsoft.com/es-es/library/4bwh6d2t.aspx .
    Espero te funcione.

    ResponderEliminar
  3. hola amigo antes que nada gracias por la esta post,me esta sirviendo bastante, ya logre enviar correos atraves del servidor con que cuento pero ahora tengo un detalle que no logro resolver y es el siguiente: cuando intento enviar correos al exterior es decir que no tienen el dominio de mi servidor me marca error,como puedo resolver este problema para que desde mi servidor de correo de outlook pueda mandar correos a otras cuentas por ejemplo de hotmail,gmail,yahoo.etc??

    ResponderEliminar
  4. Que error te esta saliendo, y en que parte del codigo?, porque tienes que fijarte que para gmail debes utilizar el puerto 587,y el cliente de correo la direccion debe ser "smtp.gmail.com"

    ResponderEliminar
  5. una consulta amigo, quizas me pueda ayudar, por ejm yo genero una factura comercial y luego genero un reporte de esta, ahora lo que quiero es que ese reporte se exporte a pdf o excel automaticamente, apenas sea generado y se guarde como un archivo temporal en memoria y se envie automaticamente por correo.

    Gracias,

    ResponderEliminar
  6. Brayann, lo que pienso que podes hacer la factura como un reporte de crystal report, este tiene la opción de exportar el reporte a excel o a pdf, este archivo que genere el crystal report, lo puedes guardar en una carpeta temporal y desde hay lo puedes coger para que se envié por email con el código de esta pagina

    public static bool Enviar()
    {
    //Ruta de archivo adjunto (Si lo lleva)
    string PathFile = @"Z:\archivo.rar";<-- Este es el archivo que genera el cristal report



    --------------------
    Si tienes alguna duda, publica tu código, para poderte ayudar mejor.

    ResponderEliminar
  7. Primero Gracias Por Tu Apoyo Y Segundo Tengo Un Problema Me Da Un Error "El certificado remoto no es válido según el procedimiento de validación." Por Favor E Podrias Ayudar?????

    ResponderEliminar
  8. Pon el código con el que te da ese error para poderlo ver.

    ResponderEliminar
  9. Alguien sabe como guardar como .msg en una ubicación determinada del disco duro desde donde se ejecuta el codigo el mensaje, nicluidos los adjuntos?

    ResponderEliminar
  10. Yo estoy haciendo un add-In para el outlook que hace precisamente eso ... si quiere mandeme su email a jaas.jaas@gmail.com y yo le mando el proyecto para que lo mire, claro que todavia no esta terminado

    ResponderEliminar
  11. hey tengo un código hecho en C# para descargar archivos desd una carpeta y deseo que junto con una aplikación web en html pueda hacer mediante un link la descarga en dond i como debo agregar la ruta para el link??

    ResponderEliminar
  12. Hola, me da error sale por el ex del catch del final.. Dice Error no se pudo enviar mensaje.

    Porque sera ?

    ResponderEliminar
  13. Hola, me ha servido mucho el codigo. Como hacer para enviar mas de un archivo adjunto?

    Gracias!

    ResponderEliminar
  14. Puedes crear un array de
    Attachment[] Data y despues con un ciclo los agregas en esta parte
    //Agrego el archivo al mensaje
    msg.Attachments.Add(Data);
    quedaría algo así:
    for(int i=0 ;i<Data.Count;i++)
    {
    msg.Attachments.Add(Data[i]);
    }
    Espero le sirva.

    ResponderEliminar
  15. Pensé algo parecido, lo hice asi...
    Donde dtPathFile es un DataTable que en la columna 3 trae la ruta de los archivos...


    foreach (DataRow row in dtPathFile.Rows)
    {
    string PathFile =row.ItemArray[3].ToString();
    //Agrego el archivo que puse en la ruta anterior "PathFile", y su tipo.
    Attachment Data = new Attachment(PathFile, MediaTypeNames.Application.Zip);

    //Obtengo las propiedades del archivo.
    ContentDisposition disposition = Data.ContentDisposition;
    disposition.CreationDate = System.IO.File.GetCreationTime(PathFile);
    disposition.ModificationDate = System.IO.File.GetLastWriteTime(PathFile);
    disposition.ReadDate = System.IO.File.GetLastAccessTime(PathFile);
    //Agrego el archivo al mensaje
    msg.Attachments.Add(Data);
    }

    muchas gracias por la ayuda, espero les sirva mi pequeño aporte...

    ResponderEliminar
  16. Tengo otra consulta que me ha dado problemas...

    Al enviar un documento mayor a 3 MB, me da un error.

    System.Net.Mail.SmtpException was caught
    Message=Error al enviar correo.
    Source=System
    StackTrace:
    en System.Net.Mail.SmtpClient.Send(MailMessage message)
    en EnviarMail.Enviar(DataTable dtDestinatariosMail, String asunto, String body, DataTable dtPathFile) en c:\Users\storo\Desktop\GESTION PROCESO\Gestion Proceso Desarrollo\SitioWeb\App_Code\clsMail.cs:línea 78
    InnerException: System.IndexOutOfRangeException
    Message=Índice fuera de los límites de la matriz.
    Source=System
    StackTrace:
    en System.Net.Base64Stream.EncodeBytes(Byte[] buffer, Int32 offset, Int32 count, Boolean dontDeferFinalBytes, Boolean shouldAppendSpaceToCRLF)
    en System.Net.Base64Stream.Write(Byte[] buffer, Int32 offset, Int32 count)
    en System.Net.Mime.MimePart.Send(BaseWriter writer)
    en System.Net.Mime.MimeMultiPart.Send(BaseWriter writer)
    en System.Net.Mail.Message.Send(BaseWriter writer, Boolean sendEnvelope)
    en System.Net.Mail.SmtpClient.Send(MailMessage message)
    InnerException:

    cualquier ayuda o idea será bienvenida...

    Gracias!!

    ResponderEliminar
  17. Es un bug por el que te da ese fallo al enviar un adjunto de mas de 3MB. Te paso el link al HotFix

    https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=30226

    Saludos

    ResponderEliminar
  18. Me sale la siguiente excepcion "Se encontró un carácter no válido en el encabezado del correo: 'é'".

    ResponderEliminar
  19. Hola quisiera saber como resolvieron el siguiente problema:
    {"An invalid character was found in the mail header: 'á'."}

    ResponderEliminar
  20. a mi me sale eso también, lo raro es que ayer me funcionaba tan bien...y hoy me sale eso :S

    ResponderEliminar
  21. bueno, pues lo dejo aquí escrito por si a alguien más le pasa.

    mi problema estaba aquí:

    ContentDisposition disposition = data.ContentDisposition;
    disposition.CreationDate = System.IO.File.GetCreationTime(adjuntos[i]);
    disposition.ModificationDate =System.IO.File.GetLastWriteTime(adjuntos[i]);
    disposition.ReadDate = System.IO.File.GetLastAccessTime(adjuntos[i]);

    y es que como hoy es miÉrcoles con acento en la e...daba el error de codificación...manda cojones la cosa....xD

    ResponderEliminar
  22. Que tal, oye yo tengo una duda, en el servidor de SMTP, tengo que poner el de Hotmail?? es que ya puse el smtp.live.com y demas que segun son de hotmail y nomas e dice que no encuentra el host remoto

    ResponderEliminar
  23. Quiero enviar correo al servidor de mi empresa pero cual puerto y Host debo utilizar?

    ResponderEliminar
  24. hola oye y como le puedo hacer para enviar correos electronicos a distintos dominios que no sea el mismo de origen como hotmail ni el de gmail es decir que envie correos de un dominio a muchos dominios

    ResponderEliminar
  25. Hola muy buen aporte justo lo que necesitaba, pero tengo una pregunta como puedo hacer que envie copia del correo a otro, gracias!!!

    ResponderEliminar
    Respuestas
    1. para enviar copia del correo utiliza algo asi mira:
      MailMessage message = new MailMessage();

      message.From = new MailAddress(CuentaOrigen, NombreCuentaOrigen);

      if (Copia.Length >= 1)
      message.CC.Add(Copia);
      si deseas mandarle copia a mas de una persona lo separas con "," y listo continuas con tu envio

      espero te sirva

      Eliminar
  26. Amigo
    me ha funcionado perfecto!!! pero en maquina local
    sabes que tengo que modificar para montarlo a IIS 6??????
    Saludos coordiales y gracias!

    ResponderEliminar
  27. Pregunta, se genera un excepcion cuando envio archivos de nombres largos mas de 27 carcateres envia le archivo como utf-8hebbebebee.

    ResponderEliminar
  28. Alguien me dice como seteo las direcciones de copio oculta???
    Gracias

    ResponderEliminar
  29. Muchas gracias, me fue de mucha utilidad! gracias desde Colombia! si depronto sabes como darle prioridad alta al mensaje, te lo agradecería .

    ResponderEliminar
  30. Muchísimas Gracias por el aporte! funciona a la perfección, rápido y sencillo.

    Gracias de nuevo!

    ResponderEliminar
  31. Como podria enlazar que sea enviado el correo cuando sea inscrito algo en una base de datos?

    ResponderEliminar
  32. Me da el siguiente error:
    Error enviando correo electrónico: El buzón de correo no está disponible. La respuesta del servidor fue: 5.3.4 554-554 5.2.0 STOREDRV.Deliver; delivery result banner

    ResponderEliminar