我正在做一个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吗?
答案 0 :(得分:0)
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;
}
答案 1 :(得分:0)
After a little tweaking, The below code worked fine for me.
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;
}