使用PHPMailer发送邮件返回true但无法接收的技术求助
PHPMailer发送邮件返回true但无法接收的排查方案
问题描述
此前使用PHPMailer对接Gmail SMTP发送服务请求通知邮件正常,新增两个服务后,所有服务均无法收到邮件,但mail.send()返回true,测试极简PHPMailer代码也出现相同问题。
核心排查步骤
1. 检查Gmail账户权限配置
- 若开启两步验证,必须使用应用专用密码替代原账户密码登录SMTP,原密码会被直接拒绝。
- 确认账户未开启"低安全性应用访问"(Gmail已默认禁用),此选项不再支持,必须使用应用密码或OAuth2认证。
- 登录Gmail后台查看「最近的安全性活动」,确认是否有SMTP登录请求被Google拦截,若有需手动允许并重新生成应用密码。
2. 分析SMTP调试日志
代码中已设置$mail->SMTPDebug = 2,执行发送后查看输出的调试信息:
- 确认是否真的完成了与Gmail SMTP服务器的握手、邮件发送指令是否被服务器接受
- 若日志显示"Message sent successfully",说明邮件已提交给Gmail,问题出在Gmail的投递环节而非代码
3. 检查垃圾邮件/归档文件夹
由于发件人和收件人使用同一Gmail账户,邮件极可能被判定为垃圾邮件,直接进入垃圾信箱或归档文件夹,建议:
- 在Gmail中添加发件邮箱到白名单
- 修改
setFrom方法,添加自定义发件人名称,避免反垃圾系统识别异常:$mail->setFrom($USERNAME, "服务请求通知");
4. 调整SMTP连接配置
尝试切换端口和加密方式,部分服务器可能封禁465端口:
$mail->SMTPSecure = "tls"; $mail->Port = 587; // 替代原有的ssl/465配置
5. 代码细节优化
- 回复地址修正:当前
addReplyTo使用的是自身账户,应改为用户提交的邮箱,既符合邮件规范也便于后续回复:// 以Analisi posizioni服务为例 $mail->addReplyTo($_POST["ap-email"], $_POST["ap-name"]); - 附件上传校验:
fetchAttachments函数未检查文件上传错误,可能导致无效附件影响投递,建议添加错误判断:if($tempFile != "" && $_FILES[$fieldName]["error"][$i] === UPLOAD_ERR_OK) $mailObject->addAttachment($tempFile, $fileName);
附用户原始代码
<!DOCTYPE html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="style/desktop/structure.css"> <link rel="stylesheet" href="style/desktop/common.css"> <link rel="stylesheet" href="style/desktop/elab-form.css"> </head> <body> <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; require 'config.php'; function fetchAttachments($mailObject, $fieldName) { if(isset($_FILES[$fieldName]["name"])) { $numFile = count($_FILES[$fieldName]["name"]); for($i=0; $i<$numFile; $i++) { $tempFile = $_FILES[$fieldName]["tmp_name"][$i]; $fileName = $_FILES[$fieldName]["name"][$i]; if($tempFile != "") $mailObject -> addAttachment($tempFile, $fileName); } return $numFile; } return 0; } session_start(); $_SESSION['fi'] = 'form'; $source = "index.html"; if(!isset($_POST["ap-confirm"]) and !isset($_POST["e-confirm"]) and !isset($_POST["pm-confirm"]) and !isset($_POST["cnt-confirm"]) and !isset($_POST["wwm-confirm"])) { session_destroy(); header("Location: index.html"); } $mail = new PHPMailer(true); $mail -> SMTPDebug = 2; $mail -> SMTPAuth = true; $mail -> Host = "smtp.gmail.com"; $mail -> SMTPSecure = "ssl"; $mail -> Port = 465; $mail -> Username = $USERNAME; $mail -> Password = $PASSWORD; $mail -> setFrom($USERNAME); $mail -> addAddress($USERNAME); $mail -> addReplyTo($USERNAME); $mail -> isHTML(true); $mail -> Subject = ""; $mail -> Body = ""; // SERVIZI ================================================================= // Analisi posizioni if(isset($_POST["ap-confirm"])) { $mail -> Subject = "Richiesta Analisi delle posizioni assicurative e finanziarie in essere"; $mail -> Body = $_POST["ap-gender"] . " " . "<b>" . addslashes($_POST["ap-name"]) . "</b>" . "<br>Professione<b>: " . addslashes($_POST["ap-job"]) . "</b><br><br>Telefono<b>: " . $_POST["ap-tel"] . "</b><br>Email<b>: " . $_POST["ap-email"] . "</b><br>Data di nascita<b>: " . $_POST["ap-birth"] . "</b><br>Residenza<b>: " . addslashes($_POST["ap-address"]) . "</b><br>Messaggio<b>: " . addslashes($_POST["ap-message"]) . "</b><br><br>"; $fileFetched = fetchAttachments($mail, "ap-file"); $source = "servizi.html"; } // Evento else if(isset($_POST["e-confirm"])) { $mail -> Subject = "Evento"; $mail -> Body = "<b>" . addslashes($_POST["e-name"]) . "</b>" . "<br><br>Telefono<b>: " . $_POST["e-tel"] . "</b><br>Email<b>: " . addslashes($_POST["e-email"]) . "</b><br>Contesto<b>: " . $_POST["e-context"] . "</b><br>Messaggio<b>: " . addslashes($_POST["e-message"]) . "</b><br><br>"; $fileFetched = fetchAttachments($mail, "e-file"); $source = "servizi.html"; } // Pianificazione assicurativa else if(isset($_POST["pm-confirm"])) { $mail -> Subject = "Richiesta Pianificazione assicurativa e patrimoniale completa"; $mail -> Body = $_POST["pm-gender"] . " " . "<b>" . addslashes($_POST["pm-name"]) . "</b>" . "<br>Professione<b>: " . addslashes($_POST["pm-job"]) . "</b><br><br>Telefono<b>: " . $_POST["pm-tel"] . "</b><br>Email<b>: " . $_POST["pm-email"] . "</b><br>Data di nascita<b>: " . $_POST["pm-birth"] . "</b><br>Residenza<b>: " . addslashes($_POST["pm-address"]) . "</b><br><br>Messaggio<b>: " . addslashes($_POST["pm-message"]) . "</b><br><br>"; $fileFetched = fetchAttachments($mail, "pm-file"); $source = "servizi.html"; } // CONTATTI =============================================================== // Contattami else if(isset($_POST["cnt-confirm"])) { $mail -> Subject = "Richiesta di contatto"; $mail -> Body = "<b>" . addslashes($_POST["cnt-name"]) . "</b> " . "<br>Email:<b> " . $_POST["cnt-mail"] . "</b>" . "<br>Telefono<b>: " . $_POST["cnt-tel"] . "</b>" . "<br><br>Messaggio<b>: " . addslashes($_POST["cnt-message"]) . "</b><br><br>"; $source = "contattami.html"; } // Lavora con me else if(isset($_POST["wwm-confirm"])) { $mail -> Subject = "Richiesta di contatto"; $mail -> Body = "<b>" . addslashes($_POST["wwm-name"]) . "</b> " . "<br>Email:<b> " . $_POST["wwm-mail"] . "</b>" . "<br>Telefono<b>: " . $_POST["wwm-tel"] . "</b>" . "<br><br>Messaggio<b>: " . addslashes($_POST["wwm-message"]) . "</b><br><br>"; $fileFetched = fetchAttachments($mail, "wwm-file"); $source = "contattami.html"; } // LAYOUT ================================================================= echo '<img class="elab-img" src="resources/images/logo/horizontal/FI_logo_affiancato.png">'; if(!$mail -> send()) echo '<h3 class="elab-desc">Errore nell\'invio della richiesta: ' . $mail -> ErrorInfo . '. Riprova più tardi.</h3>'; else echo '<h3 class="elab-desc">La richiesta è stata inviata con successo.</h3>'; session_destroy(); header("Refresh: 4; url=" . $source); ?> </body> </html>
内容的提问来源于stack exchange,提问作者Nico99
相关产品推荐
相关产品推荐

