使用XAMPP+PHPMailer发邮件遇Undefined array key及无效地址错误求助
XAMPP+PHPMailer邮件发送错误排查与解决
问题描述
我在XAMPP服务器上使用PHPMailer实现邮件发送功能,运行时遇到错误,请求协助解决。
相关代码
表单及PHP处理代码
<html> <head> <title> Sending Email Using PHP </title> </head> <body> <form method="post" action=""> Please enter the email address <input type="email" name="to" placeholder="********@gmail.com"> <br> Kindly enter the subject <input type="text" name="subject" placeholder = "Requesting all information"> <br> Kindly enter the message <textarea name="message"> </textarea> <br><br> <input type="submit" value="Send"> </form> <?php use PHPMailer\PHPMailer\Exception; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; require 'PHPMailer/src/Exception.php'; require 'PHPMailer/src/PHPMailer.php'; require 'PHPMailer/src/SMTP.php'; require 'information.php'; //credentials for emails if($_SERVER["REQUEST_METHOD"] == "POST"){ $to = $_POST["to"]; $subject = $_POST["subject"]; $message = $_POST["message"]; $mail = new PHPMailer (true); $mail -> Subject = $subject; $mail -> Body = $message; $mail -> addAddress ($to); $mail -> AltBody = $message; $mail -> setFrom (SEND_FROM, SEND_FROM_NAME); $mail -> addReplyTo (REPLY_TO, REPLY_TO_NAME); $mail -> Host = MAILHOST; $mail -> Username = USERNAME; $mail -> Password = PASSWORD; $mail -> Port = 587; $mail -> isSMTP (); $mail -> SMTPAuth = true; $mail -> SMTPSecure = PHPMailer:: ENCRYPTION_STARTTLS; $mail -> IsHTML (true); $mail -> send (); if ($mail == true){ echo "Message sent successfully"; } else { echo "Message could not be sent"; } } ?> </body> </html>
配置文件information.php代码
<?php define ('MAILHOST', "smtp.gmail.com"); define ('USERNAME', "*******@gmail.com"); define ('SEND_FROM', "*******0@gmail.com"); define ('SEND_FROM_NAME', "**** *****"); define ('REPLY_TO', "student email"); define ('REPLY_TO_NAME', "*******"); define ('PASSWORD', "**%^&%*"); ?>
错误信息
警告:在(文件名)第40行存在未定义的数组键“to”
致命错误:未捕获的PHPMailer\PHPMailer\Exception:无效地址: (to):
堆栈跟踪:#0 : PHPMailer\PHPMailer\PHPMailer->addOrEnqueueAnAddress('to', NULL, '')
#1(49): PHPMailer\PHPMailer\PHPMailer->addAddress(NULL) #2 {main} 在第1100行抛出
解决方案
1. 修复POST参数的检查与验证
错误核心是$_POST["to"]为空,导致传给addAddress的参数为NULL。添加参数检查和邮箱格式验证,避免空值传入:
if($_SERVER["REQUEST_METHOD"] == "POST"){ // 检查必填字段是否为空 if(empty($_POST["to"]) || empty($_POST["subject"]) || empty($_POST["message"])){ echo "请填写所有必填字段"; exit; } // 验证收件人邮箱格式 if(!filter_var($_POST["to"], FILTER_VALIDATE_EMAIL)){ echo "请输入有效的邮箱地址"; exit; } $to = $_POST["to"]; $subject = $_POST["subject"]; $message = $_POST["message"]; // 后续PHPMailer代码... }
2. 修正PHPMailer的错误处理逻辑
原代码中if ($mail == true)的判断逻辑错误,PHPMailer的send()方法成功时无返回值,失败时抛出异常。改用try-catch块捕获异常:
try { $mail = new PHPMailer(true); $mail->Subject = $subject; $mail->Body = $message; $mail->addAddress($to); $mail->AltBody = $message; $mail->setFrom(SEND_FROM, SEND_FROM_NAME); // 注意:REPLY_TO必须是有效的邮箱地址,替换掉原配置中的"student email" $mail->addReplyTo(REPLY_TO, REPLY_TO_NAME); $mail->Host = MAILHOST; $mail->Username = USERNAME; $mail->Password = PASSWORD; $mail->Port = 587; $mail->isSMTP(); $mail->SMTPAuth = true; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->isHTML(true); $mail->send(); echo "邮件发送成功"; } catch (Exception $e) { echo "邮件发送失败,错误信息:{$mail->ErrorInfo}"; }
3. 修正Gmail SMTP配置
- 确保
REPLY_TO是真实有效的邮箱地址,原配置中的"student email"是无效值,必须替换。 - 若使用Gmail账号发送邮件:
- 开启两步验证后,需使用应用专用密码替换原密码;
- 未开启两步验证时,需开启“不太安全的应用访问”(Gmail已默认关闭,建议优先使用应用专用密码)。
内容的提问来源于stack exchange,提问作者jerald
相关产品推荐
相关产品推荐

