SwiftMailer Batch email times my Server out

2019-04-10 16:14发布

问题:

I realise that batchEmail is no longer part of the new SwiftMailer. So I made this script:

<?
//
// GC PRESS EMAILER v5
//
ini_set('display_errors',1);
error_reporting(E_ALL);
require_once("config.php");
include_once("hawkmail/mail/lib/swift_required.php");
$c=mysql_connect($dbh,$dbu,$dbp);
function SendEmail(){
    // DB
    $s=mysql_query("SELECT * FROM `newgc`.`press_list`");
    // Process Color Listing Loop
    while($r=mysql_fetch_array($s)){
    // ###########################
    // START LOOP
    // ###########################
        $name=$r['name'];
        $email=$r['email'];
        $to=array(''.$email.''=>''.$name.'');
        include("hawkmail/templates/press.php");
        # Email subject
        $str=$name;
        $str=substr($str, 0, strrpos($str, ' '));
        $subject='Dear '.$str.', you are invited to our Exclusive Party Collection Press Day!';
        # send message
        include("hawkmail/settings.php");       
    }
    // ###########################
    // END LOOP
    // ###########################
}
SendEmail();
?>

The database has 200 records. And I ran the script and it sends a few emails and then times out

504 Gateway Time-out

The name and email records are like

John Smith John.smith@site.com

Very plain. And my hawkmail/settings.php is this:

# mail
$smpturl="smtp.sendgrid.net";
$mailu="sitesitesite";
$mailp="sitessssssssssss";
$from=array("no-reply@site.com"=>"site.com");

# login credentials & setup Swift mailer parameters
$transport=Swift_SmtpTransport::newInstance($smpturl, 587);
$transport->setUsername($mailu);
$transport->setPassword($mailp);
$swift=Swift_Mailer::newInstance($transport);

# create a message (subject)
$message=new Swift_Message($subject);

# attach the body of the email
$message->setFrom($from);
$message->setBody($html, 'text/html');

$message->setTo($to);
$message->addPart($text, 'text/plain');

# actually send the message
if($recipients=$swift->send($message, $failures)){}else{}

Is there anyway to increase the limit of PHP time out (I use Ubuntu and Nginx) or is there an alternative to BatchMail() really don't understand why it was removed.

Can someone post examples of Batch mail scripts using the new swiftmailer?

回答1:

Sending emails is the most complicated thing to do online.

It is the second most used service and the most abused.

I built my own custom email platform for sending bulk emails.

The timeout you experience is because of the Apache and PHP execution limits.

You need to run it as a CLI application with set_time_limit (0);

php /path/to/app/script.php something like this straight in the console.

If you do not have SSH access then run it with shell_exec like this:

shell_exec("php /path/to/app/script.php > /dev/null 2>/dev/null &");

This will ensure that the script that calls it does not hang around till it finishes.