1

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

我正在使用 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()
    {
    }
4

3 回答 3

0

你可以试试这个方法。我不确定,但它在我的项目中起作用。

公共无效 SendOneDayAgoEmail(TimeSpan tsDiff) { Thread.Sleep(tsDiff); 发邮件();

    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
}
于 2014-08-20T10:31:12.190 回答
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(更复杂)。

于 2013-08-18T09:32:52.187 回答
0

有很多事情可能是这里的错误。我已经确定的是:

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

这样的事情会更有意义:

SELECT * FROM appointments WHERE startdate BETWEEN @i1 AND @i2

您将@i1 设置为DateTime.Now并将@i2 设置为DateTime.Now.AddHours(1).

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

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

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

于 2013-08-18T09:22:41.720 回答