2017-03-17 70 views
0

我正在使用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中的数据,实际上有数据。另一个测试是只选择一个城市/地点,以查看附件是否在电子邮件中,并且它已成功填充。有人能跳进来告诉我我做错了什么吗?谢谢。

+0

您不能只使用一个MemoryStream对象。当邮件发送时,附件流将在稍后读取。所以你需要一个单独的流对象为每个附件。 –

+0

感谢您的快速响应。由于我不知道最终用户将选择多少个值,我将如何去创建多个MemoryStream?是否可以根据所选位置的“计数”创建它们的数组? – Janou

+0

只需在循环内移动新的System.IO.MemoryStream()语句。 –

回答

0

我解决了我的问题,这似乎与MemoryStream或作家没有任何关系。我的问题是我需要在我的“分割”中“修剪”(“)”之后的空格。所以,当我的代码寻找位置时,它找不到它。例如,我需要处理位置“埃尔帕索”的数据,但如果它是在分裂中第一次出现之后,那么它会是“埃尔帕索”。我的switch/case语句找不到该事件,因此它将数据处理为“空白”。