gpt4 book ai didi

c# - 在不同时区的特定时间安排电子邮件

转载 作者:行者123 更新时间:2023-11-30 16:12:39 45 4
gpt4 key购买 nike

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

向用户发送电子邮件工作正常,但要在特定时间使用他们的时区发送?

我有什么

UserProfile with timezoneid,emailid
Dynamic daily email content

目前我正在使用控制台应用程序在世界标准时间上午 11 点 30 分发送,

但是如何在多个时区处理?有人可以帮我吗?

最佳答案

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

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

为了实现这一点,我将向该表中添加一个附加列来存储上次发送的日期/时间。这是必要的,因为当您开始按时区发送时,您显然不能每天在同一时间发送所有电子邮件,并且需要跟踪哪些已发送或哪些需要发送。

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

假设您想在本地时间上午 11:30(或接近上午 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 准时发送。

那是说上面的代码应该让您朝着正确的方向开始。

关于c# - 在不同时区的特定时间安排电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22604209/

45 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com