2010-03-11 50 views
11

我正在建立一個應用程序,我有義務創建一個MailMessage(System.Net.mail.MailMessage)並將它保存在磁盤上,因爲.msg擴展名不是.eml保存System.Net.mail.MailMessage作爲.msg文件

下面是我使用保存作爲MAILMESSAGE .msg文件的方法:

public static void Save(MailMessage Message, string FileName) 
    { 
     Assembly assembly = typeof(SmtpClient).Assembly; 
     Type _mailWriterType = 
      assembly.GetType("System.Net.Mail.MailWriter"); 

     using (FileStream _fileStream = 
       new FileStream(FileName, FileMode.Create)) 
     { 
      // Get reflection info for MailWriter contructor 
      ConstructorInfo _mailWriterContructor = 
       _mailWriterType.GetConstructor(
        BindingFlags.Instance | BindingFlags.NonPublic, 
        null, 
        new Type[] { typeof(Stream) }, 
        null); 

      // Construct MailWriter object with our FileStream 
      object _mailWriter = 
       _mailWriterContructor.Invoke(new object[] { _fileStream }); 

      // Get reflection info for Send() method on MailMessage 
      MethodInfo _sendMethod = 
       typeof(MailMessage).GetMethod(
        "Send", 
        BindingFlags.Instance | BindingFlags.NonPublic); 

      // Call method passing in MailWriter 
      _sendMethod.Invoke(
       Message, 
       BindingFlags.Instance | BindingFlags.NonPublic, 
       null, 
       new object[] { _mailWriter, true }, 
       null); 

      // Finally get reflection info for Close() method on our MailWriter 
      MethodInfo _closeMethod = 
       _mailWriter.GetType().GetMethod(
        "Close", 
        BindingFlags.Instance | BindingFlags.NonPublic); 

      // Call close method 
      _closeMethod.Invoke(
       _mailWriter, 
       BindingFlags.Instance | BindingFlags.NonPublic, 
       null, 
       new object[] { }, 
       null); 
     } 
    } 

但保存的MSG文件無法打開,並在下面的錯誤: 「無法打開文件XYZ .msg文件文件可能不存在,您可能沒有權限打開它或者它可能被另一個程序打開....「

我的問題是:如何將System.Net.mail.MailMessage保存爲msg文件?

回答

4

Here瑞恩建議一個簡單而好的方法來做到這一點,而無需付出任何努力。

You can actually configure the SmtpClient to send emails to the file system instead of the network. You can do this programmatically using the following code:

SmtpClient client = new SmtpClient("mysmtphost"); 
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; 
client.PickupDirectoryLocation = @"C:\somedirectory"; 
client.Send(message); 

你也可以在你的應用程序配置文件設置這是這樣的:

<configuration> 
    <system.net> 
     <mailSettings> 
      <smtp deliveryMethod="SpecifiedPickupDirectory"> 
       <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" /> 
      </smtp> 
     </mailSettings> 
    </system.net> 
</configuration> 
+2

是的,這是真的,但MailMessage保存爲.eml文件,我希望它被保存爲.msg文件 – Gaby

+1

爲什麼downvoting這?這不是「答案」,但這是一個很好的建議...... –

+0

加比,你有答案嗎? – zipi

2

如果你指到Outlook .msg文件,這不能在本地進行.N​​ET 。

Outlook .msg文件是一個複合文檔,因此,您需要將其保存爲該格式,並確保將所有相應的屬性放在其確切位置。

您需要自己寫,使用第三方或可能的Outlook互操作。

對不起,

戴夫

0

Outlook提供的錯誤消息是因爲.msg擴展名。我使用相同的方法將MailMessage對象保存到磁盤,並發現該文件只能在Outlook中打開,擴展名爲.eml

2

檢查使用Outlook互操作庫Creating an Outlook Message File with C#這個簡短的例子。這不完全是你要求什麼,但有一種方法複製值從一個到另一個 - 手動。

+2

Outlook Interop對客戶端安裝Office的端設置,但在服務器端方案中幾乎不可用。 – saille