PHP, электронная почта и Cron - PullRequest
0 голосов
/ 27 мая 2009

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

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

Ответы [ 3 ]

2 голосов
/ 27 мая 2009

Предполагая использование PDO и создавая некоторые условия для незнания вашей схемы, это может выглядеть примерно так:

$dbh = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'dbuser', 'dbpass');
$msgh = $dbh->prepare('SELECT subject, body from message where listname = :listname');
$msgh->bindParam(':listname', $listname, PDO::PARAM_STR);
$msgh->execute();
$msg = $msgh->fetch(PDO::FETCH_ASSOC);

$usrh = $dbh->prepare('SELECT recipient from userlist where is_subscribed_to = :listname');
$usrh->bindParam(':listname', $listname, PDO::PARAM_STR);
$usrh->execute();
while ($recipient = $usrh->fetch(PDO::FETCH_ASSOC)) {
  mail($recipient, $msg['subject'], $msg['body']);
  if ($over_throttle) {
    sleep(THROTTLE_SLEEP_SECONDS);
    $over_throttle = 0;
  }
  ++$over_throttle;
}

Что касается «предварительно написанного», вы можете взглянуть на phplist .

1 голос
/ 27 мая 2009

Я бы оставил регулирование на почтовом сервере. Т.е., запустить почтовый сервер локально, и ваш PHP-код передает все эти сообщения на это. Затем настройте сам почтовый сервер так, чтобы он отправлялся только с определенной скоростью.

0 голосов
/ 28 мая 2009

Ну, я придумал это решение, похожее на решение PDO. Есть ли непредвиденные проблемы с запуском этого задания cron?

<?php
$con = mysql_connect("localhost","root","123456");
$throttle = 0;
$batch = 50;
$pause = 10; // seconds

if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("maildb", $con);

// Message Table
$MSGresult = mysql_query("SELECT * FROM msgs");

// User Table
$USERresult = mysql_query("SELECT * FROM members");

while($MSGrow = mysql_fetch_array($MSGresult))
  {
    while($USERrow = mysql_fetch_array($USERresult))
        {
          mail($USERrow['email'],$MSGrow['subject'],$MSGrow['body']);
          $throttle += 1;
          if ($throttle > $batch ) { sleep($pause); $throttle = 0;} 
        }
    mysql_data_seek($USERresult,0);
  }

mysql_close($con);
?> 
...