запланированные электронные письма в asp.net с c # - какое событие или какое место в коде позади - PullRequest
2 голосов
/ 11 октября 2011

Я хочу отправлять запланированные электронные письма всем моим пользователям в определенное время каждый день!
какое событие или какое место я должен использовать для отправки их в коде позади?
мои страницы основаны на главной и содержательной страницах!
я должен использовать page_Load главной страницы или страницы контента (Default.aspx) / или я должен использовать global.asax для этой цели?

спасибо заранее

Ответы [ 2 ]

3 голосов
/ 11 октября 2011

Вы должны использовать global.asax, запустить поток при запуске и использовать время для отправки писем.Остановите поток, когда приложение закроется.

Вы должны сохранить приложение живым, чтобы сохранить поток живым.Если у вас нет запросов в течение длительного времени, ваше приложение закрывается сервером iis, и вы не будете отправлять электронные письма.

что-то вроде:

    private static bool stopProcessing;
    private static object __batchProcessLock;
    private static const int sleeptime = 2500;//2.5 seconds

    protected void Application_Start(object sender, EventArgs e)
    {
        Thread BatchThread = new Thread(Start);
    }

    protected void Application_End(object sender, EventArgs e)
    {
        Stop();
    }


    private static void Start()
    {
        lock (__batchProcessLock) // Be sure to run this only once in the application
        { 
            stopProcessing = false;
            while (!stopProcessing)
            {
                try
                {
                    //Do you stuff (check if it is time to send emails)
                }
                catch (Exception ex)
                {
                    //handle exception
                }
                Sleep(sleeptime); 
            }
        }
    }


    private static void Stop()
    {
        stopProcessing = true;
    }
2 голосов
/ 11 октября 2011

В зависимости от объема трафика на ваш сайт и от того, насколько точным является ваше время, должен быть другой вариант, в дополнение к предложению @ Peer - иметь некоторый код, который запускается при каждом запросе.Этот код будет проверять, когда выполнялось заданное по времени действие (проверяя базу данных или что-то в этом роде), а затем, истекло ли сегодняшнее время для отправки и еще не отправлено, тогда вы запускаете процедуру отправки.В противном случае вы продолжите как обычно.

Конечно, вы захотите создать новый поток для выполнения работы, чтобы не задерживать пользовательский запрос во время отправки электронной почты.

Недостатки этого метода в том, что он использует кого-то, кто нажимает на ваш сайт.Плюсы этого метода в том, что он может работать поздно без какого-либо специального кода.Метод использования таймеров потребует дополнительного кода при первой проверке, чтобы в основном сделать то, что сделано здесь, чтобы проверить, произошел ли сегодняшний запуск при его запуске.

Я еще раз скажу, что не думаю, что этолучший способ, но если это обязательно должно быть через веб-страницы ASP.NET, тогда это может быть вашим лучшим выбором.

Хотя, если вам разрешено иметь другой код не в ASP.NET, вы можете написать приложение, котороев нужное время перейдет на специальную страницу вашего сайта, сохраняя код таймера в приложении на вашем компьютере (или на сервере, или где-либо еще).специальная страница будет использовать какую-то защиту, чтобы гарантировать, что только вы можете получить к ней доступ (например, защита паролем или подобное), и когда вы нажимаете на страницу, она выполняет функции электронной почты.Таким образом, код электронной почты находится на ваших страницах ASP.NET, но на самом деле код планирования находится в более разумном месте.

Это, конечно, тоже не вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...