2009-02-19 11 views
37

Używam SmtpClient do wysyłania wiadomości e-mail z załącznikiem. Jednak dla pewnej partii musimy jakoś zapisać MailMessage zamiast wysyłać je. Myślimy/mamy nadzieję na ręczne przesłanie wiadomości do folderu wersji roboczych użytkowników.Jak zapisać wiadomość e-mail zamiast wysyłać przy użyciu SmtpClient?

Czy można zapisać te wiadomości z załączonym nietknięciem (niemożliwe, pomyślałem). Lub alternatywnie przesłać wiadomości do folderu na koncie użytkownika?

Jeśli ktoś ma jakiekolwiek doświadczenie w tym zakresie, będę wdzięczny za pomoc lub wskazówkę.

+0

"zamiast wysyłać." – Avram

Odpowiedz

57

Podczas testowania w środowisku ASP.NET zapisujemy nasze wiadomości e-mail w folderze, a następnie wysyłamy je za pośrednictwem serwera poczty e-mail. Może mógłbyś zmienić swoje ustawienia web.config dla swojej partii?

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

Informacje dodatkowe:

+0

Dzięki za przyjemność. Również Avram (patrz poniżej) zamieścił przydatne łącze omawiające zmianę nazwy wiadomości e-mail z automatycznie wygenerowanego identyfikatora GUID na własną wartość. – user17510

+0

Próbowałem tej metody i pojawia się błąd, że nie określono adresu "Od". Czy istnieje sposób określenia tego dla SpecifiedPickupDirectory w web.config? Po wprowadzeniu ustawień sieciowych jest – codeMonkey

-6

Jest to wysoce zależne od klienta poczty e-mail i jego automatyzacji API. SMTP jest protokołem wysyłania i przesyłania poczty. Nie ma możliwości zapisywania, a nawet pobierania wiadomości e-mail.

6

Można to skonfigurować za pomocą ustawienia system.net w pliku web.config/app.config.

<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> 

Również tutaj znajduje się link z informacją na temat migrating from System.Web.Mail to System.Net.Mail.

7

Oprócz innych informacji, jeśli chcesz zapewnić, że twoje e-maile są wysyłane do folderu względem katalogu głównego strony - przydatne przy testowaniu na serwerach kompilacji, gdzie nie znasz ścieżek - możesz dodaj szybkie sprawdzenie w mailu kodu wysyłającej:

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; 
    } 

a twoje badania będą wyglądać mniej więcej tak (upewnij się, że używasz App_Data tak IIS może napisać do folderu):

// 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)); 
+0

Dzięki kolego. Tego właśnie szukałem! –

1

bug także wymaga dodania jako obejścia w niektórych wersjach f ramework. Tak więc ukończona wersja wygląda następująco:

<system.net> 
    <mailSettings> 
    <smtp deliveryMethod="SpecifiedPickupDirectory"> 
     <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/> 
     <network host="localhost" /> 
    </smtp> 
    </mailSettings> 
</system.net> 
Powiązane problemy