2011-02-02 3 views
3

Я разрабатываю сайт, который отправляет уведомления по электронной почте пользователям после определенных событий/действий пользователя (помеченных на фотографии, добавить в качестве друга и т.д.)Должен ли я помещать электронные письма в базу данных перед отправкой, а не на лету?

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

Мой страх, что, если я когда-либо проблем с подключением к почтовому серверу или почтовый сервер перегружен, он будет узким местом моих приложений/загрузки страницы

Так что мой вопрос, что это лучший способ отправлять письма из веб-приложения, которое отправляет электронные письма на постоянной основе?

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

Или я просто отправлю электронное письмо сразу после того, как пользователь завершит действие/событие (создание учетной записи участника, помеченного на фотографии и т. Д.)?

+0

Вы считаете, что отправляете электронное письмо из фоновой темы? – thkala

ответ

2

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

Используйте локальную отправку, чтобы избежать задержек сети. [Спецрассылки] sendmail_path =/USR/SBIN/Sendmail в php.ini

Это будет работать, даже если почтовый сервер вниз (сообщение будет поставлен в очередь).

+0

Спасибо @rvs. Я попробую это. Другие люди упомянули мне, что моя проблема была в том, что я использовал smtp для отправки почты. Однако, если нужно было настроить почтовый сервер (например, постфикс), вы не заметите задержки. – koeder

0

Да, настройте систему очередей, создав таблицу mysql, которая содержит всю необходимую информацию, и задайте задание cron для запуска каждые x минут, чтобы выбрать электронные письма из очереди и отправить их (не забудьте установить LIMIT для вашего запроса sql, который извлекает электронные письма для отправки).

0

Db-решение, которое вы уже прекрасно

Простое решение было бы отправить почту в качестве окончательного решения по сценарию (когда HTML был отправлен),

Или настроить PHP использовать менее увязли SMTP, http://email.about.com/od/emailprogrammingtips/qt/Configure_PHP_to_Use_a_Remote_SMTP_Server_for_Sending_Mail.htm

с уважением, // т

2

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

0

Как вы сказали, вы не будете отправлять электронные письма синхронно с вашими веб-запросами/ответами - это хорошая идея, так как вы не хотите, чтобы ваш пользователь блокировал что-то вроде подключения к почтовому серверу. Даже если это локальный почтовый сервер, всегда полезно сделать его асинхронным и отделить два. Другими словами, ваши письма будут перенесены в механизм очереди и отправлены async.

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

 Смежные вопросы

  • Нет связанных вопросов^_^