2010-11-29 32 views
8

Je génère dynamiquement un certain nombre de types de fichiers différents en fonction d'un GridView dans ASP.NET - une feuille de calcul Excel et un fichier HTML. Je le fais en utilisant ce code (ce qui est juste pour la feuille de calcul Excel):Envoi de courrier avec pièces jointes par programme dans 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(); 

Je voudrais donner aux utilisateurs les options d'envoyer le fichier généré en tant que pièce jointe soit une adresse e-mail ils précisent ou un lien avec leur compte sur la base de données. Mais je ne veux pas que l'utilisateur doive enregistrer le fichier, puis l'attacher dans un formulaire - je voudrais attacher automatiquement le fichier généré. Est-ce possible et c'est facile?

Bien sûr, je vais utiliser la classe System.Net.Mail pour envoyer du courrier ... si c'est possible quand même!

+0

La classe MailMessage possède une propriété Attachments qui va le faire. Créez simplement une nouvelle pièce jointe (peut être basée sur un MemoryStream), puis joignez-la (par exemple MailMessage.Attachments.Add()). – Zachary

Répondre

8

Vous pourriez être en mesure de créer System.Net.Mail.Attachment de chaîne, puis envoyer le courrier comme normale .

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

Je voudrais créer le stringbuilder généré (ce qui est fait) en pièce jointe à Outlook et attendre que l'utilisateur appuie sur Envoyer. Je continue d'avoir une erreur. – Si8

0

Vous pouvez enregistrer le contenu du fichier dans un tableau d'octets et faites ceci:

Creating In-Memory Mail Attachments

+0

-1. Ceci est une application web. – Aliostad

+0

Négation d'Aliostad -1. Comme j'ai lu la question, Chris veut envoyer le courrier à l'utilisateur à partir de son serveur, et c'est la bonne façon de le faire. System.Net.Mail fonctionne de la même manière depuis un ordinateur de bureau ou une application Web. – Jess

+0

@Aliostad: Alors quel est le problème? La génération de fichier est côté serveur, donc je ne pense pas que cela devrait poser problème. –

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

Voici un exemple concret de ce que je l'ai mentionné plus tôt, il y a un peu de logique supplémentaire dans le code pour analyser le GridView à une table.

 //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); 
      } 
     }