Поделиться через


SmtpClient Класс

Определение

Позволяет приложениям отправлять электронную почту с помощью протокола SMTP (Simple Mail Transfer Protocol). Тип SmtpClient устарел на некоторых платформах и не рекомендуется для других. Дополнительные сведения см. в разделе Примечания.

public ref class SmtpClient : IDisposable
public ref class SmtpClient
public class SmtpClient : IDisposable
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public class SmtpClient : IDisposable
public class SmtpClient
type SmtpClient = class
    interface IDisposable
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
type SmtpClient = class
    interface IDisposable
type SmtpClient = class
Public Class SmtpClient
Implements IDisposable
Public Class SmtpClient
Наследование
SmtpClient
Атрибуты
Реализации

Примеры

В следующем примере кода показана асинхронная отправка сообщения электронной почты.

#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-сервер для доставки. Протокол SMTP определен в RFC 2821, который доступен по адресу https://www.ietf.org.

Важно!

Мы не рекомендуем использовать класс для новой разработки SmtpClient , так как SmtpClient он не поддерживает многие современные протоколы. Вместо этого используйте MailKit или другие библиотеки. Дополнительные сведения см. в статье SmtpClient не следует использовать в GitHub.

Класс SmtpClient устарел в Xamarin. Но:

  • Он входит в состав .NET Standard 2.0 и более поздних версий и поэтому должен быть частью любой реализации .NET, поддерживающей эти версии.
  • Он присутствует и может использоваться в платформа .NET Framework 4 по платформа .NET Framework 4.8.
  • Его можно использовать в .NET Core, но использовать его не рекомендуется.

Классы, показанные в следующей таблице, используются для создания сообщений электронной почты, которые можно отправлять с помощью SmtpClient.

Класс Описание
Attachment Представляет вложения файлов. Этот класс позволяет вложить файлы, потоки или текст в сообщение электронной почты.
MailAddress Представляет адрес электронной почты отправителя и получателей.
MailMessage Представляет сообщение электронной почты.

Чтобы создать и отправить сообщение электронной почты с помощью SmtpClient, необходимо указать следующие сведения:

  • Сервер узла SMTP, используемый для отправки электронной почты. См. Host свойства и Port .

  • Учетные данные для проверки подлинности, если это необходимо для SMTP-сервера. См. описание свойства Credentials.

  • Адрес электронной почты отправителя. Send См. методы и SendAsync , которые принимают from параметр . См. MailMessage.From также свойство .

  • Адрес электронной почты или адреса получателей. Send См. методы и SendAsync , которые принимают recipient параметр . См. MailMessage.To также свойство .

  • содержимое сообщения; Send См. методы и SendAsync , которые принимают body параметр . См. MailMessage.Body также свойство .

Чтобы включить вложение в сообщение электронной почты, сначала создайте вложение с помощью Attachment класса , а затем добавьте его в сообщение с помощью MailMessage.Attachments свойства . В зависимости от средства чтения электронной почты, используемого получателями, и типа файла вложения некоторые получатели могут не прочитать вложение. Для клиентов, которые не могут отображать вложение в исходном виде, можно указать альтернативные MailMessage.AlternateViews представления с помощью свойства .

В платформа .NET Framework можно использовать файлы конфигурации приложения или компьютера, чтобы указать значения узла, порта и учетных данных по умолчанию для всех SmtpClient объектов. Дополнительные сведения см. в разделе <Элемент mailSettings> (параметры сети). .NET Core не поддерживает параметры по умолчанию. В качестве обходного решения необходимо напрямую задать соответствующие свойства SmtpClient .

Чтобы отправить сообщение электронной почты и заблокировать его во время ожидания передачи сообщения на SMTP-сервер, используйте один из синхронных Send методов. Чтобы поток main программы продолжал выполняться во время передачи сообщения электронной почты, используйте один из асинхронных SendAsync методов. Событие SendCompleted возникает после SendAsync завершения операции. Чтобы получить это событие, необходимо добавить делегат в SendCompletedEventHandlerSendCompleted. Делегат SendCompletedEventHandler должен ссылаться на метод обратного вызова, который обрабатывает уведомления о событиях SendCompleted . Чтобы отменить асинхронную передачу SendAsyncCancel электронной почты, используйте метод .

Примечание

Если выполняется передача электронной почты и вы позвоните SendAsync или Send снова, вы получите сообщение InvalidOperationException.

Соединение, установленное текущим экземпляром SmtpClient класса с SMTP-сервером, может быть использовано повторно, если приложение хочет отправить несколько сообщений на один SMTP-сервер. Это особенно полезно, если используется проверка подлинности или шифрование, чтобы установить соединение с SMTP-сервером. Процесс проверки подлинности и установки сеанса TLS может быть дорогостоящим процессом. Требование повторно установить подключение для каждого сообщения при отправке большого количества сообщений электронной почты на тот же SMTP-сервер может оказать значительное влияние на производительность. Существует множество почтовых приложений, которые отправляют обновления о состоянии электронной почты, рассылки информационных бюллетеней или оповещения по электронной почте. Кроме того, многие клиентские приложения электронной почты поддерживают режим off-line, в котором пользователи могут создавать множество сообщений электронной почты, которые отправляются позже при установке подключения к SMTP-серверу. Как правило, почтовый клиент отправляет все сообщения SMTP на определенный SMTP-сервер (предоставляемый поставщиком услуг Интернета), который затем пересылает это сообщение на другие SMTP-серверы.

Реализация SmtpClient класса пула SMTP-подключений позволяет избежать затрат на повторное подключение для каждого сообщения к одному и тому же серверу. Приложение может повторно использовать один и тот же SmtpClient объект для отправки множества различных сообщений электронной почты на один и тот же SMTP-сервер и на несколько разных SMTP-серверов. В результате невозможно определить, когда приложение будет завершено с помощью SmtpClient объекта , и его необходимо очистить.

Когда сеанс SMTP завершен и клиент хочет завершить подключение, он должен отправить на сервер сообщение QUIT, чтобы указать, что у него больше нет сообщений для отправки. Это позволяет серверу освобождать ресурсы, связанные с подключением, от клиента и обрабатывать сообщения, отправленные клиентом.

Класс SmtpClient не Finalize имеет метода, поэтому приложение должно вызывать Dispose для явного освобождения ресурсов. Метод Dispose выполняет итерацию всех установленных подключений к SMTP-серверу, указанному Host в свойстве , и отправляет сообщение QUIT, за которым следует корректное завершение TCP-подключения. Метод Dispose также освобождает неуправляемые ресурсы, используемые , Socket и при необходимости удаляет управляемые ресурсы.

Вызовите метод Dispose по окончании использования класса SmtpClient. Метод Dispose оставляет класс SmtpClient в непригодном для использования состоянии. После вызова метода Dispose необходимо освободить все ссылки на объект SmtpClient, чтобы сборщик мусора мог освободить память, занимаемую объектом SmtpClient.

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

SmtpClient()

Инициализирует новый экземпляр класса SmtpClient, используя параметры файла конфигурации.

SmtpClient(String)

Инициализирует новый экземпляр класса SmtpClient, который отправляет электронную почту с помощью указанного сервера SMTP.

SmtpClient(String, Int32)

Инициализирует новый экземпляр класса SmtpClient, который отправляет электронную почту с помощью указанного сервера SMTP и порта.

Свойства

ClientCertificates

Указывает, какие сертификаты следует использовать для установки SSL-подключения.

Credentials

Возвращает или задает учетные данные, используемые для проверки подлинности отправителя.

DeliveryFormat

Получает или задает формат доставки, используемый SmtpClient для отправки электронной почты.

DeliveryMethod

Указывает, как будут обрабатываться исходящие сообщения электронной почты.

EnableSsl

Указывает, использует ли SmtpClient протокол SSL для шифрования подключения.

Host

Возвращает или задает имя или IP-адрес хоста, используемого для SMTP-транзакций.

PickupDirectoryLocation

Возвращает или задает папку, в которой приложения сохраняют почтовые сообщения для обработки локальным SMTP-сервером.

Port

Возвращает или задает порт, используемый для SMTP-транзакций.

ServicePoint

Возвращает сетевое подключение, используемое для передачи сообщения электронной почты.

TargetName

Получает или задает имя поставщика услуг (SPN) для проверки подлинности при использовании расширенной защиты.

Timeout

Возвращает или задает значение, указывающее промежуток времени, после которого для синхронного вызова Send истечет время тайм-аута.

UseDefaultCredentials

Возвращает или задает значение Boolean, которое управляет отправкой учетных данных DefaultCredentials вместе с запросами.

Методы

Dispose()

Отправляет сообщение QUIT на SMTP-сервер, правильно завершает TCP-подключение и освобождает все ресурсы, используемые текущим экземпляром класса SmtpClient.

Dispose(Boolean)

Отправляет сообщение QUIT на SMTP-сервер, правильно завершает TCP-подключение и освобождает все ресурсы, используемые текущим экземпляром класса SmtpClient, и при необходимости освобождает управляемые ресурсы.

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

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

Служит хэш-функцией по умолчанию.

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

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

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

Создает неполную копию текущего объекта Object.

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

Вызывает событие SendCompleted.

Send(MailMessage)

Отправляет указанное сообщение на сервер SMTP для доставки.

Send(String, String, String, String)

Отправляет указанное сообщение электронной почты на сервер SMTP для доставки. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.

SendAsync(MailMessage, Object)

Отправляет указанное сообщение электронной почты на сервер SMTP для доставки. Этот метод не блокирует вызывающий поток и позволяет вызывающей стороне передать объект в метод, вызванный после завершения операции.

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

Отправляет сообщение электронной почты на сервер SMTP для доставки. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String. Этот метод не блокирует вызывающий поток и позволяет вызывающей стороне передать объект в метод, вызванный после завершения операции.

SendAsyncCancel()

Отменяет асинхронную операцию отправки сообщения электронной почты.

SendMailAsync(MailMessage)

Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции.

SendMailAsync(MailMessage, CancellationToken)

Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции.

SendMailAsync(String, String, String, String)

Отправляет указанное сообщение SMTP-серверу для доставки в качестве асинхронной операции. Отправитель, получатели, тема и основная часть сообщения указываются с помощью объектов String.

SendMailAsync(String, String, String, String, CancellationToken)

Отправляет указанное сообщение на SMTP-сервер для доставки в качестве асинхронной операции, используя указанные строки с темой и текстом, а также с данными об отправителе и получателях.

ToString()

Возвращает строку, представляющую текущий объект.

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

События

SendCompleted

Происходит после завершения асинхронной операции по отправке электронной почты.

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

См. также раздел