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

树莓派搭建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:36:05