Отправка почты с вложениями программно в ASP.NET - PullRequest
8 голосов
/ 29 ноября 2010

Я динамически генерирую ряд файлов разных типов на основе GridView в ASP.NET - электронной таблицы Excel и файла HTML. Я делаю это, используя этот код (это только для электронной таблицы Excel):

  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();

Я хотел бы предоставить пользователям возможность отправлять сгенерированный файл по электронной почте в виде вложения либо на указанный адрес электронной почты, либо на один, связанный с их учетной записью в базе данных. Но я не хочу, чтобы пользователь сохранял файл, а затем прикреплял его в форме - я хотел бы автоматически прикрепить созданный файл. Это возможно и насколько легко?

Конечно, я буду использовать класс System.Net.Mail для отправки почты ... если это все равно возможно!

Ответы [ 4 ]

8 голосов
/ 29 ноября 2010

Возможно, вы сможете создать System.Net.Mail.Attachment из строки, а затем отправить письмо как обычно.

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);
1 голос
/ 30 ноября 2010
    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 голосов
/ 30 ноября 2010

Вот рабочий пример того, что я упомянул ранее, в коде есть небольшая дополнительная логика для анализа GridView в таблице.

        //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("you@address.com", "You"));
                message.From = new MailAddress("me@address.com", "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);
            }
        }
0 голосов
/ 29 ноября 2010

Вы можете сохранить содержимое файла в байтовом массиве и затем сделать это:

Создание вложений почты в памяти

...