SmtpClient 类
允许应用程序使用简单邮件传输协议 (SMTP) 来发送电子邮件。
命名空间: System.Net.Mail 程序集: System(在 System.dll 中)
SmtpClient 类型公开以下成员。
名称 | 说明 | |
---|---|---|
SmtpClient | 使用配置文件设置初始化 SmtpClient 类的新实例。 | |
SmtpClient(String) | 初始化 SmtpClient 类的新实例,让其使用指定的 SMTP 服务器发送电子邮件。 | |
SmtpClient(String, Int32) | 初始化 SmtpClient 类的新实例,让其使用指定的 SMTP 服务器和端口发送电子邮件。 |
名称 | 说明 | |
---|---|---|
ClientCertificates | 指定应该使用哪些证书来建立安全套接字层 (SSL) 连接。 | |
Credentials | 获取或设置用于验证发件人身份的凭据。 | |
DeliveryMethod | 指定如何处理待发的电子邮件。 | |
EnableSsl | 指定 SmtpClient 是否使用安全套接字层 (SSL) 加密连接。 | |
Host | 获取或设置用于 SMTP 事务的主机的名称或 IP 地址。 | |
PickupDirectoryLocation | 获取或设置文件夹,应用程序在该文件夹中保存将由本地 SMTP 服务器处理的邮件。 | |
Port | 获取或设置用于 SMTP 事务的端口。 | |
ServicePoint | 获取用于传输电子邮件的网络连接。 | |
TargetName | 获取或设置在使用扩展保护时用于身份验证的服务提供程序名称 (SPN)。 | |
Timeout | 获取或设置一个值,该值指定同步 Send 调用的超时时间。 | |
UseDefaultCredentials | 获取或设置 Boolean 值,该值控制 DefaultCredentials 是否随请求一起发送。 |
名称 | 说明 | |
---|---|---|
Dispose | 向 SMTP 服务器发送一条 QUIT 消息,适当地结束 TCP 连接,并释放由 SmtpClient 类的当前实例使用的所有资源。 | |
Dispose(Boolean) | 向 SMTP 服务器发送一条 QUIT 消息,适当地结束 TCP 连接,释放由 SmtpClient 类的当前实例使用的所有资源,并可选择释放托管资源。 | |
Equals(Object) | 确定指定的 Object 是否等于当前的 Object。 (继承自 Object。) | |
Finalize | 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。) | |
GetHashCode | 用作特定类型的哈希函数。 (继承自 Object。) | |
GetType | 获取当前实例的 Type。 (继承自 Object。) | |
MemberwiseClone | 创建当前 Object 的浅表副本。 (继承自 Object。) | |
OnSendCompleted | 引发 SendCompleted 事件。 | |
Send(MailMessage) | 将指定的邮件发送到 SMTP 服务器以便传递。 | |
Send(String, String, String, String) | 将指定的电子邮件发送到 SMTP 服务器以便传递。 使用 String 对象指定邮件的发件人、收件人、主题和邮件正文。 | |
SendAsync(MailMessage, Object) | 将指定的电子邮件发送到 SMTP 服务器以便传递。 此方法不会阻止调用线程,并允许调用方将对象传递给操作完成时调用的方法。 | |
SendAsync(String, String, String, String, Object) | 将电子邮件发送到 SMTP 服务器以便传递。 使用 String 对象指定邮件的发件人、收件人、主题和邮件正文。 此方法不会阻止调用线程,并允许调用方将对象传递给操作完成时调用的方法。 | |
SendAsyncCancel | 取消异步操作以发送电子邮件。 | |
ToString | 返回表示当前对象的字符串。 (继承自 Object。) |
名称 | 说明 | |
---|---|---|
SendCompleted | 在异步电子邮件发送操作完成时出现。 |
SmtpClient 类用于将电子邮件发送到 SMTP 服务器以便传递。 RFC 2821 中定义了 SMTP 协议,这可以在 http://www.ietf.org 上找到。
下表中显示的类用于构造可以使用 SmtpClient 发送的电子邮件。
类 |
说明 |
---|---|
表示文件附件。 此类允许您将文件、流或文本附加到电子邮件中。 |
|
表示发件人和收件人的电子邮件地址。 |
|
表示电子邮件。 |
若要使用 SmtpClient 构造并发送电子邮件,必须指定以下信息:
-
身份验证凭据(如果 SMTP 服务器要求)。 请参见 Credentials 属性。
-
发件人的电子邮件地址。 请参见接受 from 参数的 Send 方法和 SendAsync 方法。 另请参见 MailMessage.From 属性。
-
收件人的电子邮件地址。 请参见接受 recipient 参数的 Send 方法和 SendAsync 方法。 另请参见 MailMessage.To 属性。
-
邮件内容。 请参见接受 body 参数的 Send 方法和 SendAsync 方法。 另请参见 MailMessage.Body 属性。
若要在电子邮件中包括附件,首先使用 Attachment 类创建附件,再使用 MailMessage.Attachments 属性将附件添加到邮件中。 根据收件人使用的电子邮件阅读程序和附件的文件类型,某些收件人可能无法阅读附件。 对于那些无法以附件的原始格式显示附件的客户端,可以通过使用 MailMessage.AlternateViews 属性来指定替代视图。
可以使用应用程序或计算机配置文件来指定所有 SmtpClient 对象的默认主机、端口和凭据值。 有关更多信息,请参见 <mailSettings> 元素(网络设置)。
若要发送电子邮件并在等待电子邮件传输到 SMTP 服务器期间阻止其他操作,请使用一个同步 Send 方法。 若要允许程序的主线程在传输电子邮件的过程中继续执行,请使用一个异步 SendAsync 方法。 SendAsync 操作完成时会引发 SendCompleted 事件。 若要接收此事件,必须将 SendCompletedEventHandler 委托添加到 SendCompleted 中。 SendCompletedEventHandler 委托必须引用处理 SendCompleted 事件通知的回调方法。 若要取消异步电子邮件传输,请使用 SendAsyncCancel 方法。
注意 |
---|
如果正在传输电子邮件时再次调用 SendAsync 或 Send,则会接收到 InvalidOperationException。 |
如果应用程序希望向同一个 SMTP 服务器发送多个消息,SmtpClient 类的当前实例建立到该 SMTP 服务器的连接可能被重复使用。 当使用身份验证或加密建立一个到 SMTP 服务器的连接时,这是非常有用的。 进行身份验证并建立一个 TLS 会话的过程可能是大量消耗资源的操作。 当向同一个 SMTP 服务器发送大量电子邮件时,给每条消息重新建立连接的要求可能对性能有明显的影响。 存在大量的大容量电子邮件应用程序,用来发送电子邮件状态更新、新闻稿分发信息或电子邮件警报。 另外,很多的电子邮件客户端应用程序支持脱机模式,在此模式下用户可撰写许多电子邮件消息,并在其后建立了到 SMTP 服务器的连接时发送。 对电子邮件客户端来说,典型情况是将所有 SMTP 消息发送到一个特点的 SMTP 服务器(由 Internet 服务提供商提供),然后此服务器再将此电子邮件发送到其他 SMTP 服务器。
SmtpClient 类实现集中 SMTP 连接,以使其可以避免为每条到同一个服务器的消息都重新建立一个连接的开销。 应用程序可能重复使用相同的 SmtpClient 对象,以将许多不同电子邮件发往同一个 SMTP 服务器或许多不同的 SMTP 服务器。 如此一来,无法确认应用程序何时完成使用 SmtpClient 对象和该对象应在何时被清理。
当 SMTP 会话已完成,且客户端想要终止连接时,它必须发送 QUIT 消息到服务器,以表示它已没有消息要发送。 这使得服务器可以释放与来自客户端的连接相关的资源,并处理客户端发来的消息。
SmtpClient 类没有 Finalize 方法,因此应用程序必须调用 Dispose 来显式释放资源。 Dispose 方法在所有建立到 Host 属性中指定的 SMTP 服务器的连接中循环,并发送 QUIT 消息,其后平稳断开 TCP 连接。 Dispose 方法也释放由 Socket 使用的非托管资源,并根据需要释放托管资源。
使用完 SmtpClient 后调用 Dispose。 Dispose 方法使 SmtpClient 处于不可用状态。 调用完 Dispose 后,必须释放对 SmtpClient 的所有引用,这样垃圾回收器才能收回 SmtpClient 占用的内存。
Topic | Location |
---|---|
如何:在 IIS 中安装和配置 SMTP 虚拟服务器 | 配置 ASP .NET Web 应用程序 |
如何:在 IIS 6.0 中安装和配置 SMTP 虚拟服务器 | 在 Visual Studio 中生成 ASP .NET Web 应用程序 |
下面的代码示例演示如何以异步方式发送电子邮件。
using System; using System.Net; using System.Net.Mail; using System.Net.Mime; using System.Threading; using System.ComponentModel; namespace Examples.SmptExamples.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 the the SMTP host. SmtpClient client = new SmtpClient(args[0]); // Specify the e-mail 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 e-mail message. MailAddress to = new MailAddress("ben@contoso.com"); // Specify the message content. MailMessage message = new MailMessage(from, to); message.Body = "This is a test e-mail 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."); } } }