You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:19:56