【问题标题】:PhP mailer - Send Multiple Messages to Multiple recipientsPhP 邮件程序 - 向多个收件人发送多条消息
【发布时间】:2017-08-03 10:24:53
【问题描述】:

我只是在使用 phpmailer。我想生成多条消息并将它们发送给多个收件人。但是,generateMessage 函数()只是发送给收件人列表中的第一个收件人。 这是我的代码,感谢您的帮助。

require_once("class.phpmailer.php");

set_time_limit(0);

$wh = implode("', '", $abc);
echo "aaa" . $wh;
//echo $email;
$db = DB::getInstance();
$query1 = $db->query("SELECT * FROM tablea WHERE Location IN ('$wh')");
$result1 = $query1->results();
$query2 = $db->query("SELECT * FROM tableb WHERE Location IN ('$wh')");
$result2 = $query2->results();
$query3 = $db->query("SELECT * FROM tablec");
$result3 = $query3->results();
foreach ($result3 as $b) {
  $username = $b->email;
  $password = $b->password;
  $Times = $b->P2_Time;
}
$minutePerDay = (24 * 60) / $Times;
echo $minutePerDay;
foreach ($result1 as $r) {
  $TimeP2SendE = $r->Timea;
  break;
}
foreach ($result2 as $r) {
  $TimeP2SendG = $r->Timea;
  break;
}
$currentTime = date('Y-m-d H:i:s');
$TimeDifferentE = (strtotime($currentTime) - strtotime($TimeP2SendE)) / 60;
$TimeDifferentG = (strtotime($currentTime) - strtotime($TimeP2SendG)) / 60;
if ($TimeDifferentE >= $minutePerDay or $TimeDifferentG >= $minutePerDay) {
  $mail = new PHPMailer();
  $mail->IsSMTP();
  $mail->Host = "smtp.gmail.com";
  $mail->Port = 465;
  $mail->SMTPAuth = true;
  $mail->SMTPSecure = 'ssl';
  $mail->Username = $username;
  $mail->Password = $password;
  $mail->AltBody = " ";
  $mail->From = $username;
  $mail->FromName = 'Noti';
  $mail->clearAddresses();
  $mail->AddAddress($email);
  $mail->Subject = $title;
  $mail->IsHTML(true);
  $mail->Body = '<html><body>';
  $mail->Body .= "<h3>Information  </h3>";
  $mail->Body .= '<table class="table table-border">';
  $mail->Body .= "</table>";
  $mail->Body .= "</body></html>";

  if (!$mail->Send()) {
    echo "Error sending: " . $mail->ErrorInfo;
  } else {
    echo "Letter is sent";
  }
}

我已运行此功能 4 次以发送给 4 个不同的收件人,但它只发送给第一个收件人。

【问题讨论】:

  • 为什么不添加一个包含所有联系人的数组,从 1 个联系人到任意号码,并为每个联系人循环 AddAddress 函数。
  • 从哪里来$email 在这行$mail-&gt;AddAddress($email);
  • 我知道如何创建一个包含所有联系人的数组,但是在我的情况下,我不会为收件人列表发送相同的电子邮件,例如:电子邮件 A 给收件人 A,电子邮件 B 给收件人B ......关于收件人,我必须通过多个条件查询才能选择合适的收件人,所以我编写了另一个函数来选择电子邮件,然后我会用我找到的电子邮件调用函数generateMessage。我不会把所有东西都写在 1 个函数中,因为当它运行时,它需要超过 10 秒并出现超时错误。

标签: php html email


【解决方案1】:

您可以构建一个联系人对象数组并循环该数组以添加每个联系人,如下所示:

foreach($contacts as $contact){
    $mail->AddAddress($contact->email);
}

这将添加每个联系人的电子邮件并建立一个邮件列表。

对于每个收件人的自定义正文,我通常使用以下方法。

function sendEmail($email, $name, $body, $altBody = null) {
        $mail = new PHPMailer;
        $mail->IsSMTP();
        $mail->Host = "smtp.gmail.com";
        $mail->Port = 465;
        $mail->SMTPAuth = true;
        $mail->SMTPSecure = 'ssl';
        $mail->Username = $username;
        $mail->Password = $password;
        $mail->From = $username;
        $mail->FromName = 'Noti';
        $mail->clearAddresses();
        $mail->Subject = $title;
        $mail->IsHTML(true);
        $mail->addAddress($email, $name);     // Add a recipient    
        $mail->Body = $message;
        $mail->AltBody = $altBody;

        if (!$mail->send()) {
            error_log($mail->ErrorInfo);
            return false;
        } else {
            return true;
        }
    }

foreach($contacts as $contact){
    //create message here
    sendEmail($contact->email, $contact->name, $message);
}

【讨论】:

  • 如果我想为列表收件人发送相同的电子邮件,我将使用与您相同的方法,但是我有多个不同的电子邮件正文。比如邮件A给收件人A,邮件B给收件人B,……大概10次以上,那么这种情况我该怎么办呢?
  • 重要的是多个不同的电子邮件给多个收件人,而不是同一电子邮件给多个收件人。
  • @HaiDang 由于每个电子邮件收件人都有不同的正文,因此您必须为每个收件人发送不同的电子邮件。在这种情况下,我要做的是创建一个自定义函数,接受一些参数(姓名、电子邮件、正文)并循环收件人列表并每次调用该函数。
  • 我一开始就这样做了,但是 phpmailer 只是发送给列表的第一个收件人。我也尝试通过使用包含名称、正文、电子邮件的 ajax 发送帖子请求到另一个 php 文件以调用 phpmailer 发送函数,我多次检查它的运行函数,但是只有第一个收件人收到电子邮件
  • @HaiDang 您的日志文件中是否收到任何错误消息?因为我对所有项目都使用了相同的功能,并且它总是成功地工作。
【解决方案2】:
    require_once("class.phpmailer.php");

    set_time_limit(0);

    $wh = implode("', '", $abc);
    echo "aaa" . $wh;
    //echo $email;
    $db = DB::getInstance();
    $query1 = $db->query("SELECT * FROM tablea WHERE Location IN ('$wh')");
    $result1 = $query1->results();
    $query2 = $db->query("SELECT * FROM tableb WHERE Location IN ('$wh')");
    $result2 = $query2->results();
    $query3 = $db->query("SELECT * FROM tablec");
    $result3 = $query3->results();
    $currentTime = date('Y-m-d H:i:s');
    foreach ($result3 as $b) {
      $username = $b->email;
      $password = $b->password;
      $Times = $b->P2_Time;
    }
    $minutePerDay = (24 * 60) / $Times;
    echo $minutePerDay;
    foreach ($result1 as $r) {
      $TimeP2SendE = $r->Timea;
      $TimeDifferentE = (strtotime($currentTime) - strtotime($TimeP2SendE)) / 60;
if($TimeDifferentE >= $minutePerDay){
    sendemail($username,$password,$email,$title);
}
    }
    foreach ($result2 as $r) {
      $TimeP2SendG = $r->Timea;
     if($TimeDifferentG >= $minutePerDay){
    sendemail($username,$password,$email,$title);
}
    }

public function sendEmail($username,$password,$email,$title){
 $mail = new PHPMailer();
  $mail->IsSMTP();
  $mail->Host = "smtp.gmail.com";
  $mail->Port = 465;
  $mail->SMTPAuth = true;
  $mail->SMTPSecure = 'ssl';
  $mail->Username = $username;
  $mail->Password = $password;
  $mail->AltBody = " ";
  $mail->From = $username;
  $mail->FromName = 'Noti';
  $mail->clearAddresses();
  $mail->AddAddress($email);
  $mail->Subject = $title;
  $mail->IsHTML(true);
  $mail->Body = '<html><body>';
  $mail->Body .= "<h3>Information  </h3>";
  $mail->Body .= '<table class="table table-border">';
  $mail->Body .= "</table>";
  $mail->Body .= "</body></html>";

  if (!$mail->Send()) {
    echo "Error sending: " . $mail->ErrorInfo;
  } else {
    echo "Letter is sent";
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2020-09-15
    • 2014-09-14
    • 2014-02-06
    • 2012-09-24
    • 2012-05-18
    相关资源
    最近更新 更多