2009-01-16 14 views

回答

8

好吧我自己解決了這個問題。這裏的技巧是將附件轉換爲Base64編碼字符串,這與電子郵件系統執行此操作的方式大致相同。我創建了一個類來處理這個問題。這裏發佈他人:

[DataContract] 
    public class EncodedAttachment 
    { 
     [DataMember(IsRequired=true)] 
     public string Base64Attachment; 

     [DataMember(IsRequired = true)] 
     public string Name; 

     /// <summary> 
     /// One of the System.Net.Mime.MediaTypeNames 
     /// </summary> 
     [DataMember(IsRequired = true)] 
     public string MediaType; 
    } 

public EncodedAttachment CreateAttachment(string fileName) 
     { 
      EncodedAttachment att = new EncodedAttachment(); 
      if (!File.Exists(fileName)) 
       throw new FileNotFoundException("Cannot create attachment because the file was not found", fileName); 

      FileInfo fi = new FileInfo(fileName); 
      att.Name = fi.Name; 
      att.MediaType = System.Net.Mime.MediaTypeNames.Text.Plain; 

      using (FileStream reader = new FileStream(fileName, FileMode.Open)) 
      { 
       byte[] buffer = new byte[reader.Length]; 
       reader.Read(buffer, 0, (int)reader.Length); 
       att.Base64Attachment = Convert.ToBase64String(buffer); 
      } 
      return att; 
     } 

而且在客戶端:

public void SendEmail(SmallMessage msg) 
     { 
      using (MailMessage message = new MailMessage()) 
      { 
       message.Body = msg.Body; 
       message.Subject = msg.Subject; 
       message.To.Add(new MailAddress(msg.To)); 
       message.From = new MailAddress(msg.From); 
       foreach (EncodedAttachment att in msg.Attachments) 
       { 
        message.Attachments.Add(CreateAttachment(att)); 
       } 

       SmtpClient client = new SmtpClient(); 
       client.Send(message); 
      } 
     } 


Attachment CreateAttachment(EncodedAttachment encodedAtt) 
{ 
    MemoryStream reader = new MemoryStream(Convert.FromBase64String(encodedAtt.Base64Attachment)); 
    Attachment att = new Attachment(reader, encodedAtt.Name, encodedAtt.MediaType); 
    return att;    
} 
相關問題