将iEnumerable转换为内存中的CSV文件,并将电子邮件作为附件转换为



我正在尝试发送包含CSV附件的电子邮件,而无需实际将文件写入磁盘之前。

这就是我到目前为止所拥有的。

public void EmailBillSiteReport(int billId, string siteNumber)
{
    var bill = GetElectricityBillMain(billId);
    var billSites = bill.ElectricityBillSites.Where(x => x.SiteNo == siteNumber);    
    Helpers.EmailHelper.ConstructAndSendEmail("sample@emailaddress.com", billInvoices.JoinStrings(","));       
}

扩展方法

public static class ListHelper
{
    public static string JoinStrings<T>(this IEnumerable<T> values, string separator)
    {
        var stringValues = values.Select(item =>
        (item == null ? string.Empty : item.ToString()));
        return string.Join(separator, stringValues.ToArray());
    }
}

发送

的方法
public static void ConstructAndSendEmail(string sendTo, string csv)
{
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    System.IO.StreamWriter writer = new System.IO.StreamWriter(ms);
    writer.Write(csv);
    System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain);
    System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct);
    attach.ContentDisposition.FileName = "myFile.csv";
    MailMessage md = new MailMessage();
    md.From = new MailAddress("samplefromaddress@email.com");
    md.To.Add(sendTo);
    md.Subject = "sample subject";
    md.Body = "sample body";
    md.Attachments.Add(attach);
    md.IsBodyHtml = false;
    SmtpClient client = new SmtpClient();
    var smtpSection = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp");
    client.Host = smtpSection.Network.Host;
    client.Port = smtpSection.Network.Port;
    client.UseDefaultCredentials = true;
    client.Send(md);
    //close the stream
    writer.Flush();
    writer.Dispose();
    ms.Close();
}

电子邮件带有CSV附件,并且大于268比特。里面什么都没有。我想将我的iEnumerable的内容变成逗号分隔的字符串,并将其作为CSV附加,最好将属性名称保留为标题。我的选择是使用linqtocsv并首先保存文件,然后将其捡起,但是我宁愿在内存中完成整个操作,因为不需要保存文件。

我在这里做错了什么?

编辑

如果我添加了Scott Hanselman的TOCSV扩展方法并将其传递到我的constructandsendemail中,则该文件仍然通过空。

您必须在使用流之前倒带:

writer.Write(csv);
writer.Flush();
ms.Seek(0, SeekOrigin.Begin);

更紧凑的替代方案:

MemoryStream ms =
   new MemoryStream(ASCIIEncoding.Default.GetBytes(csv));

使用这种紧凑的形式,您直接将CSV字符串转换为Memorystream而无需使用作者。

最新更新