2009-02-19 86 views
37

我正在使用SmtpClient發送帶附件的電子郵件。 但是對於某個批處理,我們需要以某種方式保存MailMessage而不是發送它們。 我們正在考慮/希望手動將消息上傳到用戶的草稿文件夾。如何在使用SmtpClient時保存電子郵件而不是發送郵件?

是否可以保存這些消息與完整的附件(不可能,我會想到)。或者,也可以將郵件上傳到用戶帳戶中的文件夾?

如果任何人有任何這方面的經驗,我非常感謝一些幫助或指針。

+0

「而不是發送」。 – Avram 2009-02-19 23:52:42

回答

57

在ASP.NET中進行測試時,我們將電子郵件保存到一個文件夾,而不是通過電子郵件服務器發送。也許你可以改變你的批處理的web.config這樣的設置?

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> 
    </smtp> 
    </mailSettings> 
</system.net> 

附加信息:

+0

謝謝工作。另外Avram(見下文)發佈了一個有用的鏈接,討論將電子郵件名稱從自動生成的GUID更改爲您自己的值。 – user17510 2009-02-20 00:57:35

+0

我試過這個方法,並且我得到一個錯誤,指出「From」地址沒有被指定。有沒有一種方法可以在web.config中指定SpecifiedPickupDirectory?當你進行網絡設置時,有 – codeMonkey 2018-01-19 19:01:51

-6

這高度依賴於電子郵件客戶端及其自動化API。 SMTP是一種郵件發送和傳輸協議。它沒有能力保存甚至檢索電子郵件。

6

您可以使用web.config/app.config文件中的system.net設置進行配置。

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="Network"> 
     <network host="mail.mydomain.com" port="25" /> 
    </smtp> 
    <!-- Use this setting for development 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="C:\Temp" /> 
    </smtp> 
    --> 
    </mailSettings> 
</system.net> 

此外,這裏有一個鏈接的信息migrating from System.Web.Mail to System.Net.Mail

7

以及其他答案的SpecifiedPickupDirectory信息,如果您希望確保您的電子郵件發送到相對於站點根目錄的文件夾 - 在不知道路徑的構建服務器上測試,您可以添加一個快速檢查你的電子郵件發送代碼:

SmtpClient client = new SmtpClient(); 
    ... 

    // Add "~" support for pickupdirectories. 
    if (client.DeliveryMethod == SmtpDeliveryMethod.SpecifiedPickupDirectory && client.PickupDirectoryLocation.StartsWith("~")) 
    { 
     string root = AppDomain.CurrentDomain.BaseDirectory; 
     string pickupRoot = client.PickupDirectoryLocation.Replace("~/", root); 
     pickupRoot = pickupRoot.Replace("/",@"\"); 
     client.PickupDirectoryLocation = pickupRoot; 
    } 

而且你的測試將是這個樣子(請確保您使用的App_Data所以IIS可以寫入該文件夾):

// Arrange - get SitePath from AppDomain.Current.BaseDirectory + ..\ 
    string pickupPath = Path.Combine(SitePath, "App_Data", "TempSmtp"); 
    if (!Directory.Exists(pickupPath)) 
     Directory.CreateDirectory(pickupPath); 

    foreach (string file in Directory.GetFiles(pickupPath, "*.eml")) 
    { 
     File.Delete(file); 
    } 

    // Act (send some emails) 

    // Assert 
    Assert.That(Directory.GetFiles(pickupPath, "*.eml").Count(), Is.EqualTo(1)); 
1

的bug也需要在f的某些版本中添加作爲解決方法ramework。所以完成的版本看起來像:

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> 
     <network host="localhost" /> 
    </smtp> 
    </mailSettings> 
</system.net> 
相關問題