我已经浏览了本网站的一些答案,特别是日期自动发送邮件。
我正在使用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()
{
}
答案 0 :(得分:0)
这里有很多可能是错误的东西。我发现的是:
您运行的SQL语句看起来很奇怪。您传入两个参数,但它们都没有在语句中使用。您将日期转换为varchars。您通常希望在距离当前日期和时间一小时的范围内检查数据库中的日期。
这样的事情会更有意义:
SELECT * FROM appointments WHERE startdate BETWEEN @i1 AND @i2
您可以将@ i1设置为DateTime.Now
,将@ i2设置为DateTime.Now.AddHours(1)
。
跟踪您已经通知的约会可能是一个好主意。否则你会有一些非常烦恼的客户。
在Windows服务中,OnStart
方法仅在服务启动时运行。为了使其工作,您必须定期重新启动该服务。
要使服务按预期工作,您必须add a timer to the service,这将在给定的时间间隔内触发对包含您当前在OnStart
metod中的代码的方法的调用。一种更简单的方法是使用电子邮件发送代码创建一个控制台应用程序,并使用计划任务定期运行它。
答案 1 :(得分:0)
第一个选项:你可以在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(更复杂)。
答案 2 :(得分:0)
您可以尝试此方法。我不确定,但它在我的项目中起作用。
public void SendOneDayAgoEmail(TimeSpan tsDiff) { Thread.sleep代码(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
}