如何在应用程序中将程序创建的EXCEL附加到SMTP MAIL中



我需要将程序创建的EXCEL附加到应用程序中的SMTP MAIL。。。。我已经使用一种方法将数据表转换为EXCEL。该方法在我运行该应用程序时下载EXCEL文件,但我的要求是将创建的文件附加到我的smtp。。。我不知道如何从该方法返回创建的excel文件。。。有人能帮我吗?

这是将数据表转换为EXCEL:的代码

public static void ExportToSpreadsheet(DataTable table, string name)
{
HttpContext context = HttpContext.Current;
context.Response.Clear();
foreach (DataColumn column in table.Columns)
{
 context.Response.Write(column.ColumnName + ";");
}
context.Response.Write(Environment.NewLine);
foreach (DataRow row in table.Rows)
{
 for (int i = 0; i < table.Columns.Count; i++)
 {
  context.Response.Write(row[i].ToString().Replace(";", string.Empty) + ";");
 }
 context.Response.Write(Environment.NewLine);
 }
 context.Response.ContentType = "text/csv";
 context.Response.AppendHeader
 ("Content-Disposition", "attachment; filename=" + name +".csv");
  context.Response.End();
 }

以下是一些可能有所帮助的重构代码:

private static Stream DataTableToStream(DataTable table)
{
    const string semiColon = ";";
    var ms = new MemoryStream();
    var sw = new StreamWriter(ms);
    foreach (DataColumn column in table.Columns)
    {
        sw.Write(column.ColumnName);
        sw.Write(semiColon);
    }
    sw.Write(Environment.NewLine);
    foreach (DataRow row in table.Rows)
    {
        for (int i = 0; i < table.Columns.Count; i++)
        {
            sw.Write(row[i].ToString().Replace(semiColon, string.Empty));
            sw.Write(semiColon);
        }
        sw.Write(Environment.NewLine);
    }
    return ms;
}
private static MailMessage CreateMail(string from, 
    string to, 
    string subject, 
    string body, 
    string attname,  
    Stream tableStream)
{
    // using System.Net.Mail
    var mailMsg = new MailMessage(from, to, subject, body);
    tableStream.Position = 0;
    mailMsg.Attachments.Add(
        new Attachment(tableStream, attname, CsvContentType));
    return mailMsg;
}
private const string CsvContentType= "text/csv";
private static void ExportToSpreadsheetInternal(Stream tableStream, string name)
{
    HttpContext context = HttpContext.Current;
    context.Response.Clear();
    context.Response.ContentType = CsvContentType ;
    context.Response.AppendHeader(
        "Content-Disposition"
        , "attachment; filename=" + name + ".csv");
    tableStream.Position = 0;
    tableStream.CopyTo(context.Response.OutputStream);
    context.Response.End();
}
public static void ExportToSpreadsheet(DataTable table, string name)
{
    var stream = DataTableToStream(table);
    var mailMsg = CreateMail("from@example.com", 
        "to@example.com", 
        "spread", 
        "the spread", 
        name, 
        stream);
    ExportToSpreadsheetInternal(stream, name);
   // send the mailMsg with SmtpClient (config in your web.config)
   var smtp = new SmtpClient();
   smtp.Send(mailMsg);
}

将其添加到你的web.config中,假设你使用gmail,用你的…替换userpwd。。。。

  <system.net>
    <mailSettings>
        <smtp deliveryMethod="network" from="you@example.com">
          <network 
            host="smtp.gmail.com" 
            port="587"
            enableSsl="true"
            userName="user" 
            password="pwd"/>
        </smtp>
    </mailSettings>
  </system.net>

最新更新