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 |
Происходит после завершения асинхронной операции по отправке электронной почты. |