2009-02-19 9 views
37

Я использую SmtpClient для отправки электронной почты с приложением. Однако для определенной партии нам нужно как-то сохранить MailMessage вместо отправки. Мы тогда думаем/надеемся вручную загрузить сообщения в папку черновиков пользователей.Как сохранить сообщение вместо отправки при использовании SmtpClient?

Возможно ли сохранить эти сообщения с прикрепленным в неприкосновенности (невозможно, я бы подумал). Или, альтернативно, загружать сообщения в папку в учетной записи пользователя?

Если у кого-то есть опыт, я бы очень признателен за помощь или указатель.

+0

«вместо отправки». – Avram

ответ

57

При тестировании в ASP.NET мы сохраняем наши письма в папке, а затем отправляем их через почтовый сервер. Возможно, вы могли бы изменить свои настройки web.config, как это для вашей партии?

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

Дополнительная информация:

+0

Спасибо, что обработал. Кроме того, Avram (см. Ниже) опубликовал полезную ссылку, в которой обсуждается изменение имени сообщения электронной почты из автоматически созданного GUID на ваше собственное значение. – user17510

+0

Я пробовал этот метод, и я получаю сообщение об ошибке, что адрес «От» не указан. Есть ли способ указать это для SpecifiedPickupDirectory в web.config? Когда вы делаете сетевые настройки, есть – codeMonkey

-6

Это сильно зависит от клиента электронной почты и его API автоматизации. SMTP - это протокол отправки и передачи почты. У него нет способности сохранять или даже получать электронную почту.

6

Вы можете настроить это с помощью параметра system.net в файле 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> 

Кроме того, вот связь с информацией о 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)); 
+0

Спасибо, помощник. Это то, что я искал! –

1

баг также требует добавления в качестве обходного пути в некоторых версиях f ramework. Таким образом, завершенная версия выглядит так:

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