Перенос конфигурации 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 шт):

Автор решения: aepot

Можно создать свой класс с данными конфигурации и например сериализовать в 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.

→ Ссылка