根据ASP.net中用户的设置发送定期邮件?

时间:2009-12-25 20:11:27

标签: c# asp.net email sendmail

在我的网络应用程序中我想根据预先选定的时间段为用户发送邮件。
例如: 1 HTML邮件每3天用户01和1 HTML邮件每20天发送给用户02

我该怎么做?任何资源?我可以通过我的应用程序从我的Gmail帐户发送邮件到我的表中的任何邮件地址,但我不知道如何在一段时间内自动发送它。(我使用C#和SQL Express)
救救我!

5 个答案:

答案 0 :(得分:4)

我找到了解决方案。根据我的搜索,我们有3种方法来处理:

  1. working with SQL Server to send mail notification in periods of time.(或this
  2. using Windows service and Creating Timer object and checking the time with it.
  3. 但是在方式1和方法2中我们应该访问服务器,我们需要专用的托管服务器,例如在其上安装WinService。所以它在我们通常使用的共享主机空间中不起作用。所以我找到了最好的方法:

    3 Simulating Windows Services Using ASP.NET Caching For Scheduled Jobs.

    上面的链接是一个了不起的解决方案。因此,我们无需在Web应用程序外工作。

答案 1 :(得分:3)

您需要能够定期为您运行作业的内容,例如cron守护程序或Windows任务调度程序。

基本上,您可以定期开始工作并执行您需要的任何邮件处理。

如果您可以创建一个基本睡眠的Windows服务,直到需要发送下一批邮件,您也可以从代码执行此操作。

最简单的方法是编写任务调度程序或cron作业以定期运行。这样你只需要一小段代码来处理邮件发送部分,然后你就可以安排它每小时或每天运行一次或任何需要的。

答案 2 :(得分:3)

查看quartz.net

Quartz.NET 是一个功能齐全的开源作业调度系统,可用于从最小的应用程序到大型企业系统。

Quartz.NET 是一个非常有道理的开源Java作业调度框架的端口,Quartz。 Quartz.NET支持开箱即用的集群和数据库持久性,并且具有使用cron表达式,间隔触发器和排除建议来调度作业的强大方法。

答案 3 :(得分:2)

我认为有一个解决方案:

1-如果您有一个用户表,则必须在sql db的user表中添加2列,并在第一列中添加上次发送给用户的电子邮件的日期,第二列具有发送期限该用户的电子邮件为ex: LastEmailSentDate日期时间 SendEmailPeriod int

2-在您的应用程序代码中编写一个函数,将上次发送的电子邮件的最后日期与发送电子邮件的时间段进行比较。

//这里是功能代码

public void CompareLastSentDate()
{
   // lets assume that you bring the data for the db using Sqdatareader reader
   //get the field from the LastEmailSentDate field in the  database as i mention before
   DateTime LastEmailSentDate = Convert.ToDate(reader["DatePeriod"]) 

   // get the field from the SendEmailPeriod of the user field from database
   int sendEmailPeriod =  Convert.Toint32(reader["SendEmailPeriod"]) 

   // now you have the date before the period of day ex: before 3 days depend on user
   DateTime DatePeriod = new DateTime(DateTime.Now.Year, DateTime.Now.Month, (DateTime.Now.Day - sendEmailPeriod ));

   // if the last email send is before period of day that mean u have to send an email again
   if(LastEmailSentDate.Day <= DatePeriod.Day)
   {
      // sent the email to the user
   }

}

注意:现在你可以在用户之间循环并发送电子邮件

你可以通过从你的应用程序主页Page_Load事件调用它来在一天内调用此函数,并在当天的第一次调用后添加一个应用程序[“LastFunctionCallDate”] = DateTime.Now标志,以便在下一步你可以检查这个标志如果今天是==,如果不再叫它

答案 4 :(得分:2)

IIS托管ASP.NET的好处是,IIS(默认情况下)会根据应用程序池本身的设置定期回收您的应用程序池。

当您的应用程序池启动时(可能每天至少一次,特别是如果它允许空闲,即大多数活动为9-5的业务应用程序),则会触发Global.asax中的Application_Start事件处理程序。这可以用于您的重复任务。

现在你不一定要在Application_Start处理程序中同步运行这个电子邮件发送,因为对我而言,这个消息传递功能似乎不是启动的核心,但无论如何都要使用这个事件处理程序作为定期执行的简单方法你的家务管理。

要发送异步,您应该使用异步委托,例如。