释放派生类



我有一个派生自System.Net.Mail.MailMessage的类。该类将仅包含电子邮件正文的一些 HTML 格式的静态文本。

public sealed class CustomMessage : MailMessage
{
public void SendTo(params string[] addresses)
{
foreach (var address in addresses)
{
SendTo(address);
}
}
public void SendTo(string address)
{
To.Add(address);
}
// ...
}

然后我可以把它包装在一个using语句中:

using (var message = new CustomMessage())
{
message.SendTo("address1", "address2");
//...
}

MailMessage基类实现IDisposable

protected virtual void Dispose(bool disposing)
{
if (!disposing || this.disposed)
return;
this.disposed = true;
if (this.views != null)
this.views.Dispose();
if (this.attachments != null)
this.attachments.Dispose();
if (this.bodyView == null)
return;
this.bodyView.Dispose();
}

我是否仍然需要重写Dispose(bool)方法,尽管我的类中没有真正要处理的内容?

bool disposed = false;
protected override void Dispose(bool disposing)
{
if (disposed)
return; 
if (disposing) 
{
// Nothing managed to dispose.
}
// Nothing unmanaged to dispose.
disposed = true;
base.Dispose(disposing);
}

不,CustomMessage继承基本Dispose()Dispose(bool)方法。它不需要覆盖它们,除非它必须自己做一些额外的处置。

我刚刚注意到你使用System.Net.Mail.MailMessage。不要。它已经过时了,Microsoft本身强烈警告不要使用它。

自定义消息的替代方法

在任何情况下,最好编写扩展方法来添加多个收件人,而不是创建新的邮件类。你可以在MimeKit中创建这样的东西,这是SmtpClient的建议替代品:

static public void AddRecipients(this MimeMessage message,IEnumerable<string> addresses)
{
var ads=addresses.Select(ad=>MailboxAddress.Parse(ad));
message.To.AddRange(ads);
}

或者这个对于 SmptClient

static public void AddRecipients(this MailMessage message,IEnumerable<string> addresses)
{
foreach (var address in addresses)
{
message.To.Add(address);
}
}

Smpt客户端已过时

我刚刚注意到你使用System.Net.Mail.MailMessage。不要。Microsoft本身警告不要在SmptClient文档页面顶部的格式非常强的警告中使用SmptClient:

警告

此 API 现已过时。

实际上,您应该已经收到编译器警告:

SmtpClient 及其类型网络设计不佳,我们强烈建议您使用 https://github.com/jstedfast/MailKit 和 https://github.com/jstedfast/MimeKit

您应该更改代码以使用 MailKit。您可能不必首先创建自定义消息。

对于简单情况,该API类似于SmptClient,甚至还有从System.Net.Mail.MailMessage到MimeKit自己的MimeMessage的强制转换操作,以使过渡更容易。

来自MailKit的Github登录页面的示例显示了使用它是多么容易。

var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey Tribbiani", "joey@friends.com"));
message.To.Add (new MailboxAddress ("Mrs. Chanandler Bong", "chandler@friends.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart ("plain") {
Text = @"Hey Chandler,
I just wanted to let you know that Monica and I were going to go play some paintball, you in?
-- Joey"
};
using (var client = new SmtpClient ()) {
// For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
client.ServerCertificateValidationCallback = (s,c,h,e) => true;
client.Connect ("smtp.friends.com", 587, false);
// Note: only needed if the SMTP server requires authentication
client.Authenticate ("joey", "password");
client.Send (message);
client.Disconnect (true);
}

由于您没有多余的东西要处置,因此不需要覆盖处置。

最新更新