PHPMailer:大量电子邮件 - 一次发送所有可变消息,而不是单独发送

标签 php email loops variables phpmailer

我目前正在尝试找出执行此操作的最佳方法。

我制作的当前系统会一封接一封地发送电子邮件,并在数组中填写每个条目的信息,例如电子邮件、名字和姓氏。

这里的问题是,如果我发送大量消息,它需要永远运行,因为它每次都调用一个函数,而不是我希望它通过一个函数一次发送所有消息。

我知道您可以添加多个至,但是电子邮件正文不会发送与每封电子邮件相关的正确信息。如果有人能帮我解决这个问题,我将不胜感激,因为我已经到处寻找解决方案。

<?php
require '../phpmailer/PHPMailerAutoload.php';?>

<?php
/* Block List */
$blocklist = array('emailblocked@gmail.com', 'emailblocked2@gmail.com');

$emaillist = array(

    array(
        'Email'=>'example@gmail.com', 
        'First Name'=>'John',
        'Last Name'=>'Doe'
    ), 

    array(
        'Email'=>'example2@gmail.com', 
        'First Name'=>'Joe',
        'Last Name'=>'Doe'
    ), 

    array(
        'Email'=>'example3@gmail.com', 
        'First Name'=>'Jane',
        'Last Name'=>'Doe'
    ),
);



foreach($emaillist as $emailkey){

    if (in_array($emailkey['Email'], $blocklist)) {

        echo 'Message has been been blocked for '.$emailkey['Email'].'<br>';

    }else{

        $mail = new PHPMailer;

        // $mail->SMTPDebug = 3;                               // Enable verbose debug output

        $mail->isSMTP();                                      // Set mailer to use SMTP
        $mail->Host = 'smtp.mandrillapp.com';  // Specify main and backup SMTP servers
        $mail->SMTPAuth = true;                               // Enable SMTP authentication
        $mail->Username = 'username@example.com';                 // SMTP username
        $mail->Password = 'passwordgoeshere';                           // SMTP password
        $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
        $mail->Port = 587;                                    // TCP port to connect to

        $mail->From = 'noreply@example.com';
        $mail->FromName = 'Example';

        $mail->addAddress($emailkey['Email'], $emailkey['First Name'].' '.$emailkey['Last Name']);     // Add a recipient
        $mail->addReplyTo('info@example.com', 'Information');

        $mail->isHTML(true);                                  // Set email format to HTML

        $mail->Subject = $emailkey['First Name'].' '.$emailkey['Last Name'];

        $emailtemp = file_get_contents('templates/temp-1.html');
        $emailtempfilteremail = str_replace("[[email]]", $emailkey['Email'], $emailtemp);
        $emailtempfilterfirstname = str_replace("[[firstname]]", $emailkey['First Name'], $emailtempfilteremail);
        $emailtempfilterlastname = str_replace("[[lastname]]", $emailkey['Last Name'], $emailtempfilterfirstname);
        $mail->Body = $emailtempfilterlastname;

        $mail->AltBody = 'This is a spicy email!';

        if(!$mail->send()) {
            echo 'Message could not be sent.';
            echo 'Mailer Error: ' . $mail->ErrorInfo;
        } else {
            echo 'Message has been sent to '.$emailkey['Email'].'<br>';
        }

        $mail->ClearAllRecipients();

    }   

}

?>

谢谢

最佳答案

有一个 how to send to a list from a database efficiently 的例子在与 PHPMailer 捆绑在一起的示例中。使用 PHPMailer 发送大量邮件本质上不会让您被列入黑名单,但您确实需要谨慎行事。 Mandrill 并不神奇 - 如果您通过它发送垃圾邮件,它和其他任何东西一样容易被阻止。

如果你想从 PHP 同时发送 50 个,用 pcntl 扩展启动多个进程,但它实际上帮不了你太多,因为你会大大增加开销。您可以在 PHPMailer 中设置 SMTPKeepAlive = true 这将大大减少开销(它避免为每条消息建立新连接),但它仍然不会同时发送消息 - 什么都不会。 SMTP 中没有在同一连接上同时发送具有不同正文的多条消息的选项。

在浏览器加载页面期间发送到一个大列表是非常不可靠的;使用 cron 脚本或后台进程进行实际发送,只需通过 Web 界面进行设置即可。如果您正在等待页面加载,一个提示 - 请调用 ignore_user_abort()如果您的浏览器关闭连接,它不会停止发送 - 并注意页面刷新!如果你想发送得更快,安装一个像 postfix 这样的本地邮件服务器并用它来中继——它会比直接发送更快更可靠。

关于PHPMailer:大量电子邮件 - 一次发送所有可变消息,而不是单独发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28301565/

相关文章:

PowerShell - 双循环可能吗?

javascript - 将数组连接到自身是否比遍历数组以创建更多索引更快?

php - jQuery 函数动态加载更多数据

php - 如何从字符串中删除换行符(无字符!)?

javascript - Ajax 文件上传返回状态码 0 就绪状态 0(仅有时)

python - 将提交表单中的文件附加到电子邮件

php - Laravel 5.7 : Custom blade template for Maintenance Mode but not 503.blade.php

php - 发送欢迎电子邮件 PHP

java - 从应用程序发送的电子邮件

javascript - 循环遍历多个对象js