title: Zip a MemoryStream for an email attachment
body: <p>I'm trying to zip an XML tree and use it as an email attachment. The sending of the email with an attachment succeeds, but the zip file created is always corrupt – it is not a valid zip file but does contain binary data. </p>
  
  <p>The problem is recreated as follows, see specifically <code>BuildAttachment()</code>: </p>
  
  <pre><code>static void Main(string[] args)
  {
      try
      {
          var report = new XElement("Report",
              new XElement("Product",
                  new XElement("ID", "10000001"),
                  new XElement("Name", "abcdefghijklm"),
                  new XElement("Group", "nopqrstuvwxyz")
              )
          );
          var mailMessage = BuildMessage(report);
          EmailMessage(mailMessage);
          Thread.Sleep(10000);
      }
      catch (Exception e) { Console.WriteLine(e.Message); }
  }
  static MailMessage BuildMessage(XElement report)
  {
      string from = "email1@address.com";
      string to = "email2@address.com";
      var message = new MailMessage(from, to, "Subject text", "Body text");
  
      var attachment = BuildAttachment(report);
      message.Attachments.Add(attachment);
  
      return message;
  }
  static Attachment BuildAttachment(XElement report)
  {
      var inStream = new MemoryStream();
      report.Save(inStream);
      inStream.Position = 0;
  
      var outStream = new MemoryStream();
      var compress = new DeflateStream(outStream, CompressionMode.Compress);
      inStream.CopyTo(compress);
  
      outStream.Position = 0;
      return new Attachment(outStream, "report.zip", "application/zip");
  }
  static void EmailMessage(MailMessage message)
  {
      var smtpClient = new SmtpClient("127.0.0.1");
      smtpClient.SendCompleted += SendCompletedCallback;
      smtpClient.SendAsync(message, null);
  }
  static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
  {
      if (e.Error != null)
          Console.WriteLine(e.Error.ToString());
  }
  </code></pre>
  
  <p>To put the problem in context: It’s part of a windows service application so I don’t want to create files on disk, and the email message also contains xslt-transformed alternate views of the xml tree so I don’t want a completely different solution. </p>
  
  <p>Any suggestions why the zip file is corrupt?</p>