C# 我试着从我的程序一次发送300封邮件到相同的电子邮件id。我收到以下SMTP异常
错误:System.Net.Mail.SmtpException:发送邮件失败。-->System.ArgumentException:没有从此类上相应的异步方法返回IAsyncResult对象。参数名称:System.Net.Mime.MimeBasePart.EndSend处的asyncResult(IAsyncResult asyncResult)System.Net.Mail.Message.EndSend处的asyncResult(IAsyncResult asyncResult)System.Net.Mail.SmtpClient.SendMessageCallback(IAsyncResult result)-内部异常堆栈跟踪结束---C# 我试着从我的程序一次发送300封邮件到相同的电子邮件id。我收到以下SMTP异常,c#,asp.net,email,smtp,smtpclient,C#,Asp.net,Email,Smtp,Smtpclient,错误:System.Net.Mail.SmtpException:发送邮件失败。-->System.ArgumentException:没有从此类上相应的异步方法返回IAsyncResult对象。参数名称:System.Net.Mime.MimeBasePart.EndSend处的asyncResult(IAsyncResult asyncResult)System.Net.Mail.Message.EndSend处的asyncResult(IAsyncResult asyncResult)Sy
如何避免此错误?使用
ManualResetEvent
对象。我猜SmtpClient正在被处理,这就是为什么它会丢失对MailClient\u SendCompleted
ManualResetEvent resetEvent;
private void DispatchMail(MailMessage message, MessageTrackerObject trackInfo)
{
// other code here
resetEvent = new ManualResetEvent(false);
mailClient.EnableSsl = GetStaticSetting(Constants.APPCONFIG_KEY_MAIL_SSL).ToLower() == "true";
mailClient.SendCompleted += new SendCompletedEventHandler(MailClient_SendCompleted);
mailClient.SendAsync(message, trackInfo);
resetEvent.WaitOne(TimeSpan.FromSeconds(5)); // waits for 5 seconds
//mailClient.Send(message);
}
private void MailClient_SendCompleted(object sender, AsyncCompletedEventArgs e)
{
resetEvent.Set(); // removes the wait after successfully sending
string error = "";
MessageTrackerObject data = (MessageTrackerObject)e.UserState;
// other code here
}
这里最可能的问题是
MailMessage
的同一个实例被传递到DispatchMail
MailMessage
在设计上不是线程安全的,每个SmtpClient.SendAsync
都在内部调用Message.BeginSend
因此,当多个线程试图发送相同的MailMessage
时,调用Message.EndSend
时存在竞争条件。如果调用EndSend
的线程与调用BeginSend
的线程相同,那么我们很幸运。如果不是,则引发上述异常
IAsyncResult对象未从相应的
此类上的异步方法
这里的解决方案是为每次调用SendAsync
复制MailMessage
,或者使用SendAsync
重载,该重载接受5个参数:
void SendAsync(string from, string recipients, string subject, string body, object token)
编辑:
这个异常很容易复制,以证明MailMessage不是线程安全的。您可能会遇到多个异常,IAsyncResult
上面的一个异常,或者在填充标题时已添加了项
:
using System;
using System.Net.Mail;
using System.Threading.Tasks;
class App
{
static void Main()
{
var mail = new MailMessage("aaa@bbb.ccc", "ddd@eee.fff", "Test Subj", "Test Body");
var client1 = new SmtpClient("localhost");
var client2 = new SmtpClient("localhost");
var task1 = client1.SendMailAsync(mail);
var task2 = client2.SendMailAsync(mail);
Task.WhenAll(task1, task2).Wait();
}
}
显示一些代码怎么样?这里绝对没有什么可出去的。如果你只有这些,用谷歌搜索错误消息。你能发布邮件客户端对象代码,特别是SendAsync吗?是的,我已经添加了代码。@user3332414我已经添加了答案
using System;
using System.Net.Mail;
using System.Threading.Tasks;
class App
{
static void Main()
{
var mail = new MailMessage("aaa@bbb.ccc", "ddd@eee.fff", "Test Subj", "Test Body");
var client1 = new SmtpClient("localhost");
var client2 = new SmtpClient("localhost");
var task1 = client1.SendMailAsync(mail);
var task2 = client2.SendMailAsync(mail);
Task.WhenAll(task1, task2).Wait();
}
}