2010-11-29 7 views
8

Ich erstelle dynamisch eine Reihe von verschiedenen Arten von Dateien auf der Grundlage einer GridView in ASP.NET - eine Excel-Tabelle und eine HTML-Datei. Ich mache diesen Code so verwenden (dies ist nur für die Excel-Tabelle):Senden von E-Mails mit Anlagen programmatisch in 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(); 

Ich mag würde Benutzer geben, um die Optionen der erzeugten Datei als Anhang per E-Mail an entweder eine E-Mail-Adresse, die sie angeben oder eine verknüpfte mit ihrem Konto in der Datenbank. Aber ich möchte nicht, dass der Benutzer die Datei speichern muss, und fügen Sie sie dann in einem Formular an - ich möchte die generierte Datei automatisch anhängen. Ist das möglich und wie einfach ist es?

Natürlich werde ich die System.Net.Mail-Klasse verwenden, um Mail zu senden ... wenn es sowieso möglich ist!

+0

Die MailMessage-Klasse verfügt über eine Attachments-Eigenschaft, die dies tut. Erstellen Sie einfach ein neues Attachment (kann auf einem MemoryStream basieren) und hängen Sie es an (z. B. MailMessage.Attachments.Add()). – Zachary

Antwort

8

Sie könnten in der Lage sein System.Net.Mail.Attachment aus Zeichenfolge erstellen dann die E-Mail wie gewohnt versenden .

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

Ich möchte den generierten Zeichenfolgengenerator (der fertig ist) zu einem Anhang zu Outlook erstellen und darauf warten, dass der Benutzer Send drückt. Ich bekomme immer einen Fehler. – Si8

0

Sie können den Inhalt der Datei in ein Byte-Array speichern und dann wie folgt vorgehen:

Creating In-Memory Mail Attachments

+0

-1. Dies ist eine Webanwendung. – Aliostad

+0

Negieren von Aliostads -1. Während ich die Frage lese, möchte Chris die Mail von seinem Server an den Benutzer senden, und das ist der richtige Weg. System.Net.Mail funktioniert genauso von einem Desktop oder einer Webanwendung. – Jess

+0

@Aliostad: Also, was ist das Problem? Die Dateigeneration ist serverseitig, also denke ich nicht, dass dies ein Problem sein sollte. –

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

Hier ist ein funktionierendes Beispiel von dem, was ich früher erwähnt, ist es ein wenig zusätzliche Logik in den Code der Gridview in einer Tabelle zu analysieren.

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