繁体   English   中英

如何在C#MVC中将生成的Excel文件作为电子邮件附件发送

[英]How to send a generated excel file as an email attachment in C# MVC

我正在做一个MVC项目(页面之一),生成一个动态更改的DataTable。 我应该做两个功能,

1)生成一个excel文件,并使其可供最终用户下载-我已经成功完成了。

2)通过电子邮件将excel附件发送给最终用户。 -我以为应该很简单,但是看起来很复杂。 我不想将Excel临时保存在服务器中的某个位置,并将其附加到电子邮件中。 由于安全限制。 (用户只需单击电子邮件按钮,它就可以到达他的电子邮件地址)

这是我的代码,除了给我发送一个空的excel文件外,它什么也不做。

            public void EmailCurrMonthSummary()
                    {
                        DataAccess da = new DataAccess();
                        MonthEndSummary mes = new MonthEndSummary();
                        DataTable tempTable = new DataTable();
                        mes.MonthEndSummaryTable = da.GetCurrMonthSummary(); //returns a DataTable                    

                        MailMessage mail = new MailMessage();
                        mail.To.Add("User@xxx.com");
                        mail.From = new MailAddress("Sender@xxx.com");
                        mail.Body = "Hello World";
                        mail.Subject = "Month End Status";
            System.IO.MemoryStream str = DataToExcel(mes.MonthEndSummaryTable,"MonthEndSummary.xls");

            Attachment at = new Attachment(str, "MonthEndSummary.xls");

                        mail.IsBodyHtml = true;

                        SmtpClient smtp = new System.Net.Mail.SmtpClient();
                        smtp.UseDefaultCredentials = true;
                        smtp.Send(mail);
                    }


 public System.IO.MemoryStream DataToExcel(DataTable dt, string filename)
        {
            //StreamWriter sw = new StreamWriter();
            System.IO.StringWriter tw = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
            if (dt.Rows.Count > 0)
            {

                DataGrid dgGrid = new DataGrid();
                dgGrid.DataSource = dt;
                dgGrid.DataBind();
                dgGrid.HeaderStyle.Font.Bold = true;
                //Get the HTML for the control.
                dgGrid.RenderControl(hw);
                //Write the HTML back to the browser.
                //Response.ContentType = application/vnd.ms-excel;
                Response.ClearContent();
                Response.Buffer = true;
                Response.ContentType = "application/vnd.ms-excel";
                Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + "");
                Response.ContentEncoding = System.Text.Encoding.Default;

            }
            System.IO.MemoryStream s = new MemoryStream();
            System.Text.Encoding Enc = System.Text.Encoding.Default;
            byte[] mBArray = Enc.GetBytes(tw.ToString());
            s = new MemoryStream(mBArray, false);

            //return Content(tw.ToString(), "application/ms-excel");
            return s;
        }

有人可以帮我如何发送在DataToExcel函数中生成的Excel吗?

    private static void SetSmtpDetails()
     {
        ConfigurationModel smtpConfig = GetConfiguration(ConfigurationKey.SMTPServer.ToString());
        string smtpServerValue = smtpConfig.Value;

        ConfigurationModel smtpUserConfig = GetConfiguration(ConfigurationKey.SMTPUser.ToString());
        string smtpUserValue = smtpUserConfig.Value;

        ConfigurationModel smtpPasswordConfig = GetConfiguration(ConfigurationKey.SMTPPassword.ToString());
        string smtpPAsswordValue = smtpPasswordConfig.Value;

        ConfigurationModel smtpSslConfig = GetConfiguration(ConfigurationKey.EnableSsl.ToString());
        string smtpEnableSSl = smtpSslConfig.Value;

        ConfigurationModel portConfig = GetConfiguration(ConfigurationKey.Port.ToString());

        SmtpServer = !string.IsNullOrEmpty(smtpServerValue) ? Convert.ToString(smtpServerValue) : SmtpServer;
        SmtpUser = !string.IsNullOrEmpty(smtpUserValue) ? Convert.ToString(smtpUserValue) : SmtpUser;
        SmtpPassword = !string.IsNullOrEmpty(smtpPAsswordValue) ? Convert.ToString(smtpPAsswordValue) : SmtpPassword;
        EnableSsl = !string.IsNullOrEmpty(smtpEnableSSl) ? Convert.ToBoolean(smtpEnableSSl) : EnableSsl;
        Port = Convert.ToInt32(portConfig.Value);
        ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    }


public static bool SendMail(string fromAddress, string toAddress, string ccAddress, string bccAddress, string subject, string bodyMessage, bool isBodyHtml, string fileName, string fromName)
    {
        SetSmtpDetails();

        if (string.IsNullOrEmpty(fromAddress))
        {
            fromAddress = SmtpUser;
        }
        try
        {
            var mailMessage = new MailMessage();
            if (ccAddress != null && ccAddress.Trim().Length > 0)
            {
                mailMessage.CC.Add(ccAddress);
            }

            if (bccAddress != null && bccAddress.Trim().Length > 0)
            {
                mailMessage.Bcc.Add(bccAddress);
            }

            mailMessage.To.Add(toAddress);
            if (fromAddress != null && fromAddress.Trim().Length > 0)
            {
                if (fromName != null && fromName.Trim().Length > 0)
                {
                    mailMessage.From = new MailAddress(fromAddress, fromName);
                }
                else
                {
                    mailMessage.From = new MailAddress(fromAddress);
                }
            }

            subject = subject.Replace('\r', ' ').Replace('\n', ' ');
            bodyMessage = bodyMessage.Replace("\r\n", "<br />");

            mailMessage.BodyEncoding = Encoding.UTF8;
            mailMessage.Subject = subject;
            mailMessage.Body = bodyMessage;
            mailMessage.IsBodyHtml = isBodyHtml;
            mailMessage.Priority = MailPriority.High;

            if (fileName != null && fileName.Trim().Length > 0 && File.Exists(fileName))
            {
                mailMessage.Attachments.Add(new Attachment(fileName));
            }

            var client = new SmtpClient();
            try
            {
                client.Host = SmtpServer;
                client.Port = Port;
                client.Credentials = new NetworkCredential(fromAddress, SmtpPassword);
                client.DeliveryMethod = SmtpDeliveryMethod.Network;
                client.EnableSsl = EnableSsl;
                client.UseDefaultCredentials = true;

                ThreadPool.QueueUserWorkItem(o =>
                            client.SendAsync(mailMessage, Tuple.Create(client, mailMessage)));

            }
            catch (SmtpException smtpEx)
            {
                if (smtpEx.Message.Contains("secure connection"))
                {
                    client.EnableSsl = true;
                    client.Send(mailMessage);
                }
                return false;
            }
        }
        catch (Exception ex)
        {
            throw new InvalidOperationException(string.Format("Error occured while sending Email  : From Address: {0} \r\n - ToAddress : {1} \r\n ", fromAddress, toAddress), ex);
        }
        return true;
    }

稍作调整后,以下代码对我来说效果很好。

            public void EmailCurrMonthSummary()
                    {
                        DataAccess da = new DataAccess();
                        MonthEndSummary mes = new MonthEndSummary();
                        DataTable tempTable = new DataTable();
                        mes.MonthEndSummaryTable = da.GetCurrMonthSummary(); //returns a DataTable                    

                        MailMessage mail = new MailMessage();
                        mail.To.Add("User@xxx.com");
                        mail.From = new MailAddress("Sender@xxx.com");
                        mail.Body = "Hello World";
                        mail.Subject = "Month End Status";
System.IO.MemoryStream str = DataToExcel(mes.MonthEndSummaryTable);

            Attachment at = new Attachment(str, "MonthEndSummary.xls");
            mail.Attachments.Add(at);    

                        mail.IsBodyHtml = true;

                        SmtpClient smtp = new System.Net.Mail.SmtpClient();
                        smtp.UseDefaultCredentials = true;
                        smtp.Send(mail);
                    }


 public System.IO.MemoryStream DataToExcel(DataTable dt)
        {
            //StreamWriter sw = new StreamWriter();
            System.IO.StringWriter tw = new System.IO.StringWriter();
            System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw);
            if (dt.Rows.Count > 0)
            {

                DataGrid dgGrid = new DataGrid();
                dgGrid.DataSource = dt;
                dgGrid.DataBind();
                dgGrid.HeaderStyle.Font.Bold = true;
                //Get the HTML for the control.
                dgGrid.RenderControl(hw);
                //Write the HTML back to the browser.
                //Response.ContentType = application/vnd.ms-excel;
                Response.ClearContent();
                Response.Buffer = true;
                Response.ContentType = "application/vnd.ms-excel";
                Response.ContentEncoding = System.Text.Encoding.Default;

            }
            System.IO.MemoryStream s = new MemoryStream();
            System.Text.Encoding Enc = System.Text.Encoding.Default;
            byte[] mBArray = Enc.GetBytes(tw.ToString());
            s = new MemoryStream(mBArray, false);

            return s;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM