使用PHPMailer发送带附件双邮件时收件人错误问题求助
问题分析与修复方案
嘿,我一眼就看出问题所在了——你在复用同一个PHPMailer实例发送第二封邮件时,没有清除第一封邮件添加的收件人信息!
具体来说,第一封邮件你用addAddress($to)把提交者设为了收件人,发送完第一封后,直接给同一个实例添加新的收件人info@info.com,这会把新收件人追加到原有列表里,导致第二封邮件同时发给了提交者和网站所有者。这就是为什么提交者会收到两封邮件的原因。
两种修复方法:
方法一:清除实例的残留配置(推荐)
发送完第一封邮件后,调用PHPMailer的清除方法,把之前的收件人、回复地址等配置清空,再设置第二封邮件的内容:
clearAddresses():清除所有已添加的收件人(To/Cc/Bcc)clearReplyTos():清除回复地址(可选,但能确保配置干净)- 如果后续邮件不需要附件,还可以用
clearAttachments()清除附件
方法二:创建新的PHPMailer实例
如果不想处理实例复用的问题,直接为第二封邮件新建一个PHPMailer对象,这种方式更彻底,适合邮件配置差异较大的场景。
修正后的完整代码(方法一)
<?php $to = $email; $subject = "Princype - la tua configurazione"; $message = "Buongiorno $nome, <br> in allegato potrai trovare le tua configurazione per il tuo $taglio $style. <br> A breve entrerai in contatto con un nostro incaricato breve per confermare o fissare un appuntamento. <br> Cordialmente, <br><br>"; // email stuff 2 $to2 = "info@info.com"; $subject2 = "Princype - richiesta info per $taglio $style - $id_planimetria"; $message2 = "Una nuova richiesta per l'appartamento $taglio $style - $id_planimetria, <br> <br> Nome: $nome <br> Cognome: $cognome <br> email: $email <br> Telefono: $telefono <br>"; //first email try { $mail->isSMTP(); $mail->Host = 'smtps.XXX.com'; $mail->SMTPAuth = true; $mail->Username = 'info@info.com'; $mail->Password = 'XXXXXXX'; $mail->SMTPSecure = 'ssl'; $mail->Port = 000; //Recipients $mail->setFrom('info@info.com', 'info service'); $mail->addAddress($to, sprintf('%s %s', $nome, $cognome)); $mail->addReplyTo('info@info.com', 'info service'); // Attachments $mail->addAttachment($filepath, $filename); // Content $mail->isHTML(true); $mail->Subject = $subject; $mail->Body = $message; $mail->AltBody = $message; $mail->send(); // 关键步骤:清除之前的收件人和回复地址 $mail->clearAddresses(); $mail->clearReplyTos(); //second mail $mail->setFrom('info@info.com', 'info service'); $mail->addAddress($to2, 'info service'); $mail->addReplyTo($to, sprintf('%s %s', $nome, $cognome)); $mail->Subject = $subject2; $mail->Body = $message2; $mail->AltBody = $message2; $mail->send(); // echo 'Message has been sent'; } catch (Exception $e) { error_log( "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"); } ?>
额外提示
- 建议把SMTP的配置代码封装成一个函数,比如写个
setupSMTP($mail)函数,这样两封邮件都能复用配置,减少冗余代码 - 注意检查
$filepath和$filename的有效性,确保附件能正常添加
内容的提问来源于stack exchange,提问作者s.zane
相关产品推荐
相关产品推荐

