Как сохранить адрес электронной почты вместо отправки при использовании SmtpClient?
Я использую SmtpClient для отправки электронной почты с вложением.
Однако для определенной партии нам нужно как-то сохранить MailMessage вместо отправки.
Затем мы думаем/надеемся вручную загрузить сообщения в папку черновиков пользователей.
Можно ли сохранить эти сообщения с неповрежденным вложением (невозможно, я бы подумал). Или, альтернативно, загружать сообщения в папку в учетной записи пользователя?
Если у кого-то есть опыт, я бы очень признателен за помощь или указатель.
Ответы
Ответ 1
При тестировании в ASP.NET мы сохраняем наши письма в папке, а затем отправляем их через почтовый сервер. Возможно, вы могли бы изменить свои настройки web.config
, как это для вашей партии?
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
</smtp>
</mailSettings>
</system.net>
Дополнительная информация:
Ответ 2
Это может помочь - Добавление функции Save() в Microsoft.Net.Mail.MailMessage
Основная идеология делает расширение MailMessage тем, что отражением создается метод сохранения.
Ответ 3
Как и информация о других ответах 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));
Ответ 4
Вы можете настроить это с помощью параметра 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
.
Ответ 5
Ошибка также требует добавления как обходного пути в некоторых версиях фреймворка. Таким образом, завершенная версия выглядит так:
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\Temp\mail\"/>
<network host="localhost" />
</smtp>
</mailSettings>
</system.net>
Ответ 6
Это сильно зависит от клиента электронной почты и его API автоматизации. SMTP - это протокол отправки и передачи почты. У него нет способности сохранять или даже получать электронную почту.