我正在尝试发送包含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而无需使用作者。