使用不同的时区在特定时间安排电子邮件

时间:2014-03-24 08:22:07

标签: c# asp.net-mvc datetime timezone

根据时区,在上午11点30分向我的用户发送每日摘要电子邮件的优化方式,

向用户发送电子邮件工作正常但是在特定时间发送时区吗?

我有什么

UserProfile with timezoneid,emailid
Dynamic daily email content

目前我正在使用控制台应用程序在上午11点30分发送,

但如何在多个时区处理?有谁可以帮我解决?

1 个答案:

答案 0 :(得分:3)

我通过作为计划任务运行的控制台应用程序实现了此类功能,该计划任务每​​隔X分钟轮询一次数据库,以查看是否需要发送任何电子邮件。

我假设UserProfile是一个包含用户列表的数据库表。

为了达到这个目的,我会在这个表中添加一个额外的列来存储最后发送的日期/时间。这是必要的,因为当您开始按时区发送时,您显然无法在每天的同一时间发送所有电子邮件,并且需要跟踪已发送的电子邮件或需要发送的电子邮件。

由于这种类型的任务的性质,如果由于某种原因它失败或由于某种原因没有运行,你可能需要“赶上”即发送任何错过的电子邮件(尽管这可能不是一个要求你也可以通过检查最后发送的列来实现。

假设您想在当地时间上午11:30(或接近)向每位用户发送电子邮件,以下代码应该有效:

IList<UserProfile> users = // Load user profile from database

foreach(UserProfile user in user){

    // Work out this users local time by converting UTC to their local TimeZone
    DateTime localDateTime = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, user.TimeZoneId);

    if(user.LastSent.HasValue && user.LastSent.Value.Date == localDateTime.Date){
       // Already sent an email today
       continue;
    }

    if(localDateTime.Hour >= 11 && localDateTime.Minute >= 30){
       // After 11:30am so send email (this could be much later than 11:30 depending on other factors)
       if(SendEmail(user.EmailId)){
           // Update last sent that must be in local time
           user.LastSent = Converter.ToLocalTime(DateTime.UtcNow, user.TimeZoneId);

           // Save User entity
           // UserPersistence.Save(user);
       }

    }

}

现在作为警告,上面的代码将在11:30到达时发送电子邮件提示代码正在运行并且取决于用户数量/发送每封电子邮件的延迟等。如果您有预定的任务正在运行每隔5分钟,显然准确度将达到最接近的5分钟,所以直到上午11点35分才能发送。如果您想要更高的准确性,可以更频繁地运行计划任务。另一个考虑因素是,如果您在同一时区拥有30000个用户,则发送该数量的电子邮件的延迟自然意味着并非所有用户都可以在上午11:30准时发送。

那说上面的代码应该让你开始正确的方向。