我正在使用MVC的web项目工作,这需要我从组合框中选择多个值(城市),并返回从SQL中提取的数据,数据。然后,它通过MemoryStream发送到byte []流,以附加到电子邮件。附件格式为“.csv”。当我选择,比方说,“3”城市,并将其发送给我的行动,只有第一个附件有数据。另外两个附件是创建的,但附件在我打开电子邮件时是空白的。在C#中创建从字节[]到MemoryStream的多个附件
下面的代码片段:
using (MailMessage message = new MailMessage())
using (SmtpClient client = new SmtpClient())
{
client.Host = "smtp.mymailserver.com";
client.Credentials = new System.Net.NetworkCredential("[email protected]", "mypass");
message.From = new MailAddress("[email protected]");
message.To.Add(new MailAddress("[email protected]"));
// split up the delimited locations into the list
List<String> listStrLineElements = LocationName.Split(',').ToList();
System.IO.MemoryStream ms = new System.IO.MemoryStream();
foreach (var loc in listStrLineElements)
{
System.IO.StreamWriter writer = new System.IO.StreamWriter(ms);
writer.Write(EmailAttachmentAdmin(loc, StartDate, EndDate), 0, EmailAttachmentAdmin(loc, StartDate, EndDate).Length); // this just gets my data as a concatenated string.
writer.Flush();
ms.Position = 0;
message.Attachments.Add(new Attachment(ms, loc.ToUpper() + "__" + StartDate.Month.ToString() + "-" + StartDate.Year.ToString() + "-TO-" + EndDate.Month.ToString() + "-" + EndDate.Year.ToString() + ".csv", "text/csv"));
}
message.Subject = "TEST NOTIFICATION: Monthly Maintenance Report Submitted for: " + LocationName;
message.IsBodyHtml = true;
message.Priority = MailPriority.High;
client.Send(message);
}
“EmailAttachmentAdmin”是我叫建立数据字符串的字符串的方法。我检查了SQL中的数据,实际上有数据。另一个测试是只选择一个城市/地点,以查看附件是否在电子邮件中,并且它已成功填充。有人能跳进来告诉我我做错了什么吗?谢谢。
您不能只使用一个MemoryStream对象。当邮件发送时,附件流将在稍后读取。所以你需要一个单独的流对象为每个附件。 –
感谢您的快速响应。由于我不知道最终用户将选择多少个值,我将如何去创建多个MemoryStream?是否可以根据所选位置的“计数”创建它们的数组? – Janou
只需在循环内移动新的System.IO.MemoryStream()语句。 –