2010-11-29 44 views
8

Genero dinámicamente varios tipos diferentes de archivos basados ​​en un GridView en ASP.NET, una hoja de cálculo de Excel y un archivo HTML. Estoy haciendo lo que usar este código (esto es sólo para la hoja de cálculo de Excel):Envío de correos electrónicos con archivos adjuntos programáticamente en ASP.NET

Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment;filename=InvoiceSummary" + Request.QueryString["id"] + ".xls"); 
    Response.Charset = ""; 

    Response.ContentType = "application/vnd.xls"; 
    System.IO.StringWriter stringWrite = new System.IO.StringWriter(); 
    System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); 
    contents.RenderControl(htmlWrite); 
    //GridView1.RenderControl(htmlWrite); 
    Response.Write(stringWrite.ToString()); 
    Response.End(); 

me gustaría dar a los usuarios las opciones de envío por correo electrónico el archivo generado como archivo adjunto a una dirección de correo electrónico que especifique o uno relacionado con su cuenta en la base de datos. Pero no quiero que el usuario tenga que guardar el archivo y luego adjuntarlo en un formulario. Me gustaría adjuntar automáticamente el archivo generado. ¿Es esto posible y qué tan fácil es?

Por supuesto, usaré la clase System.Net.Mail para enviar correos ... ¡si es posible de todos modos!

+0

La clase MailMessage tiene una propiedad de Archivos adjuntos que hará esto. Simplemente cree un nuevo archivo adjunto (puede estar basado en un MemoryStream) y luego adjúntelo (por ejemplo, MailMessage.Attachments.Add()). – Zachary

Respuesta

8

Usted puede ser capaz de crear System.Net.Mail.Attachment de cadena a continuación, enviar el correo con normalidad .

var m = new System.Net.Mail.MailMessage(from, to, subject, body); 
var a = System.Net.Mail.Attachment.CreateAttachmentFromString(stringWrite.ToString(), "application/vnd.xls"); 
m.Attachments.Add(a); 
+0

Me gustaría crear el generador de cadenas generado (que está hecho) a un archivo adjunto a Outlook y esperar a que el usuario presione Enviar. Sigo recibiendo un error – Si8

0

Puede guardar el contenido del archivo en una matriz de bytes y luego hacer esto:

Creating In-Memory Mail Attachments

+0

-1. Esta es una aplicación web. – Aliostad

+0

Negando Aliostad's -1. Mientras leo la pregunta, Chris quiere enviar el correo al usuario desde su servidor, y esta es la forma correcta de hacerlo. System.Net.Mail funciona de la misma manera desde un escritorio o una aplicación web. – Jess

+0

@Aliostad: ¿Cuál es el problema? La generación de archivos es del lado del servidor, así que no creo que esto sea un problema. –

1
protected void btnSend_OnClick(object sender, EventArgs e) 
    { 
     MailMessage mail = new MailMessage(); 
     byte[] data = new byte[1024]; 
     MemoryStream stream = new MemoryStream(data); 
     Attachment attach = new Attachment(stream, "Attachment file name"); 
     mail.Attachments.Add(attach); 
     new SmtpClient().Send(mail); 
    } 
0

Aquí es un ejemplo práctico de lo que he mencionado anteriormente, hay un poco de lógica adicional en el código para analizar el GridView a una tabla.

 //Table to store our GridView Data 
     Table table = new Table(); 

     //Parse our GridView into Table, stored in a StringBuilder 
     StringBuilder sb = new StringBuilder(); 
     using (StringWriter sw = new StringWriter(sb)) 
     { 
      using (HtmlTextWriter htw = new HtmlTextWriter(sw)) 
      { 
       // header 
       if (GridView1.HeaderRow != null) 
       { 
        table.Rows.Add(GridView1.HeaderRow); 
       } 

       // details 
       foreach (GridViewRow row in GridView1.Rows) 
       { 
        table.Rows.Add(row); 
       } 

       // footer 
       if (GridView1.FooterRow != null) 
       { 
        table.Rows.Add(GridView1.FooterRow); 
       } 

       // render table 
       table.RenderControl(htw); 
      } 
     } 


     using (MemoryStream memoryStream = new MemoryStream()) 
     { 
      using (StreamWriter writer = new StreamWriter(memoryStream)) 
      { 
       //Convert StringBuilder to MemoryStream 
       writer.Write(sb.ToString()); 
       writer.Flush(); 

       //Create Message 
       MailMessage message = new MailMessage(); 
       message.To.Add(new MailAddress("[email protected]", "You")); 
       message.From = new MailAddress("[email protected]", "Me"); 
       message.Subject = "The Subject"; 

       //Create Attachment 
       Attachment attachment = new Attachment(memoryStream, "InvoiceSummary.xls", "application/vnd.xls"); 

       //Attach Attachment to Email 
       message.Attachments.Add(attachment); 

       //Open SMTP connection to server and send 
       SmtpClient smtp = new SmtpClient(); 
       smtp.Port = 25; 
       smtp.Send(message); 
      } 
     } 
Cuestiones relacionadas