SMTP 通过向 vs 异步方法添加多个来发送多个邮件
SMTP send multiple mail by adding multiple to vs Async method
问题:我有一个 50~100 人的列表,我需要向其发送电子邮件,MailMessage 允许我添加一个 To(MailAddressCollection) 列表和 smtpClient.Send(mail) 或异步方法?向多个收件人发送电子邮件的最佳做法是什么?
根据我从你的问题中了解到的情况,你目前正在尝试确定哪一个更好?
将所有电子邮件添加到单个 MailMessage 并同步发送
var mailAddressCollection = new MailAddressCollection();
mailAddressCollection.Add("someone@domain.com,someoneelse@domain.com...");
// initialize the message and smtpclient
smtpClient.Send(message);
这将导致发送一封电子邮件。所有收件人都可以看到电子邮件发送给了谁。根据应用程序,如果发送给客户可能会侵犯隐私。 Send
将阻塞调用线程。
将所有电子邮件添加到单个 MailMessage 并异步发送
var mailAddressCollection = new MailAddressCollection();
mailAddressCollection.Add("someone@domain.com,someoneelse@domain.com...");
// initialize the message and smtpclient
await smtpClient.SendMailAsync(message);
除了SendMailAsync
不会阻塞调用线程外,与上面相同。
为每个电子邮件地址创建一个新的 MailMessage 并同步发送
// emailAddresses is a collection of strings
var mailAddressCollection = new MailAddressCollection();
foreach (var emailAddress in emailAddresses)
{
// initialize the message and smtpclient
smtpClient.Send(message);
}
这将导致为每个电子邮件地址发送一封电子邮件。收件人将不知道还有谁收到了相同的电子邮件,因为如果“收件人”字段,他们将是唯一的地址。因为每个电子邮件地址都会发送一封单独的电子邮件,所以完成循环的时间与电子邮件地址的数量成正比。例如。如果发送 1 封电子邮件需要 2 秒,则发送 100 封电子邮件需要 200 秒。
为每个电子邮件地址创建一个新的 MailMessage 并异步发送
// emailAddresses is a collection of strings
var mailAddressCollection = new MailAddressCollection();
foreach (var emailAddress in emailAddresses)
{
// initialize the message and smtpclient
await smtpClient.SendMailAsync(message);
}
除了SendMailAsync
不会阻塞调用线程外,与上面相同。
使用 SmtpClient 的注意事项
Microsoft 不建议使用 SmtpClient
进行新开发,因为它不支持现代协议。他们目前推荐使用 MailKit 或其他库。就个人而言,我已经多年没有使用 SmtpClient
,而是将我所有的电子邮件发送委托给第三方,例如 MailGun 和 SendGrid。
见https://github.com/dotnet/platform-compat/blob/master/docs/DE0005.md
您可以并行分派发送请求,然后等待它们全部完成发送,而不是序列化电子邮件发送。
IEnumerable<MailMessage> emails = // create your email collection
var sendTasks = emails.Select(smtpClient.SendMailAsync);
await Task.WhenAll(sendTasks);
当有大量邮件要发送时,这会更有效率。
问题:我有一个 50~100 人的列表,我需要向其发送电子邮件,MailMessage 允许我添加一个 To(MailAddressCollection) 列表和 smtpClient.Send(mail) 或异步方法?向多个收件人发送电子邮件的最佳做法是什么?
根据我从你的问题中了解到的情况,你目前正在尝试确定哪一个更好?
将所有电子邮件添加到单个 MailMessage 并同步发送
var mailAddressCollection = new MailAddressCollection();
mailAddressCollection.Add("someone@domain.com,someoneelse@domain.com...");
// initialize the message and smtpclient
smtpClient.Send(message);
这将导致发送一封电子邮件。所有收件人都可以看到电子邮件发送给了谁。根据应用程序,如果发送给客户可能会侵犯隐私。 Send
将阻塞调用线程。
将所有电子邮件添加到单个 MailMessage 并异步发送
var mailAddressCollection = new MailAddressCollection();
mailAddressCollection.Add("someone@domain.com,someoneelse@domain.com...");
// initialize the message and smtpclient
await smtpClient.SendMailAsync(message);
除了SendMailAsync
不会阻塞调用线程外,与上面相同。
为每个电子邮件地址创建一个新的 MailMessage 并同步发送
// emailAddresses is a collection of strings
var mailAddressCollection = new MailAddressCollection();
foreach (var emailAddress in emailAddresses)
{
// initialize the message and smtpclient
smtpClient.Send(message);
}
这将导致为每个电子邮件地址发送一封电子邮件。收件人将不知道还有谁收到了相同的电子邮件,因为如果“收件人”字段,他们将是唯一的地址。因为每个电子邮件地址都会发送一封单独的电子邮件,所以完成循环的时间与电子邮件地址的数量成正比。例如。如果发送 1 封电子邮件需要 2 秒,则发送 100 封电子邮件需要 200 秒。
为每个电子邮件地址创建一个新的 MailMessage 并异步发送
// emailAddresses is a collection of strings
var mailAddressCollection = new MailAddressCollection();
foreach (var emailAddress in emailAddresses)
{
// initialize the message and smtpclient
await smtpClient.SendMailAsync(message);
}
除了SendMailAsync
不会阻塞调用线程外,与上面相同。
使用 SmtpClient 的注意事项
Microsoft 不建议使用 SmtpClient
进行新开发,因为它不支持现代协议。他们目前推荐使用 MailKit 或其他库。就个人而言,我已经多年没有使用 SmtpClient
,而是将我所有的电子邮件发送委托给第三方,例如 MailGun 和 SendGrid。
见https://github.com/dotnet/platform-compat/blob/master/docs/DE0005.md
您可以并行分派发送请求,然后等待它们全部完成发送,而不是序列化电子邮件发送。
IEnumerable<MailMessage> emails = // create your email collection
var sendTasks = emails.Select(smtpClient.SendMailAsync);
await Task.WhenAll(sendTasks);
当有大量邮件要发送时,这会更有效率。