//i have left out some parameters for readability
public static string MailForCandidate(string username, string FromAddr, string ToAddr, string strSubject)
{
try
{
MailMessage msg = new MailMessage();
string strMailBody = "Test body";
msg.To = ToAddr;
msg.From = FromAddr;
msg.BodyFormat = MailFormat.Html;
msg.Priority = MailPriority.High;
msg.Subject = strSubject;
msg.Body = strMailBody.ToString();
SmtpMail.SmtpServer = ConfigurationManager.AppSettings["mailServer"].ToString();
try
{
SmtpMail.Send(msg);
msg = null;
return "";
}
catch (Exception ex)
{
Util.Common.LogErrorMessage(ex);
msg = null;
return username;
}
}
catch (Exception ex)
{
throw ex;
}
}
我有上述功能,用于从 IIS 托管的 .NET 3.5 asp.net 应用程序发送电子邮件。
单击按钮即可发送电子邮件,并从数据库表中读取收件人。
我遇到的问题是,一些收件人收到他们的电子邮件时没有任何问题,而另一些收件人则需要很长时间才能收到他们的电子邮件(有时在 24 小时后),而此时他们应该参加的活动已经过期(这有对我公司的法律影响)。最后,其他人没有完全收到电子邮件。
上面的MailForCandidate
函数是从SendCandidateMail
下面调用的。
private void SendCandidateMail(int intEmailType)
{
try
{
ArrayList arrPending = new ArrayList();
ArrayList arrUnsent = new ArrayList();
string strCandidatename = string.Empty;
string stractualname = string.Empty;
int intUnsentCandCount = 0;
if (hdnUnsentNames.Value.Trim() != string.Empty)
{
arrUnsent.AddRange(hdnUnsentNames.Value.Split(','));
}
if (hdnPendingNames.Value.Trim() != string.Empty)
{
arrPending.AddRange(hdnPendingNames.Value.Split(','));
}
hdnUnsentNames.Value = string.Empty;
hdnPendingNames.Value = string.Empty;
if (!string.IsNullOrEmpty(hdnUnsent.Value) && !string.Empty.Equals(hdnUnsent.Value))
{
string[] strUnsIds = hdnUnsent.Value.Split('~');
for (int i = 0; i < strUnsIds.Length; i++)
{
DataSet dtsetCandidate = CandidatesListBL.GetCandidateDetails(Convert.ToInt32(strUnsIds[i]));
stractualname = arrUnsent[i].ToString();
if (dtsetCandidate.Tables[0].Rows.Count > 0)
{
if (dtsetCandidate.Tables[0].Rows[0]["Time"].ToString() != "0")
{
//i have left out some parameters for readability
strCandidatename = SendMail.MailForCandidate(dtsetCandidate.Tables[0].Rows[0]["User_Id"].ToString(), intEmailType);
}
else
strCandidatename = SendMail.MailForCandidateNoTime(dtsetCandidate.Tables[0].Rows[0]["User_Id"].ToString(), intEmailType);
if (strCandidatename.Trim().Equals(string.Empty))
{
hdnUnsentNames.Value = hdnUnsentNames.Value + stractualname + ",";
intUnsentCandCount = intUnsentCandCount + 1;
if (Convert.ToInt32(EnumMaster.EmailType.Customized) != intEmailType)
{
CandidatesListBL.UpdateCandidateStatus(Convert.ToInt32(strUnsIds[i]), "Sent");
CandidatesListBL.UpdateDateSent(Convert.ToInt32(strUnsIds[i]));
}
}
}
}
hdnUnsent.Value = string.Empty;
}
}
catch (Exception ex)
{
WESMessage.DisplayMessage(this, this.UpdatePanel1, DanielHac.TamperProofString.QueryStringEncode("MailFailed"), this.strinfo);
Common.LogErrorMessage(ex);
}
}
以下是错误日志文本文件中记录的内容。
2017 年 1 月 22 日下午 3:23:04 ==> 异常消息:线程被中止。2017 年 1 月 22 日下午 3:23:04 ==> 异常源:App_Code 异常目标站点:System.String MailForCandidate(System.String, System.String, System.String, System.Collections.ArrayList, System.String, System .String, System.String, System.String, System.String, System.String, UserSession, System.String, System.String, Int32, Int32) 异常堆栈跟踪:在 WES.Util.SendMail.MailForCandidate(String strUserID, String用户名、字符串密码、ArrayList alFiles、字符串 FromName、字符串 FromAddr、字符串 ToAddr、字符串标题、字符串 strSubject、字符串 strCustomMsg、UserSession UserObj、字符串 strDeadLine、字符串 strTime、Int32 intOfficeId、Int32 intMailType) 在 Pages_ExerciseDetails.SendCandidateMail(Int32 intEmailType) 异常到字符串:System.Threading。ThreadAbortException:线程被中止。在 WES.Util.SendMail.MailForCandidate(字符串 strUserID,字符串用户名,字符串密码,ArrayList alFiles,字符串 FromName,字符串 FromAddr,字符串 ToAddr,字符串标题,字符串 strSubject,字符串 strCustomMsg,UserSession UserObj,字符串 strDeadLine,字符串 strTime,Int32 intOfficeId , Int32 intMailType) 在 Pages_ExerciseDetails.SendCandidateMail(Int32 intEmailType)
和
2017 年 1 月 22 日下午 3:23:04 ==> 异常消息:线程被中止。2017 年 1 月 22 日下午 3:23:04 ==> 异常源:App_Web_kxc2lbj5 异常目标站点:Void SendCandidateMail(Int32) 异常堆栈跟踪:在 Pages_ExerciseDetails.SendCandidateMail(Int32 intEmailType) 在 Pages_ExerciseDetails.ibtnSend_Click(Object sender, EventArgs e)字符串异常:System.Threading.ThreadAbortException:线程被中止。在 Pages_ExerciseDetails.SendCandidateMail(Int32 intEmailType) 在 Pages_ExerciseDetails.ibtnSend_Click(对象发件人,EventArgs e)
还
2017 年 1 月 22 日下午 3:23:04 ==> 异常消息:请求超时。2017 年 10 月 22 日下午 3:23:04 ==> 异常源:异常目标站点:异常堆栈跟踪:字符串异常:System.Web.HttpException:请求超时。
然后
2017 年 10 月 22 日下午 3:31:35 ==> 异常消息:引发了“System.Exception”类型的异常。2017 年 1 月 22 日下午 3:31:35 ==> 异常源:App_Web_kxc2lbj5 异常目标站点:Void SendCandidateMail(Int32) 异常堆栈跟踪:在 Pages_ExerciseDetails.SendCandidateMail(Int32 intEmailType) 字符串异常:System.Exception:类型异常'System.Exception' 被抛出。在 Pages_ExerciseDetails.SendCandidateMail(Int32 intEmailType)
我发现很难解决,因为它只发生在生产中。在 QA 和 Dev 中,电子邮件使用相同的 SMTP 服务器就可以了。