2010-02-18 3 views
2

Каков наилучший способ/класс для отправки большого количества электронной почты html?Отправка (относительно) больших объемов электронной почты html с помощью php

(Каждая почта должна содержать информацию (из базы данных MySQL), который связан с адресом, к которому он послал)

ответ

2

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

Затем я создаю письма, удаляя обработанные записи, когда я иду, и помещаю сгенерированные письма в таблицу «исходящие».

Наконец, сценарий запускает каждые N минут, принимая M записей из таблицы «исходящие»: он отправляет почту, а затем удаляет эту почту из таблицы исходящих сообщений.

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

Отправляющий скрипт отправляет (60/N) * M почты в час, чтобы снова работать с ограничениями на сервере.

1

я использую Zend_Mail. Следующий пример (из docs) показывает, как отправить несколько писем через одно соединение SMTP:

// Create transport 
$config = array('name' => 'sender.example.com'); 
$transport = new Zend_Mail_Transport_Smtp('mail.example.com', $config); 

// Set From & Reply-To address and name for all emails to send. 
Zend_Mail::setDefaultFrom('[email protected]', 'John Doe'); 
Zend_Mail::setDefaultReplyTo('[email protected]','Jane Doe'); 

// Loop through messages 
for ($i = 0; $i < 5; $i++) { 
    $mail = new Zend_Mail(); 
    $mail->addTo('[email protected]', 'Test'); 

    $mail->setSubject(
     'Demonstration - Sending Multiple Mails per SMTP Connection' 
    ); 
    $mail->setBodyText('...Your message here...'); 
    $mail->send($transport); 
} 

// Reset defaults 
Zend_Mail::clearDefaultFrom(); 
Zend_Mail::clearDefaultReplyTo(); 

Вам просто нужно будет изменить цикл для извлечения данных из базы данных, специфичных для каждого сообщения для отправки. Кроме того, вам не понадобится весь блок, чтобы использовать Zend_Mail.

Взгляните: http://framework.zend.com/manual/en/zend.mail.multiple-emails.html

1

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

Best way to manage long-running php script?

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

<?php 
if ($_SERVER["REMOTE_ADDR"]!='127.0.0.1') { 
    die ('NO ACCESS!'); 
} 
$send_to=$_GET['email']; 
$dbh=mysql_connect(...); 
.... 

Тогда в сценарии:

.... 
$content=file('http://localhost/generate_email.php?email=' 
    . urlencode($db_row['recipient'])); 
mail($db_row['recipient'], $subject, $content); 

HTH

C.

0

Мне нравится идея Карима, хотя я бы поставил try/catch вокруг $mail->send($transport) таким образом, чтобы вы могли отслеживать, что есть и что не было отправлено, и зарегистрировать его соответствующим образом или пометить в соответствующей базе данных.

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