Как сохранить электронную почту вместо отправки при использовании SmtpClient? - PullRequest
44 голосов
/ 20 февраля 2009

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

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

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

Ответы [ 5 ]

71 голосов
/ 20 февраля 2009

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

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

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

11 голосов
/ 08 декабря 2012

Помимо информации 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));
7 голосов
/ 20 февраля 2009

Это может помочь - Добавление функции Save () к Microsoft.Net.Mail.MailMessage
Основная идея, сделать расширение для MailMessage, что путем отражения делает метод сохранения.

6 голосов
/ 20 февраля 2009

Это можно настроить с помощью параметра 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>

Кроме того, вот ссылка с информацией о , переходящем с System.Web.Mail на System.Net.Mail.

1 голос
/ 13 сентября 2014

Ошибка также требует добавления в качестве обходного пути в некоторых версиях фреймворка. Итак, законченная версия выглядит так:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
        <network host="localhost" />
    </smtp>
  </mailSettings>
</system.net>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...