كيفية إرسال البريد الإلكتروني في التوقيت المحلي للمستخدم في .NET / Sql Server؟

StackOverflow https://stackoverflow.com/questions/22319

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أكتب برنامجًا يحتاج إلى إرسال بريد إلكتروني كل ساعة على مدار الساعة، ولكن في الوقت المحلي للمستخدم.

لنفترض أن لدي مستخدمين في مناطق زمنية مختلفة.جون في نيويورك وفريد ​​في لوس أنجلوس.الخادم موجود في شيكاغو.إذا كنت أرغب في إرسال بريد إلكتروني في الساعة 6 مساءً بالتوقيت المحلي لكل مستخدم، فيجب أن أرسل البريد الإلكتروني إلى جون في الساعة 7 مساءً بتوقيت الخادم وفريد ​​في الساعة 4 مساءً بتوقيت الخادم.

ما هو النهج الجيد لذلك في .NET/Sql Server؟لقد عثرت على ملف xml يحتوي على جميع معلومات المنطقة الزمنية، لذا أفكر في كتابة برنامج نصي لاستيراده إلى قاعدة البيانات، ثم الاستعلام عنه.

يحرر: لقد استخدمت "t4znet.dll" وقمت بجميع المقارنات على جانب .NET.

هل كانت مفيدة؟

المحلول

لديك خياران:

  • قم بتخزين الوقت المعدل لإجراء البريد في قاعدة البيانات لكل مستخدم.ثم قم فقط بمقارنة وقت الخادم بالوقت المخزن.لتجنب مشاكل الارتباك وقابلية النقل، سأقوم بتخزين جميع الأوقات بالتوقيت العالمي المنسق (UTC).لذا، قم بإرسال البريد عندما يكون SERVER_UTC_TIME() ==storeUtcTime.
  • قم بتخزين التوقيت المحلي لكل إجراء بريد في قاعدة البيانات، ثم قم بالتحويل بسرعة.أرسل البريد عندما يكون SERVER_UTC_TIME() == TO_UTC_TIME(storedLocalTime, userTimeZone).

يجب عليك أن تقرر ما هو الأكثر منطقية لتطبيقك.على سبيل المثال، إذا كان وقت إرسال البريد هو نفسه دائمًا لجميع المستخدمين، فمن المنطقي الانتقال إلى الخيار (2).إذا كان من الممكن أن تتغير أوقات الأحداث بين المستخدمين وحتى لكل مستخدم، فقد يجعل التطوير والتصحيح أسهل إذا اخترت الخيار (1).وفي كلتا الحالتين سوف تحتاج إلى معرفة المنطقة الزمنية للمستخدم.

* من الواضح أن استدعاءات الوظائف هذه زائفة، لأنني لا أعرف استدعاءاتها في T-SQL، ولكن يجب أن تكون موجودة.

نصائح أخرى

أنا مطور PHP لذا سأشارك ما أعرفه من PHP.أنا متأكد من أن .NET سيتضمن شيئًا مشابهًا.

في PHP، يمكنك الحصول على اختلافات المنطقة الزمنية لوقت الخادم - كما اقترحت عليك إرسال رسائل البريد الإلكتروني في أوقات مختلفة على الخادم.

في كل مرة تقوم فيها بإضافة مستخدم، احفظ إزاحة وقته من وقت الخادم (أو المنطقة الزمنية الخاصة به في حالة تغير المنطقة الزمنية للخادم).

بعد ذلك، عند تحديد تحديث، يكون لديك مهمة تلقائية (Cron لأشخاص LAMP) يتم تشغيلها كل ساعة للتحقق مما إذا كان يلزم إرسال بريد إلكتروني.قم بذلك حتى لا يتبقى أي رسائل بريد إلكتروني لإرسالها.

يمكنك استكمال الحل الخاص بك بهذه المقالة الممتازة "الساعة العالمية وفئة TimeZoneInformation"، لقد قمت بإنشاء خدمة ويب أرسلت ملفًا يحتوي على معلومات تتضمن الوقت المحلي ووقت الاستقبال، وما فعلته هو تعديل هذه الفئة حتى أتمكن من التعامل مع هذه المشكلة وعملت بشكل مثالي، تمامًا كما أحتاج.

أعتقد أنه يمكنك الالتحاق بهذا الفصل والحصول على المنطقة الزمنية الخاصة بهم من جدول "المستخدمين" و"حساب" الوقت المناسب، وكان الكود الخاص بي على هذا النحو؛

//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)" ولكن يمكنك تعديل التعليمات البرمجية، بدلاً من استخدام الوظيفة:

    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");
    }

يمكنك تغييره إلى؛

    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");
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top