2012-07-02 56 views
1

有没有人有一个例子,能够发送附件保存为utf8编码的附件的电子邮件。我试过,但是当我在记事本中打开它说编码是ascii。注意:我不想先保存文件。电子邮件中的附件以UTF-8编码保存

// Init the smtp client and set the network credentials 
      SmtpClient smtpClient = new SmtpClient(); 
      smtpClient.Host = getParameters("MailBoxHost"); 

      // Create MailMessage 
      MailMessage message = new MailMessage("[email protected]",toAddress,subject, body); 

      using (MemoryStream memoryStream = new MemoryStream()) 
      { 
       byte[] contentAsBytes = Encoding.UTF8.GetBytes(attachment); 
       memoryStream.Write(contentAsBytes, 0, contentAsBytes.Length); 

       // Set the position to the beginning of the stream. 
       memoryStream.Seek(0, SeekOrigin.Begin); 

       // Create attachment 
       ContentType contentType = new ContentType(); 
       contentType.Name = attachementname; 
       contentType.CharSet = "UTF-8"; 

       System.Text.Encoding inputEnc = System.Text.Encoding.UTF8; 

       Attachment attFile = new Attachment(memoryStream, contentType); 

       // Add the attachment 
       message.Attachments.Add(attFile); 

       // Send Mail via SmtpClient 
       smtpClient.Send(message); 


      } 

回答

1

为UTF-8添加BOM (byte order mark)在流的开头:

0xEF,0xBB,0xBF 

代码:

byte[] bom = { 0xEF, 0xBB, 0xBF }; 
memoryStream.Write(bom, 0, bom.Length); 

byte[] contentAsBytes = Encoding.UTF8.GetBytes(attachment); 
memoryStream.Write(contentAsBytes, 0, contentAsBytes.Length); 
1

假设你的附件是文本,则ContentType类的默认构造函数会将附件的Content-Type标题设置为application/octet-stream,但它需要设置为text/plain,例如:

ContentType contentType = new ContentType(MediaTypeNames.Text.Plain); 

或者:

ContentType contentType = new ContentType(); 
contentType.MediaType = MediaTypeNames.Text.Plain; 

此外,您应该指定附件一TransferEncoding,为UTF-8是不是7位干净(其中许多电子邮件系统仍然需要),例如:

attFile.TransferEncoding = TransferEncoding.QuotedPrintable; 

或者:

attFile.TransferEncoding = TransferEncoding.Base64;