Перенос конфигурации smtp с .net4.8 на .net6
Всем здравствуйте! Мне поставили задачу перенести небольшое консольное приложение с .net 4.8 на .net 6. По началу все было спокойно, и вдруг я наткнулся на smtp, с которым у меня возникли некоторые трудности с тем самым переносом...
Как было все изначально на .net 4.8
Есть конфигурационный файл в котором описаны smtp-параметры. Его содержимое выглядит следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
</startup>
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="[email protected]">
<network host="smtp.yandex.ru" port="587" enableSsl="true" userName="[email protected]" password="test" defaultCredentials="false"/>
</smtp>
</mailSettings>
</system.net>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Из него читались все smtp-параметры с помощью ConfigurationManager и далее при необходимости отправлялось письмо. Реализовано было следующим образом:
using System.Net.Configuration;
using System.Net.Mail;
using System.Configuration;
SmtpSection smtpSection = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as Section;
MailAddress from = new MailAddress(smtpSection.From, "Admin");
MailAddress to = new MailAddress(smtpSection.From);
MailMessage m = new MailMessage(from, to);
//содержимое письма будет опущено
SmtpNetworkElement smtpNetwork = smtpSection.Network;
SmtpClient smtpClient = new SmtpClient(smtpNetwork.Host, smtpNetwork.Port);
smtpClient.UseDefaultCredentials = smtpNetwork.DefaultCredentials;
smtpClient.Credentials = new NetworkCredential(smtpNetwork.UserName, smtpNetwork.Password);
smtpClient.EnableSsl = smtpNetwork.EnableSsl;
smtpClient.Send(m);
При переносе на .net 6 возникли следующие проблемы
Самое первое что мне попалось на глаза, это то, что теперь не существует пространства имен System.Net.Configuration. И как следствие теперь нет классов SmtpNetworkElement и SmtpSection.
Второе что я заметил первого пробного запуска на .net 6, причем возникла в очень странный момент, когда открывалось подключение к базе данных - ConfigurationErrorsException: Unrecognized configuration section system.net. То есть насколько я понимаю, теперь секцию system.net и все ниже по дереву конфигурации теперь нельзя использовать.
Итоговый вопрос
Как теперь на .net 6 можно читать данные о smtp из конфигурационного файла и использовать в коде? Если это невозможно, то какие есть альтернативы? Кроме хардкода параметров в самом коде)
Ответы (1 шт):
Можно создать свой класс с данными конфигурации и например сериализовать в JSON с отступами, чтобы удобно было редактировать руками.
public class MySettings
{
public string Parameter { get; set; }
}
private readonly JsonSerializerOptions options = new()
{
WriteIndented = true,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping
};
private const string settingsFileName = "settings.json";
MySettings settings = new { Parameter = "Hello World" };
string json = JsonSerializer.Serialize(settings, options);
File.WriteAllText(settingsFileName, json);
string json = FileReadAllText(settingsFileName);
var settings = JsonSerializer.Deserialize<MySettings>(json);
А для почты дотнетовский клиент не использует уже давно никто. Об этом даже в документации SmtpClient написано.
Чтобы использовать пространство имён System.Net.Configuration, нужно установить NuGet пакет System.Configuration.ConfigurationManager от Microsoft.