使用phpmailer smtp发送邮件的最快方式?

时间:2014-10-12 06:11:29

标签: php email phpmailer

我正在使用以下phpmailer功能发送1000+邮件

<?php
function sendMail($sendTo,$Subject,$Body){

    require_once 'PHPMailer/PHPMailerAutoload.php';

    $mail = new PHPMailer;
    $mail->isSMTP();                                      
    $mail->Host = 'smtp.example.com;smtp.example.com';  
    $mail->SMTPAuth = true;                               
    $mail->Username = 'newsletter@example.com';           
    $mail->Password = 'password';                         
    $mail->SMTPSecure = 'ssl';                            
    $mail->Port = 465;                                    
    $mail->From = 'newsletter@example.com';
    $mail->FromName = 'xyz';
    $mail->WordWrap = 50;                                 
    $mail->isHTML(true);                                  

    $mail->addAddress($sendTo);               
    $mail->Subject = $Subject;
    $mail->Body = ( stripslashes( $Body ) );
    $mail->AltBody = 'Please Use a Html email Client To view This Message!!';

    if(!$mail->send()) {
        $return = 'Message could not be sent.';
        // echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        $return = 'Message has been sent!';
    }
    return $return;
}

这是我用来调用函数的代码

foreach ($emails as $email) {
 $subject = "sample subject";
 $body = "sample body";
 sendMail($email, $subject, $body);
}

$ emails数组的大小是1000+ 有更快更好的方法吗?

3 个答案:

答案 0 :(得分:8)

您应该从reading the docs provided with PHPMailer开始,在那里找到this example

特别要注意的是,请确保使用SMTPKeepAlive - 您可能会发现按域排序列表可以最大限度地提高连接重用率。

正如zerkms所说,你应该提交给本地邮件服务器以获得最佳性能,但令人惊讶的是,在PHPMailer中使用mailsendmail选项并不总是比SMTP更快到本地主机,主要是因为postfix&#39 ; sendmail二进制文件打开了一个到localhost的同步SMTP连接 - postfix&#39;由于这个原因,docs建议将SMTP发送到localhost以获得最佳性能。

如果您要发送到localhost,请不要使用身份验证或加密,因为开销并没有为您带来任何好处,但如果您使用的是远程服务器,请使用端口587上的tls而不是过时ssl在465港口。

通常要避免直接向最终用户发送 - PHPMailer中的SMTP客户端有些愚蠢 - 它根本不处理排队,因此任何具有灰名单或交付延迟以进行流量控制的域都将无法交付。最好的方法是使用SMTP到附近的MTA并将队列处理留给它。您也可以从中退回,这样您就可以从列表中删除错误的地址。

答案 1 :(得分:1)

未经测试,但这应该可行。

基本上,它重用原始对象(从而减少了内存分配)。

require_once 'PHPMailer/PHPMailerAutoload.php';

class BatchMailer {

    var $mail;

    function __construct () {
        $this->mail = new PHPMailer;
        $this->mail->isSMTP();
        $this->mail->Host = 'smtp.example.com;smtp.example.com';
        $this->mail->SMTPAuth = true;
        $this->mail->Username = 'newsletter@example.com';
        $this->mail->Password = 'password';
        $this->mail->SMTPSecure = 'ssl';
        $this->mail->SMTPKeepAlive = true;
        $this->mail->Port = 465;
        $this->mail->From = 'newsletter@example.com';
        $this->mail->FromName = 'xyz';
        $this->mail->WordWrap = 50;
        $this->mail->isHTML(true);
        $this->mail->AltBody = 'Please use an HTML-enabled email client to view this message.';
    }

    function setSubject ($subject) {
        $this->mail->Subject = $subject;
    }

    function setBody ($body) {
        $this->mail->Body = stripslashes($body);
    }

    function sendTo ($to) {
        $this->mail->clearAddresses();
        $this->mail->addAddress($to);

        if (!$this->mail->send()) {
            // echo 'Mailer Error: ' . $this->mail->ErrorInfo;
            return false;
        } else {
            return true;
        }
    }

}

$batch = new BatchMailer;

$batch->setSubject('sample subject');
$batch->setBody('sample body');

foreach ($emails as $email) {
    $batch->sendTo($email);
}

答案 2 :(得分:-1)

通过cgi将函数放入c ++。 c ++邮件程序比首先访问整个http框架要强大得多。 http://www.cplusplus.com/forum/windows/86562/ 但是PhP已经为它的关联数组使用了哈希表,因此你不会再使用哈希表来获取速度。所以你真的在你的网络框架中最大化了。 将它放到系统级功能中,c是您最快/最精简的选择。 除非你真的有汇编语言才能。