在asp.net预约前一小时自动发送电子邮件
本文关键字:电子邮件 一小时 asp net | 更新日期: 2023-09-27 18:27:57
我已经在这个网站上浏览了一些关于在特定日期自动发送邮件的答案。
我使用的是vs 2010,我创建了一个没有托管的项目。
我已经为约会创建了一个表,其中包含电子邮件id、开始日期和开始时间。
邮件应在预约前一小时自动发送到此人的电子邮件id。
我该怎么做?
我试过使用窗口服务,但对我不起作用。
protected override void OnStart(string[] args)
{
string dateonly = DateTime.Now.ToString("yyyy-MM-dd");
string timeonly = DateTime.Now.ToString("HH:mm tt");
string source = "Data Source=localhost;Initial Catalog=PRO;Integrated Security=SSPI;";
SqlConnection con = new SqlConnection(source);
con.Open();
SqlCommand cmd = new SqlCommand("select * from Appointments where CONVERT(varchar(10),StartDate,101)=CONVERT(varchar(10),GETDATE(),101)", con);
cmd.Parameters.AddWithValue("@date", dateonly);
cmd.Parameters.AddWithValue("@time", timeonly);
cmd.ExecuteNonQuery();
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(ds); //Filling table with user data
SmtpClient client = new SmtpClient();
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
client.Host = "smtp.gmail.com";
client.Port = 587; //Google mail port
System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("email", "password");
client.UseDefaultCredentials = false;
client.Credentials = credentials;
for each (Data Row Dr in ds.Tables[0].Rows)
{
MailMessage mm = new MailMessage();
mm.To.Add(dr["Email"].ToString());
mm.From = new MailAddress("email");
mm.Subject = "Sending Auto Mail ";
mm.Body = "This email has been send automatically through Windows Service to remind you about your Appointment in next one hour ";
client.Send(mm);
mm.Dispose();
}
}
protected override void OnStop()
{
}
第一个选项:您可以在OnStart方法中放入while循环,该循环将休眠1分钟,它将从数据库中检查约会并发送电子邮件,类似于:
while (true)
{
Thread.Slee(60 * 1000); // 60 seconds
// here put your code to get appointments and send emails
}
第二个选项:您可以使用调度程序在指定时间发送电子邮件,但仍需要检查数据库中的新约会并将其添加到调度程序中。您可以查看FluentScheduler(更简单、更流畅的API)或Quartz.net(更复杂)。
这里有很多错误。我确定的是:
您运行的SQL语句看起来很奇怪。您传入了两个参数,但这两个参数都没有在语句中使用。您可以将日期转换为varchars。您通常希望检查数据库中距离当前日期和时间一小时的日期。
这样做更有意义:
SELECT * FROM appointments WHERE startdate BETWEEN @i1 AND @i2
其中,将@i1设置为DateTime.Now
,将@i2设置为DateTime.Now.AddHours(1)
。
跟踪你已经通知的约会可能是个好主意。否则你会有一些非常恼火的顾客。
在Windows服务中,OnStart
方法仅在服务启动时运行。为了使此功能正常工作,您必须定期重新启动服务。
为了使服务按预期工作,您必须向服务添加一个计时器,这将在给定的时间间隔触发对方法的调用,该方法包含您当前在OnStart
metod中的代码。一种更简单的方法是使用电子邮件发送代码创建一个控制台应用程序,并使用计划任务定期运行它。
您可以尝试这种方法。我不确定,但这是我项目中的工作。
public void SendOneDayAgoEmail(TimeSpan-tsDiff){线程.睡眠(tsDiff);sendmail();
TimeSpan ts10 = new TimeSpan(10, 0, 0);//10
Thread othread = new Thread(() => SendEmailThatDay(ts10));
othread.IsBackground = true;
othread.Start();
}
public void SendEmailThatDay(TimeSpan tsDiff)
{
Thread.Sleep(tsDiff);
sendmail();
}
==================================否则也使用此方法
System.Threading.Thread tre = new System.Threading.Thread(new ThreadStart(MyFunction));
tre.Start();
System.Threading.Thread.Sleep(10000);
if (tre.IsAlive)
tre.Abort();
//The you have your function
void MyFunction()
{
//Do process
}