PHP mail函数无法通过JS Prompt获取的用户邮箱发送邮件问题
这个问题的核心是你搞混了服务器端语言(PHP)和客户端语言(JavaScript)的执行顺序,咱们一步步拆解来看:
1. 前后端执行顺序的本质
PHP是服务器端语言,用户访问页面时,服务器会先把所有PHP代码执行完毕,生成包含HTML/JS的页面内容,再发送给用户的浏览器;而JavaScript是客户端语言,只有当浏览器拿到页面后,才会执行里面的JS代码。
你的prompt函数里,PHP的$answer变量存储的根本不是用户输入的邮箱地址,而是一段JS代码字符串:<script type='text/javascript'> document.write(answer); </script>。
2. 为什么echo($name)能正常显示?
当浏览器收到页面后,会执行这段嵌入的JS代码,document.write(answer)会把用户在弹窗里输入的邮箱地址写到页面上——这看起来像是PHP拿到了正确值,但实际上PHP在服务器端早就执行完了,它从来没获取到用户输入的实际内容,只是把JS代码输出给了浏览器而已。
3. 邮件发送异常的原因
当你把$name放进收件人数组$recipients时,PHP传递给mail()函数的是那段JS代码字符串。邮件服务器会尝试把这个字符串解析成邮箱地址格式,自然会把代码里的各个片段错误拆分,比如把<script type='text/javascript'>当成邮箱用户名,把服务器域名ssd3.jh-pro.cz当成邮箱域名,最终就出现了你看到的那些奇怪的收件人地址。
正确的实现方式:用表单提交获取用户输入
要获取用户输入的邮箱并用于邮件发送,应该通过前端表单提交的方式,让PHP在服务器端接收用户的输入值。示例代码如下:
前端表单页面(比如index.html)
<form method="post" action="send-mail.php"> <label>请输入收件邮箱:</label> <input type="email" name="recipient_email" required> <button type="submit">发送邮件</button> </form>
后端处理页面(send-mail.php)
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 验证并获取用户提交的邮箱 $recipient_email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL); if ($recipient_email) { // 设置邮件参数 $to = $recipient_email; $subject = "你的邮件主题"; $message = "这里是邮件内容"; $headers = "From: your-email@example.com\r\n"; // 发送邮件 if (mail($to, $subject, $message, $headers)) { echo "邮件发送成功!"; } else { echo "邮件发送失败,请检查服务器的邮件配置。"; } } else { echo "请输入有效的邮箱地址!"; } } ?>
内容的提问来源于stack exchange,提问作者Karel Krýda

