发送电子邮件时出错

问题描述:

我有一个解决方案,在用户忘记密码时检索用户密码。我做了很好的代码,但是出现了一个SMTP异常(发送错误)的错误。我该如何解决这个问题?发送电子邮件时出错

protected void Button1_Click(object sender, EventArgs e) 
{ 
    using (SqlConnection con = Connection.GetConnection()) 
    { 
     string sql = "Select Password From Registeration Where [email protected] And [email protected]"; 
     SqlCommand com = new SqlCommand(sql, con); 
     com.CommandType = CommandType.Text; 

     com.Parameters.Add("@UserName", SqlDbType.NVarChar, 50).Value = TxtUserName.Text; 
     com.Parameters.Add("@Email", SqlDbType.NVarChar, 50).Value = TxtEmail.Text; 
     SqlDataReader dr = com.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection); 
     while (dr.Read()) 
     { 
      SendMail("[email protected]", "xxxx", TxtEmail.Text, " Hi", "Hi" + dr["Password"].ToString()); 
     } 
     Response.Redirect(""); 
    } 
} 


public static bool SendMail(string elarabyAccount, string password, string to, string subject, string message) 
{ 
    try 
    { 
     NetworkCredential loginInfo = new NetworkCredential(elarabyAccount, password); 
     MailMessage msg = new MailMessage(); 
     msg.From = new MailAddress(elarabyAccount); 
     msg.To.Add(new MailAddress(to)); 
     msg.Subject = subject; 
     msg.Body = message; 
     msg.IsBodyHtml = true; 
     SmtpClient client = new SmtpClient("smtp.elarabygroup.com", 8080); 
     client.EnableSsl = true; 
     client.UseDefaultCredentials = false; 
     client.Credentials = loginInfo; 
     client.Send(msg); 

     return true; 
    } 
    catch (Exception) 
    { 
     return false; 
    } 
} 
+2

如何发布错误/异常详细信息? – Oded 2010-08-05 07:48:38

+0

顺便提一下,我无法解析'smtp.elarabygroup.com'。该主机是否可以从您用于测试的机器上获得?它应该读取“mail.elarabygroup.com”而不是? – sarnold 2010-08-05 07:54:13

+0

我在我的公司网络上工作,并通过outlook或mail.elarabygroup.com登录到我的电子邮件 – Myworld 2010-08-05 08:04:56

documentation for SmtpClass状态下述(重点煤矿):

由SmtpClient 类到SMTP服务器的 当前实例建立可以是该连接 如果应用程序希望重新使用到 发送多个邮件到同一个 SMTP服务器。 当使用身份验证或加密建立到SMTP服务器的连接时,这特别有用。

由于您使用的加密(client.EnableSsl = true;),你应该尽量使用单一SmtpClient实例发送您的邮件。

而且,通过对SendMail每次调用创建的SmtpClient一个新实例,你创建的SMTP服务器的新连接;根据您拥有的记录数量以及您要发送的电子邮件数量,SMTP服务器有可能因为数量太高而拒绝接受任何来自您的连接,因为它可能认为您要么发出DDoS攻击,或者你正在尝试做其他恶意的事情。

如上所述,只需尝试使用单个SmtpClient实例即可。

另一个可能的问题可能是SmtpClient未通过发出QUIT命令而正确退出连接。 This is a known bug,并在Microsoft .NET Framework 4中修复。