【问题标题】:Creating Multiple Attachments from byte[] to MemoryStream in C#在 C# 中创建从 byte[] 到 MemoryStream 的多个附件
【发布时间】:2017-03-19 21:44:26
【问题描述】:

我正在使用 MVC 开发一个 Web 项目,该项目要求我从组合框中选择多个值(城市)并返回从 SQL 中提取的数据,并从数据中构建一个字符串。然后,它通过 MemoryStream 发送到 byte[] 流,以附加到电子邮件中。附件为“.csv”格式。当我选择“3”个城市并将其发送到我的操作时,只有第一个附件有数据。其他两个附件已创建,但是当我打开电子邮件时,附件是空白的。

下面是sn-p的代码:

    using (MailMessage message = new MailMessage())
    using (SmtpClient client = new SmtpClient())
    {
        client.Host = "smtp.mymailserver.com";
        client.Credentials = new System.Net.NetworkCredential("me@myemail.com", "mypass");
        message.From = new MailAddress("maintenance@myemail.com");
        message.To.Add(new MailAddress("justme@myemail.com"));

        // 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 对象。稍后在发送电子邮件时读取附件流。因此,每个附件都需要一个单独的流对象。
  • 感谢您的快速回复。由于我不知道最终用户将选择多少个值,我将如何创建多个 MemoryStreams?可以根据所选位置的“计数”创建它们的数组吗?
  • 只需将新的 System.IO.MemoryStream() 语句移动到循环内即可。
  • @HansPassant:不幸的是,这不起作用。我仍然得到相同的结果。

标签: c# email-attachments memorystream


【解决方案1】:

我解决了似乎与 MemoryStream 或 writer 无关的问题。我的问题是我需要在“拆分”中“修剪()”之后的空格。所以,当我的代码在寻找位置时,它找不到它。例如,我需要处理位置“El Paso”的数据,但如果它是在拆分中第一次出现之后,那么它将是“El Paso”。我的 switch/case 语句找不到该事件,因此将数据处理为“空白”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 2011-07-17
    • 1970-01-01
    • 2010-12-06
    • 2011-03-02
    • 1970-01-01
    相关资源
    最近更新 更多