按照之前aps.net通过Message和SMTPClient邮件发送的代码进行了扩展,在asp,net 进程内Application_Start设置定时器Timer去实现自动定时发送邮件,具体的代码及做法如下:
下面的代码是从网上摘录的,我的代码也是参照来实现的,基本上一致
protected void Application_Start(object sender, EventArgs e)
{
Timer t = new Timer(60000);//设计时间间隔,如果一个小时执行一次就改为3600000 ,这里一分钟调用一次
t.Elapsed += new ElapsedEventHandler(t_Elapsed);
t.AutoReset = true;
t.Enabled = true;
}
private void t_Elapsed(object sender, ElapsedEventArgs e)
{
MailMessage message = new MailMessage();
message.From = Messagefrom;
message.To.Add(MessageTo); //收件人邮箱地址可以是多个以实现群发
message.Subject = MessageSubject;
message.Body = MessageBody;
message.IsBodyHtml = true; //是否为html格式
message.Priority = MailPriority.High; //发送邮件的优先等级
SmtpClient sc = new SmtpClient();
sc.Host = "smtp.sina.com"; //指定发送邮件的服务器地址或IP
sc.Port = 25; //指定发送邮件端口
//sc.UseDefaultCredentials = true;
//sc.EnableSsl = true;
sc.Credentials = new System.Net.NetworkCredential(“**@**”, "密码"); //指定登录服务器的用户名和密码
sc.Send(message); //发送邮件
}
我自己测试了一下,基本上没有发现什么问题。但是后来我考虑了一下,由于设置Timer interval为60000(一分钟),也就是每隔1分钟执行一次t_Elapsed函数,由于我设定的是每天早上8:00发送,我按照DateTime中的hour和minute相等来判断,这里存在一个问题,如果当函数不执行的时候正好处在8:00时,那么就会出现跳过判断条件的问题,从网上查了一下,简单的解决方法是设定范围比如说当判断为7:59 - 8:01时作为判断条件,虽然可以解决漏掉的问题,但是有时候会存在发送2次的情况。解决这个问题的最好方式我还没有想好解决的方案,目前只能依托于几率较小,先这样使用。同时由于进程存在生命周期,会出现application_end函数执行,这里为了解决这个问题,我使用了通过设定固定URL,通过访问自动返回内容流来实现application结束后重新启动