我正在尝试使用 SmtpClient.SendMailAsync 方法发送大量电子邮件。 这是我从简单控制台应用程序调用的测试方法。
static void Main(string[] args)
{
SendMailsOnebyOneAsync().GetAwaiter().GetResult();
}
public static async Task SendMailsOnebyOneAsync()
{
for (int i = 0; i < 1000; i++)
{
try
{
using (SmtpClient sMail = new SmtpClient("XXX"))
{
sMail.DeliveryMethod = SmtpDeliveryMethod.Network;
sMail.UseDefaultCredentials = false;
sMail.Credentials = null;
var fromMailAddress = new MailAddress("XXX");
var toMailAddress = new MailAddress("XXX");
MailMessage message = new MailMessage(fromMailAddress, toMailAddress)
{
Subject = "test"
};
await sMail.SendMailAsync(message);
Console.WriteLine("Sent {0}", i);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
有时该方法挂起了-等待 SendMailAsync ,它似乎卡住了,不会返回。
我看到一个相关的问题 SmtpClient SendMailAsync sometimes never returns。 但没有修复建议对我有用。
当我尝试使用同步方法 SmtpClient.Send 时,一切正常,应用程序永不挂机。
有人知道哪里出了问题吗?
答案 0 :(得分:1)
使用一个客户端发送重复的邮件。不断创建并处理许多客户端可能遇到的端口问题。
public static async Task SendMailsOnebyOneAsync() {
using (var sMail = new SmtpClient("XXX")) {
sMail.DeliveryMethod = SmtpDeliveryMethod.Network;
sMail.UseDefaultCredentials = false;
sMail.Credentials = null;
for (int i = 0; i < 1000; i++) {
try {
var fromMailAddress = new MailAddress("XXX");
var toMailAddress = new MailAddress("XXX");
var message = new MailMessage(fromMailAddress, toMailAddress) {
Subject = "test"
};
await sMail.SendMailAsync(message);
Console.WriteLine("Sent {0}", i);
} catch (Exception e) {
Console.WriteLine(e.Message);
}
}
}
}
第二,虽然可能只是一个例子,但尝试一次发送那么多电子邮件是不合理的。
答案 1 :(得分:1)
我的一位同事指出我 SmtpClient 实际上已经过时了,Microsoft建议不要使用它。
请参阅以下link。
************ Update ***********
我已尝试按照链接中的建议使用 MailKit 。 使用 MailKit 进行非异步和异步发送时,相同的情况也可以完美地工作。
**********************************
答案 2 :(得分:0)
请注意,SmtpClient不支持现代协议。
偶尔也可以将电子邮件用于内部使用和测试。
您可以尝试MailKit