2013-08-17 29 views
0

我已經瀏覽了本網站中某些在特定日期自動發送郵件的答案。自動發送電子郵件在asp.net約會前一小時發送

我正在使用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

請分享您的嘗試代碼。 – BartoszKP

+0

我已經添加了我嘗試在windows服務中onstart()事件的代碼。 – user2691425

+0

很好,現在請解釋一下你的意思是「它沒有工作」。準確地描述發生了什麼事。例如,您是否嘗試調試代碼? – BartoszKP

回答

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方法中的代碼的方法的調用。更簡單的方法是使用電子郵件發送代碼創建控制檯應用程序,並使用計劃任務定期運行它。

0

第一選項:你可以把while循環OnStart方法將在1分鐘的睡眠,這將檢查從數據庫的約會和發送電子郵件,是這樣的:

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

第二個選項:您可以使用調度程序在指定的時間發送電子郵件,但您仍然需要檢查數據庫中的新約會並將其添加到調度程序中。你可以看看FluentScheduler(簡單流暢的API)或Quartz.net(更復雜)。

0

你可以試試這個方法。我不確定,但它是我的項目中的工作。

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