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

PHP+HTML+PHPMailer联系表单验证失效及发件地址错误求助

解决PHPMailer联系表单的"Invalid address"错误及输入验证问题

错误信息

Invalid address: (From):
Fatal error: Uncaught PHPMailer\PHPMailer\Exception: Invalid address: (From): in C:\xampp\htdocs\RESPONSIVE
SITE3_2\vendor\phpmailer\phpmailer\src\PHPMailer.php:1324
Stack trace:
#0 C:\xampp\htdocs\RESPONSIVE SITE3_2\send-email.php(74): PHPMailer\PHPMailer\PHPMailer->setFrom('', '')
#1 {main} thrown in C:\xampp\htdocs\RESPONSIVE SITE3_2\vendor\phpmailer\phpmailer\src\PHPMailer.php on line 1324

现有代码

PHP代码(send-email.php)

<?php

$name = $_POST["name"];
$email = $_POST["email"];
// $email = test_input($_POST["email"]);
$message = $_POST["message"];

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    $emailErr = "Invalid email format";
} 

if (!preg_match("/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/", $email)) {
    $emailErr = "Email should contain only letters, numbers, and underscores";
}

require "vendor/autoload.php";

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;

$mail = new PHPMailer(true);

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

$mail->isSMTP();
$mail->SMTPAuth = true;

$mail->Host = "smtp.gmail.com";
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = 587;

require_once 'config.php';
$mail->Username = SMTP_USERNAME;
$mail->Password = SMTP_PASSWORD;

$mail->setFrom($email, $name);
$mail->addAddress("myemail@gmail.com", "Ads");

$mail->Subject = $subject;
$mail->Body =  "Name: $name\nEmail: $email\n\n$message";

$mail->send();

header("Location: sent.html");
?>

HTML代码

<form method="POST" action="send-email.php">
    <input type="text" name="name" id="name" placeholder="Name*">
    
    <input type="email" name="email" id="email" placeholder="Email*">
    <span class="error" style="color:red"><?php echo $emailErr;?></span>

    
    <textarea name="message" id="message" placeholder="Your Message*"></textarea>
    
    <button type="submit" name="submit" id="submit" class="button">Start</button>
</form>

问题分析

  1. 空值触发From地址错误:直接读取$_POST变量但未做非空检查,用户空提交时$name和$email为空字符串,PHPMailer不接受空发件地址,导致报错。
  2. 验证逻辑无效:当前仅检查邮箱格式,未校验必填项;且表单与处理脚本分离,错误提示无法传递到表单页面显示。
  3. 未定义变量:代码中$subject未赋值,发送邮件时会触发新错误。

修复方案(新手友好版)

将表单与PHP处理逻辑合并到同一个文件(命名为contact.php),既简化流程又能直接显示错误提示:

完整代码(contact.php)

<?php
// 初始化错误提示变量
$nameErr = $emailErr = $messageErr = "";
$name = $email = $message = "";
$sendSuccess = false;

// 表单提交时执行处理逻辑
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    // 验证姓名必填
    if (empty($_POST["name"])) {
        $nameErr = "姓名不能为空";
    } else {
        $name = trim($_POST["name"]);
    }

    // 验证邮箱:必填+格式+字符限制
    if (empty($_POST["email"])) {
        $emailErr = "邮箱不能为空";
    } else {
        $email = trim($_POST["email"]);
        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $emailErr = "邮箱格式不正确";
        }
        if (!preg_match("/^[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+$/", $email)) {
            $emailErr = "邮箱仅允许字母、数字和下划线";
        }
    }

    // 验证消息内容必填
    if (empty($_POST["message"])) {
        $messageErr = "消息内容不能为空";
    } else {
        $message = trim($_POST["message"]);
    }

    // 所有验证通过才发送邮件
    if (empty($nameErr) && empty($emailErr) && empty($messageErr)) {
        require "vendor/autoload.php";

        use PHPMailer\PHPMailer\PHPMailer;
        use PHPMailer\PHPMailer\SMTP;

        try {
            $mail = new PHPMailer(true);

            // 调试模式:测试时打开,上线后改为SMTP::DEBUG_OFF关闭
            $mail->SMTPDebug = SMTP::DEBUG_SERVER;

            $mail->isSMTP();
            $mail->SMTPAuth = true;

            $mail->Host = "smtp.gmail.com";
            $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
            $mail->Port = 587;

            require_once 'config.php';
            $mail->Username = SMTP_USERNAME;
            $mail->Password = SMTP_PASSWORD;

            // 用自己的SMTP账号作为发件人(避免被判定为垃圾邮件)
            $mail->setFrom(SMTP_USERNAME, "网站联系表单");
            $mail->addAddress("myemail@gmail.com", "Ads");
            // 设置回复地址为用户邮箱,方便直接回复
            $mail->addReplyTo($email, $name);

            $mail->Subject = "新消息来自:$name";
            $mail->Body = "姓名: $name\n邮箱: $email\n\n消息内容:\n$message";

            $mail->send();
            $sendSuccess = true;
        } catch (Exception $e) {
            echo "发送失败:{$mail->ErrorInfo}";
        }
    }
}
?>

<!-- HTML表单部分 -->
<!DOCTYPE html>
<html>
<head>
    <title>联系表单</title>
    <style>
        .error { color: red; font-size: 12px; display: block; }
        .success { color: green; font-size: 16px; margin-bottom: 15px; }
        div { margin-bottom: 10px; }
    </style>
</head>
<body>
    <?php if ($sendSuccess): ?>
        <p class="success">邮件发送成功!我们会尽快回复你。</p>
    <?php endif; ?>

    <form method="POST" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); ?>">
        <div>
            <label for="name">姓名*</label><br>
            <input type="text" name="name" id="name" placeholder="输入你的姓名" value="<?php echo htmlspecialchars($name); ?>">
            <span class="error"><?php echo $nameErr; ?></span>
        </div>

        <div>
            <label for="email">邮箱*</label><br>
            <input type="email" name="email" id="email" placeholder="输入你的邮箱" value="<?php echo htmlspecialchars($email); ?>">
            <span class="error"><?php echo $emailErr; ?></span>
        </div>

        <div>
            <label for="message">消息内容*</label><br>
            <textarea name="message" id="message" placeholder="输入你的消息" rows="5"><?php echo htmlspecialchars($message); ?></textarea>
            <span class="error"><?php echo $messageErr; ?></span>
        </div>

        <button type="submit" name="submit" class="button">发送消息</button>
    </form>
</body>
</html>

关键修改说明

  1. 合并表单与处理逻辑:HTML和PHP放在同一文件,错误提示可直接显示在对应输入框下方,无需跨文件传递变量。
  2. 完善验证规则:新增必填项检查,同时校验邮箱格式和字符限制,验证不通过则不执行邮件发送逻辑。
  3. 修复发件人问题:使用自己的SMTP账号作为发件人,用户邮箱设置为回复地址,既符合SMTP服务要求,又避免邮件被标记为垃圾邮件。
  4. 保留用户输入:验证失败时自动回填已输入内容,无需用户重新填写。
  5. 定义邮件主题:设置包含用户姓名的明确主题,方便收件人识别。

使用注意事项

  • 确保你的Gmail账号已开启SMTP服务,开启两步验证的需使用应用专用密码登录SMTP。
  • 上线前记得关闭调试模式:将$mail->SMTPDebug = SMTP::DEBUG_SERVER;改为SMTP::DEBUG_OFF。

内容的提问来源于stack exchange,提问作者Teleport

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:42:54