我有一个派生自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);
}
由于您没有多余的东西要处置,因此不需要覆盖处置。