C# asp.net中约会前一小时自动发送电子邮件

C# asp.net中约会前一小时自动发送电子邮件,c#,asp.net,C#,Asp.net,我已经在这个网站上浏览了一些关于在特定日期自动发送邮件的答案 我正在使用VS2010,我创建了一个未托管的项目 我已经创建了一个带有电子邮件id、开始日期和开始时间的约会表 邮件应在约会前一小时自动发送至联系人的电子邮件id 我该怎么做 我尝试过使用窗口服务,但不适用于我 protected override void OnStart(string[] args) { string dateonly = DateTime.Now.ToString("yyyy-MM-dd

我已经在这个网站上浏览了一些关于在特定日期自动发送邮件的答案

我正在使用VS2010,我创建了一个未托管的项目

我已经创建了一个带有电子邮件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()
    {
    }

这里有很多可能是错误的地方。我确定的是:

运行的SQL语句看起来很奇怪。您传入了两个参数,但它们都没有在语句中使用。您可以将日期转换为varchar。通常,您希望检查数据库中的日期与当前日期和时间之间一小时的范围

这样做更有意义:

SELECT * FROM appointments WHERE startdate BETWEEN @i1 AND @i2
将@i1设置为
DateTime.Now
和@i2设置为
DateTime.Now.AddHours(1)

跟踪您已经通知的约会可能是一个好主意。否则你会有一些非常恼火的顾客

在Windows服务中,
OnStart
方法仅在服务启动时运行。为了使其工作,您必须定期重新启动服务


要使服务按预期的方式工作,这将在给定的时间间隔触发对方法的调用,该方法包含您当前在
OnStart
metod中拥有的代码。一种更简单的方法是使用电子邮件发送代码创建控制台应用程序,并使用计划任务定期运行该应用程序。

第一个选项:您可以将while-loop-in-OnStart方法设置为1分钟睡眠,这将检查数据库中的约会并发送电子邮件,类似于:

while (true)
{
    Thread.Slee(60 * 1000); // 60 seconds
    // here put your code to get appointments and send emails
}

第二个选项:您可以使用scheduler在指定时间发送电子邮件,但仍然需要检查数据库中的新约会并将其添加到scheduler。您可以查看(更简单、更流畅的API)或(更复杂的)。

您可以尝试这种方法。我不确定,但这是我的项目工作

public void SendOneDayAgoEmail(TimeSpan tsDiff) { 睡眠(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
}

请分享您尝试的代码。我已在windows服务的onstart()事件中添加了我尝试的代码。太好了,现在请解释“它不起作用”是什么意思。请准确描述,发生了什么。例如,您是否尝试调试代码?是的,我已尝试为与今天日期有约会的电子邮件ID发送邮件,并为他们的约会预订了下一个小时。是的,我知道您已尝试,您不断重复此操作。但是您尝试的结果是什么?调试代码时您看到了什么密码?
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
}