Персонализированная массовая рассылка программно без тайм-аута - PullRequest
0 голосов
/ 06 августа 2009

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

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

Не обращая внимания на время программирования, каков наименьший ручной способ сделать это в (предпочтительно) PHP? (Я пишу сценарий (и), но не обязательно тот, кто в конечном итоге «нажимает кнопку», чтобы отправить его.) Идеальным результатом является то, что отправителю нужно только набрать одну команду для запуска сценария (с предоставлением электронного письма). список) и все письма будут отправлены без вмешательства пользователя. Это означает, что я стараюсь избегать таких вещей, как настройка заданий cron для повторного запуска сценария, пока список рассылки не будет исчерпан.

Когда это было сделано до того, как год назад, я написал PHP-скрипт, который просто читает в строке списка электронной почты строку за строкой, обрабатывая имя пользователя, адрес электронной почты и код языка, и строит из этого желаемый текст электронной почты перед его передачей PHPMailer отправлять индивидуально. У меня была проблема с тайм-аутом сценария, и я не знал, где он находится, чтобы я мог урезать список адресов электронной почты в нужном месте, чтобы начать снова. В итоге я вручную разделил список из 1 почтового ящика на несколько подсписков, которые были достаточно короткими, чтобы время ожидания сценария не истекло. Как мне избежать тайм-аута или отслеживать, где находится сценарий по адресу электронной почты, чтобы его можно было перезапустить вручную, и никто не отправлял электронные письма более одного раза?

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

Ответы [ 3 ]

2 голосов
/ 06 августа 2009

Вам необходимо прочитать о функции set_time_limit и, возможно, ini_set ('memory_limit', xxMB ') для памяти;

Вы можете запустить скрипт php cli из вашего веб-процесса, который разветвляется ( pcntl_fork ), а затем убивает родителя (родительский процесс cli завершается). Поток веб-сервера, на котором выполняется скрипт, может затем продолжить работу с другим кодом или завершить работу.

Теперь дочерний процесс cli (A) может разветвляться (и становиться родительским) и отслеживать дочерний процесс (B), который отправляет электронные письма. Если дочерний элемент B умирает, то теперь родительский процесс A может снова разветвляться, и новый дочерний процесс продолжается там, где предыдущий остановился.

Вы должны отслеживать, кому вы отправляли электронную почту в файле / db / shared memory или через парные сокеты ( socket_create_pair ) с родительским процессом.

Надеюсь, вы поняли идею.

1 голос
/ 06 августа 2009

Вы сказали, что нет сценариев Cron - у вас нет доступа к Cron на вашем сервере? Или вы не хотите настраивать задание Cron вручную каждый раз, когда нужно отправить почтовое задание?

Возможно, вы захотите взглянуть на http://pear.php.net/package/Mail_Queue - это то, что я недавно использовал. Вы можете сделать так, чтобы ваш вызываемый пользователем скрипт сбрасывал все электронные письма сразу в почтовую очередь. Это намного быстрее, чем отправка электронных писем на лету, поскольку вам не придется иметь дело со связью между серверами, а только с вашей базой данных.

Затем у вас есть сценарий Cron, который каждые несколько минут вызывает команду Mail_Queue :: sendMailsInQueue с ограничением на количество сообщений, отправляемых ею за вызов Cron. Вам не придется связываться со сценарием Cron, если это ваша проблема - если очередь пуста, она просто выйдет. После этого ваша электронная почта будет поступать с сервера разумными темпами за звонок. Это предотвратит тайм-ауты из-за ограничения количества электронных писем на вызов cron. Это также поможет избежать проблем с другими почтовыми серверами, которые, возможно, не будут рады внезапному получению большого количества писем от вас сразу.

1 голос
/ 06 августа 2009

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

Например, вы можете использовать PHP system () для другого скрипта (Perl? Python?), Который читает информацию о задании из базы данных, а затем переключается в фоновый режим, чтобы выполнить свою работу.

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