3

我在 .NET 4.5 中有以下代码来使用 SmtpClient 发送电子邮件附件。我正在将下面创建的内存流添加到消息的附件集合中。

using System.IO;
using System.IO.Compression;

var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
    archive.CreateEntryFromFile(@"c:\Files\File1.txt", "File1.txt");
}

当我收到一封电子邮件时,它显示 zip 文件,但存档没有 File1.txt。这里缺少什么?

4

3 回答 3

0

我在程序中有类似的场景,在 MemoryStream 中创建 Zip 文件。正如 Jack Bradford 所说,执行 Close/Dispose 操作很重要,但还有一些棘手的问题:

首先,您不能关闭/处置 MemoryStrean,因为您需要打开它才能通过电子邮件附件发送它。

其次,您不能关闭/处置 ZipArchive。其底层逻辑将在 MemoryStream 对象中执行关闭操作。

第三,通常在写入 MemoryStream 对象后,指针留在流的末尾。如果您尝试从中读取,您将读取 0 个字节。这可能是您获得空 zip 文件的原因。

解决方案是在流的开头设置 MemoryStream 游标,这样你的下一个读取操作将能够获取所有数据:

  memoryStream.Position = 0;
  <Mail code>
  System.Net.Mime.ContentType ct = new    System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Application.Zip);
  System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(memoryStream,"ZipFile.zip", ct.MediaType);
   <Add attachment to email and send email>
   <Stream and Zip Close/Dispose operations>
于 2014-03-10T21:53:33.780 回答
0

我遇到了同样的问题,我所做的是:

 using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create, false)) {
       archive.CreateEntryFromFile(udf.FilePath, Path.GetFileName(udf.FilePath));
 }

在 ZipArchive 和电子邮件部分我使用了“false”:

mail.Attachments.Add(new Attachment(new MemoryStream(ai.Stream.ToArray()), ai.AttachedFilename, ai.MediaType));

new MemoryStream(ai.Stream.ToArray())在电子邮件中添加了一个流,现在附件很好。

于 2016-10-10T16:11:46.790 回答
-5

确保您处理 ZipArchive 并关闭 MemoryStream

var memoryStream = new MemoryStream();
    using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
         archive.CreateEntryFromFile(@"c:\Files\File1.txt", "File1.txt");
    }

archive.Dispose();
memoryStream.Close();

//Send Email
于 2014-02-09T23:38:01.317 回答