SmtpClient Класс

Определение

Позволяет приложениям отправлять электронную почту с помощью протокола SMTP (Simple Mail Transfer Protocol).Allows applications to send email by using the Simple Mail Transfer Protocol (SMTP). Тип SmtpClient устарел.The SmtpClient type is now obsolete.

public ref class SmtpClient : IDisposable
public class SmtpClient : IDisposable
type SmtpClient = class
    interface IDisposable
Public Class SmtpClient
Implements IDisposable
Наследование
SmtpClient
Реализации

Примеры

В следующем примере кода показано асинхронная отправка сообщения электронной почты.The following code example demonstrates sending an email message asynchronously.

#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::Net::Mail;
using namespace System::Net::Mime;
using namespace System::Threading;
using namespace System::ComponentModel;

static bool mailSent;

static void SendCompletedCallback(Object^ sender, AsyncCompletedEventArgs^ e)
{
    // Get the unique identifier for this asynchronous 
    // operation.
    String^ token = (String^) e->UserState;

    if (e->Cancelled)
    {
        Console::WriteLine("[{0}] Send canceled.", token);
    }
    if (e->Error != nullptr)
    {
        Console::WriteLine("[{0}] {1}", token, 
            e->Error->ToString());
    } else
    {
        Console::WriteLine("Message sent.");
    }
    mailSent = true;
}

int main(array<String^>^ args)
{
    if (args->Length > 1)
    {
        // Command-line argument must be the SMTP host.
        SmtpClient^ client = gcnew SmtpClient(args[1]);
        // Specify the email sender.
        // Create a mailing address that includes a UTF8 
        // character in the display name.
        MailAddress^ from = gcnew MailAddress("jane@contoso.com",
            "Jane " + (wchar_t)0xD8 + " Clayton",
            System::Text::Encoding::UTF8);
        // Set destinations for the email message.
        MailAddress^ to = gcnew MailAddress("ben@contoso.com");
        // Specify the message content.
        MailMessage^ message = gcnew MailMessage(from, to);
        message->Body = "This is a test email message sent" +
            " by an application. ";
        // Include some non-ASCII characters in body and 
        // subject.
        String^ someArrows = gcnew String(gcnew array<wchar_t>{L'\u2190', 
            L'\u2191', L'\u2192', L'\u2193'});
        message->Body += Environment::NewLine + someArrows;
        message->BodyEncoding = System::Text::Encoding::UTF8;
        message->Subject = "test message 1" + someArrows;
        message->SubjectEncoding = System::Text::Encoding::UTF8;
        // Set the method that is called back when the send
        // operation ends.
        client->SendCompleted += gcnew
            SendCompletedEventHandler(SendCompletedCallback);
        // The userState can be any object that allows your 
        // callback method to identify this send operation.
        // For this example, the userToken is a string constant.
        String^ userState = "test message1";
        client->SendAsync(message, userState);
        Console::WriteLine("Sending message... press c to" +
            " cancel mail. Press any other key to exit.");
        String^ answer = Console::ReadLine();
        // If the user canceled the send, and mail hasn't been 
        // sent yet,then cancel the pending operation.
        if (answer->ToLower()->StartsWith("c") && mailSent == false)
        {
            client->SendAsyncCancel();
        }
        // Clean up.
        delete message;
        client = nullptr;
        Console::WriteLine("Goodbye.");
    }
    else
    {
        Console::WriteLine("Please give SMTP server name!");
    }
}

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Threading;
using System.ComponentModel;
namespace Examples.SmtpExamples.Async
{
    public class SimpleAsynchronousExample
    {
        static bool mailSent = false;
        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            // Get the unique identifier for this asynchronous operation.
             String token = (string) e.UserState;
           
            if (e.Cancelled)
            {
                 Console.WriteLine("[{0}] Send canceled.", token);
            }
            if (e.Error != null)
            {
                 Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
            } else
            {
                Console.WriteLine("Message sent.");
            }
            mailSent = true;
        }
        public static void Main(string[] args)
        {
            // Command-line argument must be the SMTP host.
            SmtpClient client = new SmtpClient(args[0]);
            // Specify the email sender.
            // Create a mailing address that includes a UTF8 character
            // in the display name.
            MailAddress from = new MailAddress("jane@contoso.com", 
               "Jane " + (char)0xD8+ " Clayton", 
            System.Text.Encoding.UTF8);
            // Set destinations for the email message.
            MailAddress to = new MailAddress("ben@contoso.com");
            // Specify the message content.
            MailMessage message = new MailMessage(from, to);
            message.Body = "This is a test email message sent by an application. ";
            // Include some non-ASCII characters in body and subject.
            string someArrows = new string(new char[] {'\u2190', '\u2191', '\u2192', '\u2193'});
            message.Body += Environment.NewLine + someArrows;
            message.BodyEncoding =  System.Text.Encoding.UTF8;
            message.Subject = "test message 1" + someArrows;
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            // Set the method that is called back when the send operation ends.
            client.SendCompleted += new 
            SendCompletedEventHandler(SendCompletedCallback);
            // The userState can be any object that allows your callback 
            // method to identify this send operation.
            // For this example, the userToken is a string constant.
            string userState = "test message1";
            client.SendAsync(message, userState);
            Console.WriteLine("Sending message... press c to cancel mail. Press any other key to exit.");
            string answer = Console.ReadLine();
            // If the user canceled the send, and mail hasn't been sent yet,
            // then cancel the pending operation.
            if (answer.StartsWith("c") && mailSent == false)
            {
                client.SendAsyncCancel();
            }
            // Clean up.
            message.Dispose();
            Console.WriteLine("Goodbye.");
        }
    }
}

Imports System.Net
Imports System.Net.Mail
Imports System.Net.Mime
Imports System.Threading
Imports System.ComponentModel

Namespace Examples.SmtpExamples.Async
    Public Class SimpleAsynchronousExample
        Private Shared mailSent As Boolean = False
        Private Shared Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
            ' Get the unique identifier for this asynchronous operation.
            Dim token As String = CStr(e.UserState)

            If e.Cancelled Then
                Console.WriteLine("[{0}] Send canceled.", token)
            End If
            If e.Error IsNot Nothing Then
                Console.WriteLine("[{0}] {1}", token, e.Error.ToString())
            Else
                Console.WriteLine("Message sent.")
            End If
            mailSent = True
        End Sub
        Public Shared Sub Main(ByVal args() As String)
            ' Command line argument must the SMTP host.
            Dim client As New SmtpClient(args(0))
            ' Specify the email sender.
            ' Create a mailing address that includes a UTF8 character
            ' in the display name.
            Dim mailFrom As New MailAddress("jane@contoso.com", "Jane " & ChrW(&HD8) & " Clayton", System.Text.Encoding.UTF8)
            ' Set destinations for the email message.
            Dim mailTo As New MailAddress("ben@contoso.com")
            ' Specify the message content.
            Dim message As New MailMessage(mailFrom, mailTo)
            message.Body = "This is a test email message sent by an application. "
            ' Include some non-ASCII characters in body and subject.
            Dim someArrows As New String(New Char() {ChrW(&H2190), ChrW(&H2191), ChrW(&H2192), ChrW(&H2193)})
            message.Body += Environment.NewLine & someArrows
            message.BodyEncoding = System.Text.Encoding.UTF8
            message.Subject = "test message 1" & someArrows
            message.SubjectEncoding = System.Text.Encoding.UTF8
            ' Set the method that is called back when the send operation ends.
            AddHandler client.SendCompleted, AddressOf SendCompletedCallback
            ' The userState can be any object that allows your callback 
            ' method to identify this send operation.
            ' For this example, the userToken is a string constant.
            Dim userState As String = "test message1"
            client.SendAsync(message, userState)
            Console.WriteLine("Sending message... press c to cancel mail. Press any other key to exit.")
            Dim answer As String = Console.ReadLine()
            ' If the user canceled the send, and mail hasn't been sent yet,
            ' then cancel the pending operation.
            If answer.StartsWith("c") AndAlso mailSent = False Then
                client.SendAsyncCancel()
            End If
            ' Clean up.
            message.Dispose()
            Console.WriteLine("Goodbye.")
        End Sub
    End Class
End Namespace

Комментарии

Класс SmtpClient используется для отправки электронной почты на SMTP-сервер для доставки.The SmtpClient class is used to send email to an SMTP server for delivery. Протокол SMTP определен в RFC 2821, который доступен по адресу https://www.ietf.org.The SMTP protocol is defined in RFC 2821, which is available at https://www.ietf.org.

Важно!

Не рекомендуется использовать класс SmtpClient для новой разработки, поскольку SmtpClient не поддерживает многие современные протоколы.We don't recommend that you use the SmtpClient class for new development because SmtpClient doesn't support many modern protocols. Вместо этого используйте маилкит или другие библиотеки.Use MailKit or other libraries instead. Дополнительные сведения см. в разделе SmtpClient не следует использовать в GitHub.For more information, see SmtpClient shouldn't be used on GitHub.

Класс SmtpClient устарел в Xamarin.The SmtpClient class is obsolete in Xamarin. Но:However:

  • Он включен в .NET Standard 2,0 и более поздних версий и поэтому должен быть частью любой реализации .NET, поддерживающей эти версии.It is included in the .NET Standard 2.0 and later versions and therefore must be part of any .NET implementation that supports those versions.
  • Он имеется и может использоваться в .NET Framework 4 до .NET Framework 4,8.It is present and can be used in .NET Framework 4 through .NET Framework 4.8.
  • Он может использоваться в .NET Core, но его использование не рекомендуется.It is usable in .NET Core, but its use isn't recommended.

Классы, приведенные в следующей таблице, используются для создания сообщений электронной почты, которые можно отправить с помощью SmtpClient.The classes shown in the following table are used to construct email messages that can be sent using SmtpClient.

КлассClass ОписаниеDescription
Attachment Представляет вложенные файлы.Represents file attachments. Этот класс позволяет прикреплять файлы, потоки или текст к сообщению электронной почты.This class allows you to attach files, streams, or text to an email message.
MailAddress Представляет адрес электронной почты отправителя и получателей.Represents the email address of the sender and recipients.
MailMessage Представляет сообщение электронной почты.Represents an email message.

Чтобы создать и отправить сообщение электронной почты с помощью SmtpClient, необходимо указать следующие сведения.To construct and send an email message by using SmtpClient, you must specify the following information:

  • Сервер узла SMTP, который используется для отправки электронной почты.The SMTP host server that you use to send email. См. свойства Host и Port.See the Host and Port properties.

  • Учетные данные для проверки подлинности, если это требуется для SMTP-сервера.Credentials for authentication, if required by the SMTP server. См. свойство Credentials.See the Credentials property.

  • Адрес электронной почты отправителя.The email address of the sender. См. методы Send и SendAsync, которые принимают параметр from.See the Send and SendAsync methods that take a from parameter. См. также свойство MailMessage.From.Also see the MailMessage.From property.

  • Адрес электронной почты или адреса получателей.The email address or addresses of the recipients. См. методы Send и SendAsync, которые принимают параметр recipient.See the Send and SendAsync methods that take a recipient parameter. См. также свойство MailMessage.To.Also see the MailMessage.To property.

  • Содержимое сообщения.The message content. См. методы Send и SendAsync, которые принимают параметр body.See the Send and SendAsync methods that take a body parameter. См. также свойство MailMessage.Body.Also see the MailMessage.Body property.

Чтобы включить вложение с сообщением электронной почты, сначала создайте вложение с помощью класса Attachment, а затем добавьте его в сообщение с помощью свойства MailMessage.Attachments.To include an attachment with an email message, first create the attachment by using the Attachment class, and then add it to the message by using the MailMessage.Attachments property. В зависимости от модуля чтения электронной почты, используемого получателями, и типа файла вложения, некоторые получатели, возможно, не смогут прочитать вложение.Depending on the email reader used by the recipients and the file type of the attachment, some recipients might not be able to read the attachment. Для клиентов, которые не могут отобразить вложение в исходной форме, можно указать альтернативные представления с помощью свойства MailMessage.AlternateViews.For clients that cannot display the attachment in its original form, you can specify alternate views by using the MailMessage.AlternateViews property.

В .NET Framework можно использовать файлы конфигурации приложения или компьютера для указания значений узла, порта и учетных данных по умолчанию для всех объектов SmtpClient.In .NET Framework, you can use the application or machine configuration files to specify default host, port, and credentials values for all SmtpClient objects. Дополнительные сведения см. в разделе <маилсеттингс> Element (параметры сети).For more information, see <mailSettings> Element (Network Settings). .NET Core не поддерживает настройку значений по умолчанию..NET Core does not support setting defaults. В качестве обходного решения необходимо задать соответствующие свойства для SmtpClient напрямую.As a workaround, you must set the relevant properties on SmtpClient directly.

Чтобы отправить сообщение электронной почты и заблокировать его при ожидании передачи сообщения на SMTP-сервер, используйте один из синхронных Send методов.To send the email message and block while waiting for the email to be transmitted to the SMTP server, use one of the synchronous Send methods. Чтобы позволить основному потоку программы продолжать выполнение во время передачи сообщения, используйте один из асинхронных SendAsync методов.To allow your program's main thread to continue executing while the email is transmitted, use one of the asynchronous SendAsync methods. Событие SendCompleted возникает при завершении операции SendAsync.The SendCompleted event is raised when a SendAsync operation completes. Чтобы получить это событие, необходимо добавить делегат SendCompletedEventHandler в SendCompleted.To receive this event, you must add a SendCompletedEventHandler delegate to SendCompleted. Делегат SendCompletedEventHandler должен ссылаться на метод обратного вызова, который обрабатывает уведомления о событиях SendCompleted.The SendCompletedEventHandler delegate must reference a callback method that handles notification of SendCompleted events. Чтобы отменить асинхронную передачу электронной почты, используйте метод SendAsyncCancel.To cancel an asynchronous email transmission, use the SendAsyncCancel method.

Примечание

Если выполняется передача электронной почты и вы вызываете SendAsync или Send снова, вы получите InvalidOperationException.If there is an email transmission in progress and you call SendAsync or Send again, you will receive an InvalidOperationException.

Подключение, установленное текущим экземпляром SmtpClientного класса к SMTP-серверу, может быть использовано повторно, если приложение хочет отправить несколько сообщений на один и тот же SMTP-сервер.The connection established by the current instance of the SmtpClient class to the SMTP server may be re-used if an application wishes to send multiple messages to the same SMTP server. Это особенно удобно при использовании проверки подлинности или шифрования для установки подключения к SMTP-серверу.This is particularly useful when authentication or encryption are used establish a connection to the SMTP server. Процесс проверки подлинности и установки сеанса TLS может быть дорогостоящей операцией.The process of authenticating and establishing a TLS session can be expensive operations. Требование повторного подключения для каждого сообщения при отправке большого количества электронной почты на один и тот же SMTP-сервер может оказать значительное влияние на производительность.A requirement to re-establish a connection for each message when sending a large quantity of email to the same SMTP server could have a significant impact on performance. Существует несколько приложений электронной почты с большими объемами, которые отправляют по электронной почте обновления состояния, рассылки бюллетеней или оповещения по электронной почте.There are a number of high-volume email applications that send email status updates, newsletter distributions, or email alerts. Кроме того, многие клиентские приложения электронной почты поддерживают автономный режим, при котором пользователи могут создавать множество сообщений электронной почты, отправляемых позже, когда устанавливается подключение к SMTP-серверу.Also many email client applications support an off-line mode where users can compose many email messages that are sent later when a connection to the SMTP server is established. Обычно почтовый клиент отправляет все сообщения SMTP на конкретный SMTP-сервер (предоставленный поставщиком услуг Интернета), который затем перенаправляет это сообщение на другие SMTP-серверы.It is typical for an email client to send all SMTP messages to a specific SMTP server (provided by the Internet service provider) that then forwards this email to other SMTP servers.

Реализация класса SmtpClient группирует SMTP-подключения, чтобы избежать издержек на повторное подключение для каждого сообщения на один и тот же сервер.The SmtpClient class implementation pools SMTP connections so that it can avoid the overhead of re-establishing a connection for every message to the same server. Приложение может повторно использовать один и тот же объект SmtpClient для отправки множества различных сообщений электронной почты на один и тот же SMTP-сервер и на множество разных SMTP-серверов.An application may re-use the same SmtpClient object to send many different emails to the same SMTP server and to many different SMTP servers. В результате не существует способа определения завершения работы приложения с помощью объекта SmtpClient и его очистки.As a result, there is no way to determine when an application is finished using the SmtpClient object and it should be cleaned up.

Когда сеанс SMTP завершается и клиент хочет завершить подключение, он должен отправить серверу сообщение о выходе, чтобы указать, что в нем нет сообщений для отправки.When an SMTP session is finished and the client wishes to terminate the connection, it must send a QUIT message to the server to indicate that it has no more messages to send. Это позволяет серверу освобождать ресурсы, связанные с подключением от клиента, и обрабатывать сообщения, отправленные клиентом.This allows the server to free up resources associated with the connection from the client and process the messages which were sent by the client.

Класс SmtpClient не имеет Finalize метода, поэтому приложение должно вызвать Dispose, чтобы явно освободить ресурсы.The SmtpClient class has no Finalize method, so an application must call Dispose to explicitly free up resources. Метод Dispose проходит по всем установленным подключениям к SMTP-серверу, указанному в свойстве Host, и отправляет сообщение о выходе, а затем корректно завершает TCP-подключение.The Dispose method iterates through all established connections to the SMTP server specified in the Host property and sends a QUIT message followed by gracefully ending the TCP connection. Метод Dispose также освобождает неуправляемые ресурсы, используемые Socket и при необходимости уничтожает управляемые ресурсы.The Dispose method also releases the unmanaged resources used by the Socket and optionally disposes of the managed resources.

Вызовите метод Dispose по окончании использования класса SmtpClient.Call Dispose when you are finished using the SmtpClient. Метод Dispose оставляет класс SmtpClient в непригодном для использования состоянии.The Dispose method leaves the SmtpClient in an unusable state. После вызова метода Dispose необходимо освободить все ссылки на объект SmtpClient, чтобы сборщик мусора мог освободить память, занимаемую объектом SmtpClient.After calling Dispose, you must release all references to the SmtpClient so the garbage collector can reclaim the memory that the SmtpClient was occupying.

Конструкторы

SmtpClient()

Инициализирует новый экземпляр класса SmtpClient, используя параметры файла конфигурации.Initializes a new instance of the SmtpClient class by using configuration file settings.

SmtpClient(String)

Инициализирует новый экземпляр класса SmtpClient, который отправляет электронную почту с помощью указанного сервера SMTP.Initializes a new instance of the SmtpClient class that sends email by using the specified SMTP server.

SmtpClient(String, Int32)

Инициализирует новый экземпляр класса SmtpClient, который отправляет электронную почту с помощью указанного сервера SMTP и порта.Initializes a new instance of the SmtpClient class that sends email by using the specified SMTP server and port.

Свойства

ClientCertificates

Указывает, какие сертификаты следует использовать для установки SSL-подключения.Specify which certificates should be used to establish the Secure Sockets Layer (SSL) connection.

Credentials

Возвращает или задает учетные данные, используемые для проверки подлинности отправителя.Gets or sets the credentials used to authenticate the sender.

DeliveryFormat

Получает или задает формат доставки, используемый SmtpClient для отправки электронной почты.Gets or sets the delivery format used by SmtpClient to send email.

DeliveryMethod

Указывает, как будут обрабатываться исходящие сообщения электронной почты.Specifies how outgoing email messages will be handled.

EnableSsl

Указывает, использует ли SmtpClient протокол SSL для шифрования подключения.Specify whether the SmtpClient uses Secure Sockets Layer (SSL) to encrypt the connection.

Host

Возвращает или задает имя или IP-адрес хоста, используемого для SMTP-транзакций.Gets or sets the name or IP address of the host used for SMTP transactions.

PickupDirectoryLocation

Возвращает или задает папку, в которой приложения сохраняют почтовые сообщения для обработки локальным SMTP-сервером.Gets or sets the folder where applications save mail messages to be processed by the local SMTP server.

Port

Возвращает или задает порт, используемый для SMTP-транзакций.Gets or sets the port used for SMTP transactions.

ServicePoint

Возвращает сетевое подключение, используемое для передачи сообщения электронной почты.Gets the network connection used to transmit the email message.

TargetName

Получает или задает имя поставщика услуг (SPN) для проверки подлинности при использовании расширенной защиты.Gets or sets the Service Provider Name (SPN) to use for authentication when using extended protection.

Timeout

Возвращает или задает значение, указывающее промежуток времени, после которого для синхронного вызова Send истечет время тайм-аута.Gets or sets a value that specifies the amount of time after which a synchronous Send call times out.

UseDefaultCredentials

Возвращает или задает значение Boolean, которое управляет отправкой учетных данных DefaultCredentials вместе с запросами.Gets or sets a Boolean value that controls whether the DefaultCredentials are sent with requests.

Методы

Dispose()

Отправляет сообщение QUIT на SMTP-сервер, правильно завершает TCP-подключение и освобождает все ресурсы, используемые текущим экземпляром класса SmtpClient.Sends a QUIT message to the SMTP server, gracefully ends the TCP connection, and releases all resources used by the current instance of the SmtpClient class.

Dispose(Boolean)

Отправляет сообщение QUIT на SMTP-сервер, правильно завершает TCP-подключение и освобождает все ресурсы, используемые текущим экземпляром класса SmtpClient, и при необходимости освобождает управляемые ресурсы.Sends a QUIT message to the SMTP server, gracefully ends the TCP connection, releases all resources used by the current instance of the SmtpClient class, and optionally disposes of the managed resources.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
GetHashCode()

Служит в качестве хэш-функции по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
OnSendCompleted(AsyncCompletedEventArgs)

Создает событие SendCompleted.Raises the SendCompleted event.

Send(MailMessage)

Отправляет указанное сообщение на сервер SMTP для доставки.Sends the specified message to an SMTP server for delivery.

Send(String, String, String, String)

Отправляет указанное сообщение электронной почты на сервер SMTP для доставки.Sends the specified email message to an SMTP server for delivery. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.The message sender, recipients, subject, and message body are specified using String objects.

SendAsync(MailMessage, Object)

Отправляет указанное сообщение электронной почты на сервер SMTP для доставки.Sends the specified email message to an SMTP server for delivery. Этот метод не блокирует вызывающий поток и позволяет вызывающей стороне передать объект в метод, вызванный после завершения операции.This method does not block the calling thread and allows the caller to pass an object to the method that is invoked when the operation completes.

SendAsync(String, String, String, String, Object)

Отправляет сообщение электронной почты на сервер SMTP для доставки.Sends an email message to an SMTP server for delivery. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.The message sender, recipients, subject, and message body are specified using String objects. Этот метод не блокирует вызывающий поток и позволяет вызывающей стороне передать объект в метод, вызванный после завершения операции.This method does not block the calling thread and allows the caller to pass an object to the method that is invoked when the operation completes.

SendAsyncCancel()

Отменяет асинхронную операцию отправки сообщения электронной почты.Cancels an asynchronous operation to send an email message.

SendMailAsync(MailMessage)

Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции.Sends the specified message to an SMTP server for delivery as an asynchronous operation.

SendMailAsync(String, String, String, String)

Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции.Sends the specified message to an SMTP server for delivery as an asynchronous operation. .. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.The message sender, recipients, subject, and message body are specified using String objects.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

События

SendCompleted

Происходит после завершения асинхронной операции по отправке электронной почты.Occurs when an asynchronous email send operation completes.

Применяется к

Дополнительно