2010-04-05 3 views
5

У меня 80 000 пользователей на моем сайте, и я недавно отвернулся от скрипта форума, который я использовал и создал что-то очень простое, что работает так же хорошо (скрипт форума тоже раздутый и ресурсоемкий для моего простого сайта)Отправляйте массовые электронные письма с PHP

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

Так что я ищу сценарий, чтобы сделать это сам. После осмотра (включая вопросы здесь) я решил, что использование Swift Mailer будет хорошей идеей.

Однако я прошел через всю документацию и не вижу, как отправить «100 за раз», и я не уверен, как это сделать.

Проще говоря. У меня есть панель администратора с формой с двумя входами «subject» и «message». Когда я нажимаю submit, что является самым безопасным способом для меня отправлять 80 000 писем без сбоев на моем сервере или помечены как спам?

Я нахожусь на довольно многообещающем выделенном сервере, поэтому не имею проблем, связанных с общими серверами.

Заранее благодарим за любые советы!

ответ

1

Безопасный вариант - отправлять электронные письма один за другим. Обычно я отправляю не более 10 сообщений электронной почты за 10 минут. Простой сценарий, запущенный cron, - это все, что вам нужно.

Отправка много писем сразу это одно, но у них все поставлено и передается на серверы фильтров diffrent вещь ...

+0

Я понимаю, что работа cron - это хороший способ сделать это. Но я не хочу делать это каждый день в 3 часа дня. Я хочу иметь возможность зайти в бэкэнд, написать письмо и нажать «Отправить». Есть ли способ создать одно задание cron в php? (хотя я думаю, что это не подходит под термином «работа cron») – Rob

+1

Cron можно использовать разными способами. Например, у вас может быть простая модель (одна таблица в базе данных), называемая: emailsToSend (вид простого буфера). Поля в базе данных для таких моделей, как: id, email_id, created_at, отправлены. Каждая запись в emailsToSend - это событие: «отправка электронной почты». Вы устанавливаете cron для запуска своего скрипта каждые 5 минут. Сценарий: 1. проверяет, имеются ли записи (отправления электронной почты). 2 . Забирает последние 10 или их (по дате создания), 3. Отправьте их и отметьте tham как отправьте (простой булевский флаг для этого) 4. Конец Сценарий уволен cron, поэтому вам не придется делать это от browswer ... – smentek

0

класс как Swiftmailer имеет опции, чтобы сделать массовую электронную почту.

+0

Как я уже сказал, я уже использую Swift Mailer. Однако из того, что я могу сказать, добавлю ли я 80 000 человек через ОЦК, он просто собирается пройти через 80 000 человек. Я действительно не хочу уходить мой браузер открыт, пока он это делает. Вероятно, это также приведет к таймауту сервера. Так что мне нужно ano тем более. Если Swift Mailer может это сделать, я не смог найти его в документации. – Rob

+0

В обычной ситуации вы используете задание cron на своем сервере, которое запускает ваш скрипт. – Klaaz

0

Вот моя идея ... Предполагая, что вы размещены в коробке типа linux. Это, конечно, на минимальном уровне, не зная вашего кода. Создайте файл на сервере под названием sendmails.php

<? 
loop through email addresses however you do it 
{ 
usleep(250000); // sleep for quarter of a second 
mail('[email protected]', 'My Subject', 'message'); 
} 
?> 

сохранить его, а затем в другом файле startemails.php вы можете открыть в вашем браузере

<? 
system("&php sendmails.php"); 
?> 

Даже если сервер времени ожидания, система звонок должен завершить свою работу. 80 000 электронных писем должны отправлять более 6 часов с использованием этого метода. Измените время, когда вы занимаете больше времени.

+0

Вы также можете изменить его, чтобы отправить X количество писем, а затем ждать X количества времени, прежде чем делать следующую партию. – SethCoder

0

Вместо Cron вам понадобится процесс демона для этого, и Swiftmailer не может легко сделать это. Проблема заключается в следующем: у вас может быть триггер Cronjob Swiftmailer позволяет говорить каждые 5 минут, но что произойдет, если он еще не закончил отправлять 10000 писем? он, вероятно, запустит другой процесс, так что вы, возможно, получите множество процессов, пытающихся отправить те же файлы в очередь.

Я использую обходной путь и создал простой PHP-демон (скрипт bash тоже будет работать нормально), который постоянно проверяет, есть ли в очереди электронные письма; если это так, он запускает Swiftmailer и отправляет 1 электронное письмо. (установите предел swiftmailer равным 1). Затем daemonscript ждет 0,5 секунды и снова проверяет.

Swiftmailer может обрабатывать несколько очередей при необходимости (вам нужно будет запустить второй процесс деамонов для каждой очереди).

К сожалению, у Swiftmailer нет папки «send /», поэтому, как только они отправляются, они исчезли.Поэтому в случае возникновения ошибки вы не можете просто переместить файлы из «send /» обратно в очередь для повторной отправки.

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