4

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

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

4

5 回答 5

5

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

  1. 使用 SQL Server 在一段时间内发送邮件通知。(或这个
  2. 使用 Windows 服务并创建Timer对象并检查时间。

但是在方式 1 和 2 中,我们应该访问服务器,并且我们需要专用的托管服务器来例如在其上安装 WinService。所以它在我们通常使用的共享主机空间中不起作用。所以我找到了你看到的最好的方法:

  3.  使用 ASP.NET 缓存计划作业模拟 Windows 服务。

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

于 2009-12-26T22:17:41.693 回答
3

您将需要可以定期为您运行作业的东西,例如 cron 守护程序或 Windows 任务调度程序。

本质上,您可以开始定期工作并进行所需的任何邮件处理。

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

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

于 2009-12-25T20:19:03.570 回答
3

海,

看看quartz.net

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

Quartz.NET是非常流行的开源 Java 作业调度框架 Quartz 的移植。Quartz.NET 支持开箱即用的集群和数据库持久性,并具有强大的方法来使用类似 cron 的表达式、间隔触发器和排除建议来安排作业。

于 2009-12-28T10:02:12.213 回答
2

我认为有一个解决方案:

1-如果您有用户表,则必须在 sql db 的用户表中添加 2 列,并在第一列中添加发送给用户的最后一封电子邮件的日期,第二列具有发送电子邮件的期限该用户例如: LastEmailSentDate datetime 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 事件调用此函数一天调用一次,并在当天的第一次调用后添加一个 application["LastFunctionCallDate"] = DateTime.Now 标志,因此接下来您可以检查此标志,如果它的 == 今天,如果不再次调用它

于 2009-12-25T20:38:35.363 回答
2

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

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

现在,您不一定要在 Application_Start 处理程序中同步运行此电子邮件发送,因为在我看来,此消息传递功能不是启动的核心,但无论如何使用此事件处理程序作为定期进行内务处理的简单方法。

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

于 2009-12-26T05:02:54.513 回答