[英]PHPmailer - Multiple sending of e-mail
我正在使用PHPmailer發送電子郵件。 截至目前,我成功地將電子郵件發送到一個地址。 現在,我想只需點擊一下即可發送多封電子郵件。
問題 :我曾嘗試使用下面的一些循環發送多封電子郵件,但我的輸出錯了。 是的,它發送電子郵件但只發送一個地址,電子郵件地址正在收到應該通過電子郵件發送到其他電子郵件的所有電子郵件。
例如,當我發送17封電子郵件時,這17封電子郵件只發送到一個地址。 電子郵件應根據數據庫中的地址發送,並附帶相應的唯一附件。 示例:abc@gmail.com應附加abc.pdf,123 @gmail.com應附加123.pdf。
我認為這是在循環中。 請幫我搞清楚。 謝謝。
require_once('phpmailer/class.phpmailer.php');
include("phpmailer/class.smtp.php");
$mail = new PHPMailer();
$body = file_get_contents('phpmailer/body.html');
$body = preg_replace('/\/b]/','',$body);
$file ='phpmailer/mailpass.txt';
if($handle = fopen($file,"r")){
$contentpass = fread($handle,'15');
fclose($handle);
}
$mail->IsSMTP();
$mail->Host = "smtp.gmail.com";
$mail->SMTPDebug = 1;
$mail->SMTPAuth = true;
$mail->SMTPSecure = "tls";
$mail->Host = "smtp.gmail.com";
$mail->Port = 587;
$mail->Username = "email@gmail.com";
$mail->Password = $contentpass;
$mail->SetFrom("email@gmail.com", "Subject");
$mail->AddReplyTo("email@gmail.com","Subject");
$mail->Subject = "Subjects";
$mail->AltBody = "Subject";
$mail->MsgHTML($body);
$file='current_schoolyear.txt';
if($handle = fopen($file,"r"))
{
$content = fread($handle,'9');
fclose($handle);
}
$input = addslashes($_POST['depchair']);
$email = "select email_address from sa_student where schoolyear = '$input'";
if ($p_address=mysql_query($email))
{
while($row = mysql_fetch_assoc($p_address))
{
$mail->AddAddress($row['email_address']);
$input = addslashes($_POST['depchair']);
$control = "select control_no from sa_student where schoolyear = '$input'";
if($ctrl=mysql_query($control)){
$ctrl_no = mysql_result($ctrl, 0);
$mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf");
}
else
{
echo "No attached document.";
}
if(!$mail->Send()) {
$message = "<div class=\"nNote nFailure\" >
<p>Error sending email. " . $mail->ErrorInfo ."</p>
</div>";
} else {
$message = "<div class=\"nNote nSuccess\" >
<p> Email have been sent to the examinees in ".$input_depchair. "! </p>
</div>";
}
}
}
else
{
echo (mysql_error ());
}
更新的代碼:運行下面的代碼后,我能夠發送一封電子郵件並附上正確的附件。 但是,只發送了一封電子郵件(數據庫中的最后一個電子郵件地址),其余電子郵件未發送。
$input = addslashes($_POST['depchair']);
$email = "select email_address, control_no from sa_student where schoolyear = '$input'";
if ($p_address=mysql_query($email))
{
while($row = mysql_fetch_assoc($p_address))
{
$cloned = clone $mail;
$cloned->AddAddress($row['email_address']);
$cloned->AddAttachment("fpdf/pdf_reports/document/".$row['control_no'].".pdf");
if(!$cloned->Send()) {
$message = "<div class=\"nNote nFailure\" >
<p>Error sending email. " . $mail->ErrorInfo ."</p>
</div>";
} else {
$message = "<div class=\"nNote nSuccess\" >
<p> Email have been sent to the examinees in ".$input_depchair. "! </p>
</div>";
}
unset( $cloned );
}
}
else
{
echo (mysql_error ());
}
發送電子郵件$mail->Send()
,執行以下命令:
$mail->ClearAllRecipients();
在你的while循環中。
所以你的基本while循環結構如下所示:
while($row = mysql_fetch_assoc($p_address)){
$mail->AddAddress($row['email_address']);
$mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf");
$mail->send();
$mail->ClearAllRecipients();
$mail->ClearAttachments(); //Remove all attachements
}
在循環中,創建$mail
對象的克隆 - 在添加收件人和附件之前 - 然后使用克隆發送電子郵件。 下一個循環迭代將創建一個沒有先前地址和附件的新克隆:
while($row = mysql_fetch_assoc($p_address)) {
$cloned = clone $mail;
$cloned->AddAddress($row['email_address']);
// add attchment to $cloned, etc.
if ( $cloned->send() ) { /* etc */ }
unset( $cloned );
}
這將“清除”您的每次迭代更改(如地址,附件等),而無需重新輸入配置屬性(如,來自,主機等)
附錄:
您的附件可能會完全相同,因為您沒有為這些行獲取新結果(在您的循環中):
$input=addslashes($_POST['depchair']);
$control = "select control_no from sa_student where schoolyear = '$input'";
if ($ctrl=mysql_query($control)) {
$ctrl_no = mysql_result($ctrl, 0);
$mail->AddAttachment("fpdf/pdf_reports/document/".$ctrl_no.".pdf");
}
$ctrl_no
將始終返回相同的結果,因為(我假設) $_POST['depchair']
不會更改 - 因此$input
, $control
, $ctrl
和$ctrl_no
對於每個循環都保持(有效)相同。 你需要找到你實際上打算成為每個循環的$ctrl_no
的任何東西 - 現在你$ctrl_no
使用同一個循環。
以下查詢可能有所幫助:
// replace
// $email = "select email_address from sa_student where schoolyear = '$input'";
// with:
$students_query = "select email_address, control_no from sa_student where schoolyear = '$input'";
// then
// if ($p_address=mysql_query($email)) {
// while($row = mysql_fetch_assoc($p_address)) {
// becomes
if ( $students=mysql_query($students_query) ) {
while ( $row = mysql_fetch_assoc( $students ) ) {
// so that finally, etc
$cloned->AddAddress($row['email_address']);
$ctrl_no = $row['control_no'];
這會在同一查詢中提取學生電子郵件地址及其control_no,確保它們通過循環保持相互關聯。 然后,您可以擺脫第二個中間循環查詢,因為您需要的所有結果都是在第一個循環外查詢中提取的。 以上並不是您需要更改的所有代碼,只是關鍵部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.