如何在.NET / Sql Server中在用户本地时间发送电子邮件?

如何在.NET / Sql Server中在用户本地时间发送电子邮件?

How to send out email at a user's local time in .NET / Sql Server?

我正在编写一个程序,该程序每小时需要每小时发送一次电子邮件,但要在用户本地时间进行。

说我在不同时区有2个用户。约翰在纽约,弗雷德在洛杉矶。服务器在芝加哥。如果我想在本地用户下午6点发送电子邮件,则必须在服务器时间晚上7点发送给John,在服务器时间下午4点发送给Fred。

.NET / SQL Server中有什么好的方法?我已经找到了包含所有时区信息的xml文件,因此我正在考虑编写脚本以将其导入数据库,然后对其进行查询。

编辑:我使用了一个?t4znet.dlla ??并在.NET端进行了所有比较。


您可以通过这篇出色的文章"世界时钟和TimeZoneInformation类"来补充您的解决方案,我制作了一个Web服务,该文件发送了包含本地时间和接收器时间的信息的文件,我所做的就是修改此类,以便完全按照我的需要处理了这个问题,效果很好。

我认为您可以参加此类并从"用户"表中获取他们的时区并"计算"适当的时间,我的代码如下:

1
2
3
4
5
6
7
8
9
10
//GET correct destination TIME
DateTime thedate = DateTime.Now;

string destinationtimezone = NULL;

//LOAD the TIME zone WHERE the file IS going
TimeZoneInformation tzi = TimeZoneInformation.FromName(this.m_destinationtimezone);

//Calculate
destinationtimezone = tzi.FromUniversalTime(thedate.ToUniversalTime()).ToString();

此类在Windows Vista中存在一个问题,该问题导致" FromIndex(int index)"函数崩溃,但是您可以修改代码,而不必使用该函数:

1
2
3
4
5
6
7
8
9
10
11
12
    public static TimeZoneInformation FromIndex(INT INDEX)
    {
        TimeZoneInformation[] zones = EnumZones();

        FOR (INT i = 0; i < zones.Length; ++i)
        {
            IF (zones[i].Index == INDEX)
                RETURN zones[i];
        }

        throw NEW ArgumentOutOfRangeException("index", INDEX,"Unknown time zone index");
    }

您可以将其更改为;

1
2
3
4
5
6
7
8
9
10
11
12
    public static TimeZoneInformation FromName(string name)
    {
        TimeZoneInformation[] zones = EnumZones();

        foreach (TimeZoneInformation tzi IN zones)
        {
            IF (tzi.DisplayName.Equals(name))
                RETURN tzi;
        }

        throw NEW ArgumentOutOfRangeException("name", name,"Unknown time zone name");
    }

您有两个选择:

  • 将调整后的邮件操作时间存储到每个用户的数据库中。然后只需将服务器时间与存储的时间进行比较即可。为避免混淆和可移植性问题,我将所有时间都存储在UTC中。因此,在SERVER_UTC_TIME()== storedUtcTime时发送邮件。
  • 将每个邮件操作的本地时间存储到数据库中,然后即时进行转换。当SERVER_UTC_TIME()== TO_UTC_TIME(storedLocalTime,userTimeZone)时发送邮件。

您应该确定最适合您的应用的内容。例如,如果所有用户的邮寄时间始终相同,则选择选项(2)会更有意义。如果事件时间可以在用户之间甚至每个用户之间变化,那么如果您选择选项(1),则可以使开发和调试更加容易。无论哪种方式,您都需要知道用户的时区。

*这些函数调用显然是伪的,因为我不知道它们在T-SQL中的调用,但是它们应该存在。


我是PHP开发人员,所以我将分享我从PHP中学到的知识。我确定.NET将包含类似内容。

在PHP中,您可以获取服务器时间的时区差异-如您所建议的,请在服务器上的不同时间发送电子邮件。

每次添加用户时,请保存其与服务器时间(或服务器时区更改时的时区)的时间偏差。

然后,当您指定更新时,有一个自动任务(LAMP人员为Cron),该任务每小时运行一次,以查看是否需要发送电子邮件。执行此操作,直到没有电子邮件要发送为止。


推荐阅读