你应该没有真正理解,采用SMTP发送邮件的过程,一般来说,邮件不是即时发送的,我们的发送过程,实际上只是,发送方SMTP服务器的接收,真正发送,取决于具体的发送方SMTP服务器。上面的SendCompletedCallback(object sender, AsyncCompletedEventArgs e)中如果没有发生错误,只是保证发送方SMTP服务器收到了我们让他发送的邮件。一般来说,发送方SMTP服务器不会保证邮件真正发送到接收方的SMTP服务器,如果发送到接收方SMTP服务器失败,有些可能会尝试给发送地址,发回一个邮件, 但有些就直接Drop掉了,现在大多SMTP服务器只允许特定的与(自己的Pop3对应的)发送地址,(多年以前的很多SMTP服务器是允许任何人使用的,那时候也没有SMTP验证这一说)。总之,根本不能根据上面的e.Error判断发送有没有真正成功。如果不是特定的服务器也是根本无从判断。
可以看一下维基百科
http://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol#Mail_processing_model
恩,同步发送的时候它能验证,并能获取异常,那这个验证是怎么来的,他跟异步发送有什么区别。
建议将代码贴出来。
public bool Sendmail(string title, string content)
{
if ("" == title.Trim())
{
throw new Exception("请填写主题");
}
if ("" == content.Trim())
{
throw new Exception("请填写邮件内容");
}
SmtpClient smtpClient = new SmtpClient();
smtpClient.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;//指定电子邮件发送方式
smtpClient.Host = _strHost; //指定SMTP服务器
smtpClient.Credentials = new System.Net.NetworkCredential(_strAccount, _strPwd);//用户名和密码
MailMessage mailMessage = new MailMessage(_strFrom, _strTo);
mailMessage.Subject = title;//主题
mailMessage.Body = content;//内容
mailMessage.BodyEncoding = System.Text.Encoding.UTF8;//正文编码
mailMessage.IsBodyHtml = true;//设置为HTML格式
mailMessage.Priority = MailPriority.High;//优先级
try
{
smtpClient.SendAsync(mailMessage, null);
return true;
}
catch
{
return false;
}
}
#endregion
#region 发送返回
public static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
GetResultdel(e.Error.Message);
}
else
{
GetResultdel("发送成功");
}
}
这段代码经测试没问题。问题出在其它地方。我测试同步和异步发送信息,_strFrom和_strTo为非邮箱格式时,MailMessage mailMessage = new MailMessage(_strFrom, _strTo);这句时就会出错,这和同步异步没关系。当_strTo为不存在的地址时,这也和同步异步没关系,对于SmtpClient 来说它已经是发送到邮件服务器上去了,所以结果是"发送成功"。
strFrom是错误的呢?
我上面说到的,_strFrom错误也是一样的,MailMessage mailMessage = new MailMessage的地方就会报错的。
@LCM: 这个不对吧,这只是创建一个邮件类,都没发送到服务器,还没检测怎么就报错了呢?