PHP实现的联系我邮件表单发信失败及谷歌企业邮箱SMTP配置咨询
问题解决方法
问题根源
你当前使用PHP原生mail()函数发送邮件,该函数依赖服务器端预装的邮件传输服务,绝大多数虚拟主机/云服务器默认未配置对应服务,因此直接调用必然返回失败。我们改用SMTP协议通过谷歌企业邮箱发送邮件即可解决问题。
第一步:谷歌企业邮箱前置配置
- 登录你的谷歌企业邮箱账号,先开启账号的两步验证功能
- 进入账号「安全」设置页,找到「应用专用密码」选项,生成一个专用密码(注意保存,后续代码中要使用该密码,请勿直接使用邮箱登录主密码)
- 如果你是企业管理员账号,需前往Google Workspace管理后台,确认未限制该账号的SMTP发信权限
第二步:后端代码适配
我们使用业界通用的PHPMailer库完成SMTP发信,你可以通过Composer安装,也可以直接下载PHPMailer源码引入到项目中。
修改你的process-form.php代码如下:
<?php // 引入PHPMailer的核心文件,路径根据你实际存放位置修改 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'path/to/PHPMailer/src/Exception.php'; require 'path/to/PHPMailer/src/PHPMailer.php'; require 'path/to/PHPMailer/src/SMTP.php'; if (isset($_REQUEST['name'], $_REQUEST['email'], $_REQUEST['comment'])) { $name = $_REQUEST['name']; $user_email = $_REQUEST['email']; $message = $_REQUEST['comment']; $to = 'redacted@for.privacy'; // 你的收信邮箱 $subject = 'Contact From My Website'; $mail = new PHPMailer(true); try { // SMTP配置 $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; // 谷歌SMTP服务器地址 $mail->SMTPAuth = true; $mail->Username = '你的谷歌企业邮箱地址'; // 比如xxx@yourdomain.com $mail->Password = '你刚才生成的应用专用密码'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // SSL端口,也可以用587对应ENCRYPTION_STARTTLS // 发件人设置,必须使用你自己的谷歌企业邮箱,谷歌会拦截自定义发件人 $mail->setFrom('你的谷歌企业邮箱地址', '网站联系表单'); $mail->addAddress($to); // 收信人 $mail->addReplyTo($user_email, $name); // 回复时直接回复用户填写的邮箱 // 邮件内容 $mail->Subject = $subject; $mail->Body = "发件人姓名:{$name}\n发件人邮箱:{$user_email}\n留言内容:\n{$message}"; $mail->send(); echo 'success'; } catch (Exception $e) { // 调试时可以打开下面的代码查看具体错误信息:echo $mail->ErrorInfo; echo 'error'; } } ?>
其他注意事项
- 你的前端表单代码、AJAX提交代码逻辑无需修改,可直接沿用
- 不要将谷歌企业邮箱地址、应用专用密码直接提交到公共代码仓库,建议通过环境变量读取敏感信息
- 如果发信仍失败,请联系你的服务器运营商确认465/587端口未被封禁
- 发信测试时不要用相同内容重复提交多次,避免被谷歌判定为垃圾邮件触发发信限制
内容的提问来源于stack exchange,提问作者mossonzdod
相关产品推荐
相关产品推荐

