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


SmtpClient Класс

Определение

Отправляет сообщение электронной почты с помощью протокола SMTP. Тип SmtpClient не рекомендуется для новой разработки. Дополнительные сведения см. в разделе "Примечания".

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

Примеры

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


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)
            {
                client.SendAsyncCancel();
            }
            // Clean up.
            message.Dispose();
            client.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()
            client.Dispose()
            Console.WriteLine("Goodbye.")
        End Sub
    End Class
End Namespace

Комментарии

Класс SmtpClient используется для отправки электронной почты на SMTP-сервер для доставки. Протокол SMTP определен в RFC 2821, который доступен по адресу https://www.ietf.org.

Это важно

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

Класс SmtpClient :

  • Включены в .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 Element (Network Settings>). .NET Core не поддерживает параметры по умолчанию. В качестве обходного решения необходимо задать соответствующие свойства SmtpClient напрямую.

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

Замечание

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

Подключение, установленное текущим экземпляром SmtpClient класса к SMTP-серверу, может быть повторно использовано, если приложение хочет отправить несколько сообщений на один SMTP-сервер. Это особенно полезно при использовании проверки подлинности или шифрования подключения к SMTP-серверу. Процесс проверки подлинности и установления сеанса TLS может быть дорогостоящими операциями. Требование повторного установления подключения для каждого сообщения при отправке большого количества сообщений электронной почты на один SMTP-сервер может оказать значительное влияние на производительность. Существует несколько приложений электронной почты с большим объемом, которые отправляют обновления состояния электронной почты, рассылки бюллетеней или оповещения электронной почты. Кроме того, многие клиентские приложения электронной почты поддерживают режим внестроки, в котором пользователи могут создавать множество сообщений электронной почты, отправляемых позже при установке подключения к 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, Int32)

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

SmtpClient(String)

Инициализирует новый экземпляр 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, CancellationToken)

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

SendMailAsync(MailMessage)

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

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

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

SendMailAsync(String, String, String, String)

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

ToString()

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

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

События

Имя Описание
SendCompleted

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

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

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