Как отправить письмо всем пользователям в php? - PullRequest
2 голосов
/ 10 июня 2009

Допустим, у меня есть 1000 подписчиков в базе данных mysql. Если я хочу отправить электронное письмо всем пользователям, что мне делать?

EDIT:

Что такое (все говорят) cron рабочие места? Можете привести пример?

Ответы [ 10 ]

5 голосов
/ 10 июня 2009

Я бы предложил создать таблицу базы данных со всеми электронными письмами, которые необходимо отправить. Это можно сделать довольно быстро. После этого настройте задание cron, которое берет верхнюю строку, отправляет ее по электронной почте и удаляет строку. Таким образом, вы можете распараллелить домашнюю работу, и пользователю не нужно ждать отправки электронных писем, прежде чем загрузится их страница ответов.

2 голосов
/ 10 июня 2009

Используйте комбинацию цикла for и функции почты, например:

$rs = mysql_query('SELECT email from emailList LIMIT 0, 10');

while(list($email) = mysql_fetch_row($rs))
{
  // Send Email
  mail($email, 'Your Subject', 'Your Message');
}

Но, как все говорят, не запускай все это за один раз. Я серьезно сомневаюсь, что любой сервер справится с нагрузкой по 1000 запросов по электронной почте. Запустите задание cron, которое будет выполняться так, что ваш код при каждом запуске извлекает, скажем, 30-50 писем и отправляет их.

1 голос
/ 10 июня 2009

Вы также можете попробовать использовать PHP List .

Установите список PHP, экспортируйте свою базу данных адресов электронной почты и импортируйте ее в список PHP как CSV. Тогда вам не нужно беспокоиться об управлении пользователем и т. Д., И вы получите отслеживание кликов.

1 голос
/ 10 июня 2009

отсоедините код отправки почты от кода создания (как предложил Стефан Май). запишите все адреса / темы / тела в таблицу и обработайте таблицу позже.

затем запускайте cron-job только каждые x минут и отправляйте только y писем. если вы отправляете слишком много писем одновременно, вы можете быть помечены как спамер быстрее, чем вы думаете. удаляйте почтовое задание из таблицы только в случае успешной отправки.

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

используйте библиотеку типа phpmailer или swiftmailer .

1 голос
/ 10 июня 2009

Я бы предложил сделать то, что сказали все остальные, создать отдельную таблицу базы данных, содержащую сообщение, тему и адрес электронной почты. Я бы также использовал PHPMailer (http://phpmailer.codeworxtech.com/) для отправки писем по SMTP.

1 голос
/ 10 июня 2009

Лучше всего написать работу cron на выбранном вами языке, который выполняет задачу, когда сервер обычно находится в наиболее спокойном состоянии. Если вы хотите использовать PHP, все равно используйте задание cron. Не делайте этого, отвечая на запрос страницы WTF-style .

0 голосов
/ 10 июня 2009

Напишите сценарий PHP, который обрабатывает отправку почты так, как вам хочется (ответ Стефана Майя - отличный способ сделать это). Разработайте сценарий так, чтобы он регистрировал его работу и ничего не печатал во время его работы (это дает вам возможность позже находить ошибки). Предполагая, что вы работаете в Linux, вы можете настроить cron для запуска скрипта в назначенное время.

Отредактируйте свои задания cron, набрав crontab -e в терминальной сессии. Затем вы вводите что-то вроде этого (это будет запускать работу каждую ночь в полночь).

 0 * * * * wget -O - -q -t 1 http://www.example.com/mymailer.php
0 голосов
/ 10 июня 2009

Должно ли каждое письмо быть уникальным для каждого пользователя? Если нет, не отправляйте новое письмо для каждого пользователя, добавьте BCC (слепая копия) к одному письму. Это сделает ваш SMTP-сервер счастливым.

0 голосов
/ 10 июня 2009

Я бы создал таблицу со всеми пользователями, электронными письмами и статусом. Настройте 2 или 3 Cronjobs для обработки этой таблицы.

В вашем php-скрипте извлеките 30 записей из БД (лимит 30) и обработайте их с помощью цикла foreach. После каждого запуска меняйте статус «Электронная почта» или удаляйте запись из БД.

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

0 голосов
/ 10 июня 2009

Вы можете начать с установки запроса, чтобы получить каждое письмо для каждого пользователя, что-то вроде:

SELECT email FROM users;

Как только вы сохранили это в переменной, вы можете использовать комбинацию foreach () и mail () для отправки электронного письма каждому пользователю.

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