一次向成千上万的客户发送邮件(wp_mail -Wordpress)

时间:2017-12-21 11:14:04

标签: wordpress phpmailer

我想在圣诞节前夕从WordPress网站发送总共1650封邮件。

这是我目前的代码:

 $headers = "MIME-Version: 1.0" . "\r\n";
 $headers .= "Content-type: text/html; charset=" . get_bloginfo('charset') . "" . "\r\n";

$customers = get_users($args);
$cus_arr = array();
foreach($customers as $customer){
            array_push($cus_arr,$customer->data->user_email);
 }
wp_mail($cus_arr, $subject, $message, $headers);

/*another way*/
...
    foreach($customers as $customer){
       wp_mail($customer->data->user_email, $subject, $message, $headers);
     }
  

问题1:上述方式是否是向这一数量的客户发送邮件的好选择?可能有任何问题吗?有没有更好的方法呢?

此外,我不希望客户看到对方邮件。这是我目前的代码:

wp_mail(array("BCC: xyz@xyz.com","BCC: abc@abc.com"), $subject, $message, $headers);

但它不起作用。没有BCC:邮件实际上已发送。

  

问题2.如何阻止用户查看其他邮件ID?

2 个答案:

答案 0 :(得分:1)

问题1:使用速率限制(限制)的良好做法,例如最多100封邮件/ 10分钟。您可以通过将收件人存储在数据库中,并使用cronjob每10分钟发送一次邮件来完成此操作。另一种选择是使用第三方邮件服务,例如Mandrill或Sendgrid,他们将为您处理限制。

问题2:您当前的代码会为每个收件人调用wp_mail,因此他们永远不会看到其他邮件地址(不需要BCC标头)。但是,如果您决定使用wp_mail在1次呼叫中发送给多个收件人,则需要使用密件抄送标头,例如:

wp_mail('', $subject, $message, array("BCC: xyz@xyz.com","BCC: abc@abc.com"));

答案 1 :(得分:1)

嘿,我认为你的代码是个坏主意,原因如下:

  • 脚本可能超过服务器的最大执行时间或内存限制
  • 可能 工作,但wp_mail不是发送大量电子邮件的好方法

我建议使用库来发送批量电子邮件。现有的WordPress插件就是为了这个目的,但你可以自己轻松完成 - 这是我的经典,经过良好测试的PHPMailerLibrary(https://github.com/PHPMailer/PHPMailer)的解决方案:

在你的functions.php中:

    require("libs/phpmailer/PHPMailerAutoload.php");

/**
@param $from: The senders E-Mail
@param $from_name: The senders Name
@param $subject: The E-Mail subject
@param $mesesage: The E-Mail content HTML
@param $to: An array of receivers
*/
function my_custom_send_mass_mail($from,$from_name,$subject,$message,$to) {

        // first use PHPMailer to send all the emails
        $email = new PHPMailer();

        $email->isSMTP();  
        $email->CharSet   = 'utf-8';
        $email->From      = $from;
        $email->FromName  = $from_name;
        $email->Subject   = $subject;
        $email->Body      = $message;
        $email->IsHTML();


        if(is_array($to)) {
            foreach($to as $t) {
                $email->addBCC($t);
            }
        }

        $ac = time();
        update_option('mailsent-'.$ac,$email);

        $success = $email->send(); 

        if($success) {
           update_option('mailsent-suc-'.$ac,"yes");
           return "Bulk E-Mail successfully sent.";
        } 
        update_option('mailsent-suc-'.$ac,$email->ErrorInfo);
        return "Bulk E-Mail Error: Please contact admin.";
    }

只需调用此函数并确保$ to是接收方电子邮件数组。

这是我每周发送10000封电子邮件通讯的客户使用的解决方案,目前效果很好。