PHP, e-posta ve Cron

3 Cevap php

Benim Soruyu yeniden sorayım, ben paylaşılan bir bilgisayar üzerinde, gönderilecek e-postaları tutan bir mysql veritabanı var. Ben veritabanını okuyacak bir cron işi çalıştırmak ister ve veritabanındaki her 10 dakika kadar herhangi bir mesaj gönderdi olacaktır.

Şimdi benim soru paylaşılan ana korkutur yok ki benim veritabanı okumak ve küçük batched de e-postalar göndermek için php ile en iyi yolu, ne olduğunu.

3 Cevap

Peki ben PDO benzer bu çözüm ile geldi. Bir cron işi olarak çalışan herhangi bir beklenmedik sorunları var mı?

<?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);
?>

PDO kullanımını varsayarsak, ve şema bilmeden bazı konaklama yaparak, böyle bir şey olabilir:

$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;
}

'Prewritten için' gibi, phplist bakmak olabilir.

Ben e-posta sunucusuna azaltmayı bırakacaktı. Yani, yerel bir e-posta sunucusu çalıştırmak, ve PHP kodu olduğunu, tüm bu röle mesajları var. Sonra e-posta sunucusu kendisi sadece belli bir oranda göndermek için yapılandırın.