Отправка периодической почты в соответствии с настройками пользователя в ASP.net? - PullRequest
4 голосов
/ 25 декабря 2009

В моем веб-приложении я хочу отправлять почту для пользователей в соответствии с заранее выбранными периодами.
Например: 1 Почта HTML за 3 дня для пользователя 01 и 1 HTML Почта за 20 дней пользователю 02

как я могу это сделать? какие-нибудь ресурсы? Я могу отправлять почту с помощью своего приложения из моей учетной записи Gmail на любые почтовые адреса в моих таблицах, но я не знаю, как отправить их автоматически в течение определенного периода времени (я использую C # и SQL Express)
Помоги мне!

Ответы [ 5 ]

5 голосов
/ 27 декабря 2009

Я нашел решение.
По моему запросу у нас есть 3 способа справиться с этим:

  1. работа с SQL Server для отправки почтовых уведомлений в определенные периоды времени. (или this )
  2. с использованием службы Windows и создания Timer объекта и проверки времени с ним.

но в способах 1 и 2 мы должны получить доступ к серверу, и нам нужен выделенный хост-сервер, например, для установки на нем WinService. поэтому он не работает в общем пространстве хоста, которое мы обычно используем. Итак, я нашел лучший способ, как вы видите:

3. Моделирование служб Windows с использованием кэширования ASP.NET для запланированных заданий.

ссылка выше - потрясающее решение. Поэтому нет необходимости работать вне нашего веб-приложения.

3 голосов
/ 28 декабря 2009

Hai,

Взгляните на quartz.net

Quartz.NET - это полнофункциональная система планирования заданий с открытым исходным кодом , которую можно использовать от самых маленьких приложений до крупномасштабных корпоративных систем.

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

3 голосов
/ 25 декабря 2009

Вам понадобится что-то, что может периодически запускать задания для вас, например демон cron или планировщик задач Windows.

По сути, у вас есть периодическая работа, и вы можете выполнять любую необходимую обработку почты.

Вы также можете сделать это из кода, если вы можете создать службу Windows, которая будет в основном спать, пока не будет отправлена ​​следующая партия писем.

Самое простое - написать планировщик задач или задание cron для периодического запуска. Таким образом, вам просто нужен небольшой фрагмент кода для обработки части отправки почты, а затем вы просто планируете запускать ее раз в час или в день, или что угодно.

2 голосов
/ 26 декабря 2009

Отличительной особенностью ASP.NET, размещенной в IIS, является то, что IIS будет (по умолчанию) периодически перезагружать пул приложений в соответствии с настройками самого пула приложений.

Когда ваш пул приложений запускается (что может происходить не реже одного раза в день, особенно если ему разрешено бездействовать, т. Е. Бизнес-приложение с большей активностью 9-5), запускается обработчик событий Application_Start в Global.asax. Это может быть использовано для повторяющейся задачи.

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

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

2 голосов
/ 25 декабря 2009

я думаю, что есть решение:

1 - вам нужно добавить 2 столбца в пользовательской таблице в вашей sql db, если у вас есть пользовательская таблица, и в первом столбце добавить дату последнего отправленного электронного письмапользователю, а во втором столбце есть период для отправки электронного письма этому пользователю, например: LastEmailSentDate datetime SendEmailPeriod int

2 - в коде вашего приложения напишите функцию, которая сравнивает последнюю дату последнего отправленного электронного письма спериод отправки письма.

// здесь код функции

public void CompareLastSentDate()
{
   // lets assume that you bring the data for the db using Sqdatareader reader
   //get the field from the LastEmailSentDate field in the  database as i mention before
   DateTime LastEmailSentDate = Convert.ToDate(reader["DatePeriod"]) 

   // get the field from the SendEmailPeriod of the user field from database
   int sendEmailPeriod =  Convert.Toint32(reader["SendEmailPeriod"]) 

   // now you have the date before the period of day ex: before 3 days depend on user
   DateTime DatePeriod = new DateTime(DateTime.Now.Year, DateTime.Now.Month, (DateTime.Now.Day - sendEmailPeriod ));

   // if the last email send is before period of day that mean u have to send an email again
   if(LastEmailSentDate.Day <= DatePeriod.Day)
   {
      // sent the email to the user
   }

}

примечание: теперь вы можете зацикливаться среди пользователей и отправлять письма

вы можетевызывайте эту функцию один раз в день, вызывая ее из события Page_Load домашней страницы вашего приложения, и после первого вызова дня добавьте флаг приложения ["LastFunctionCallDate"] = DateTime.Now, чтобы в следующем вы могли проверить этот флаг, если его == сегодня, а если нет, позвоните еще раз

...