树莓派搭建Web服务器配置PHP发送邮件功能失败问题求助
树莓派托管站点PHP表单无法发送邮件故障求助
我近期在strato.de平台购买了个人首个域名,在Raspberry Pi上搭建了Web服务器托管个人站点,已完成域名与服务器的绑定,可直接通过域名访问我的站点。
我的站点搭载了联系表单,功能为收集用户填写的个人信息与留言后,自动发送邮件到我的指定邮箱。我已经在Raspberry Pi上安装了PHP运行环境,但提交表单后邮件始终无法送达,无法定位故障原因。
我的HTML表单代码
<form action="./mail_handler.php" method="POST"> <div class="p pb-3"><strong>Feel free to contact me </strong></div> <div class="row mb-3"> <div class="col"> <div class="input-group"><span class="input-group-addon"><i class="fa fa-user-circle"></i></span> <input class="form-control" type="text" name="first_name" id="first_name" placeholder="Firstname" required="required" /> </div> </div> </div> <div class="row mb-3"> <div class="col"> <div class="input-group"><span class="input-group-addon"><i class="fa fa-user-circle"></i></span> <input class="form-control" type="text" name="last_name" id="last_name" placeholder="Lastname" required="required" /> </div> </div> </div> <div class="row mb-3"> <div class="col"> <div class="input-group"><span class="input-group-addon"><i class="fa fa-envelope"></i></span> <input class="form-control" type="email" name="email" id="email" placeholder="E-mail" required="required" /> </div> </div> </div> <div class="row mb-3"> <div class="col"> <div class="form-group"> <textarea class="form-control" name="message" placeholder="Your Message" required="required"></textarea> </div> </div> </div> <div class="row"> <div class="col"> <button class="btn btn-primary" type="submit" name="submit" value="Send">Send</button> </div> </div> </form>
我的PHP处理代码
<?php if(isset($_POST['submit'])){ $to = "contact@mymail.de"; // Empfägner Adresse $from = $_POST['email']; // Absender Adresse $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; // $phone = $_POST['phone']; $subject = "PORTFOLIO"; $message = $first_name . " " . $last_name . " " . $from . " schrieb folgendes:" . " " . $_POST['message']; $headers = "From:" . $from; $headers2 = "From:" . $to; mail($to,$subject,$message,$headers); header('Location: ./contact_success.html'); }?>
我已经尝试了多种排查方案均未解决问题,希望有相关经验的开发者可以提供帮助,如有需要我可提供更多相关信息。
故障排查与解决方法
- 先确认系统邮件传输代理(MTA)配置
PHP内置的mail()函数依赖系统的sendmail命令,树莓派默认未安装对应服务,执行以下命令安装配置:
sudo apt update && sudo apt install sendmail -y
安装完成后先在命令行测试发信是否正常,同时查看/var/log/mail.log日志定位报错:
echo "测试邮件内容" | sendmail 你的收信邮箱地址
如果是家用宽带托管的站点,大概率运营商会封锁25发信端口,这种情况不要用原生mail()函数,改用SMTP方式发信。
- 修复PHP代码问题
现有代码未捕获mail()函数的执行结果,直接跳转无法判断调用是否成功,同时邮件头配置不完整极易被邮件服务商判定为垃圾邮件拒收,修改后的参考代码:
<?php if(isset($_POST['submit'])){ $to = "contact@mymail.de"; $from = $_POST['email']; $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $subject = "PORTFOLIO"; $message = $first_name . " " . $last_name . "\n" . $from . " schrieb folgendes:\n\n" . $_POST['message']; // 补全邮件头,不要直接用用户提交的邮箱作为发件人,避免被判定为伪造邮件 $headers = "From: noreply@你的域名\r\n"; $headers .= "Reply-To: " . $from . "\r\n"; $headers .= "Content-Type: text/plain; charset=utf-8\r\n"; $send_status = mail($to,$subject,$message,$headers); if(!$send_status){ // 开发环境可打印错误,生产环境记录日志 error_log("邮件发送失败:".print_r(error_get_last(), true)); exit("邮件发送失败,请稍后重试"); } header('Location: ./contact_success.html'); exit; } ?>
- 推荐方案:使用PHPMailer走第三方SMTP发信
这种方式不需要在树莓派配置邮件服务,也能规避25端口封锁问题,直接调用你在strato.de购买域名附赠的企业邮箱、或者其他公共邮箱的SMTP服务发信,发信成功率远高于原生mail()函数。
内容的提问来源于stack exchange,提问作者danielkomm
相关产品推荐
相关产品推荐

