首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 意見回饋表單:雙向 Email 通知與前端驗證完整實作

     編輯:PHP 綜合知識

功能概覽

這是一個功能完整的 PHP 意見回饋表單,包含前端 JavaScript 驗證、後端雙向 Email 發送(管理員通知 + 使用者確認信)、資料記錄與回顯確認頁。可輕鬆修改為聯絡表單、線上報名等用途。

系統架構流程

  1. GET 請求:顯示空白表單,載入前端驗證腳本
  2. POST 送出:後端驗證必填欄位 → 組裝郵件內容 → 發送管理員通知信 → 發送使用者確認信 → 記錄 Log → 顯示確認頁
  3. 確認頁:回顯所有輸入資料,提供返回上一頁按鈕

核心程式碼模組解析

1. 設定區塊

$adminmail = "admin@acme.oso.com.cn";  // 管理員信箱
$pagename = "Acme";                    // 站點名稱
$pageline = "https://acme.oso.com.cn";  // 站點網址

集中管理寄件人資訊與站點識別,方便部署不同站點時修改。

2. 管理員通知信組裝與發送

$tmpfilename = tempnam("./tmp", "dm");
$fp = fopen($tmpfilename, "w");
fwrite($fp, "From: ".$Email."\n");
fwrite($fp, "Subject: ".$sender." <".$pagename."-意見回饋表>\n\n");
fwrite($fp, "送信人:".$sender."\n發信IP:".$REMOTE_ADDR."\n發信時間:".$nowtime."\n\n");
fwrite($fp, "回饋表詳細內容:\n------------------------------------------------------\n");
fwrite($fp, "姓名:".$formno1."\n性別:".$formno2."\n年齡:".$formno3."\nE-mail:".$formno4."\n...");
fclose($fp);
$execstr = "cat ".$tmpfilename." | /usr/sbin/sendmail ".$adminmail;
exec($execstr);

使用暫存檔組裝完整郵件標頭與內容,透過系統 sendmail 管道發送。記錄發信者 IP 與時間便於追蹤。

3. 使用者確認信(自動回覆)

$tmpfilename1 = tempnam("./tmp", "dm");
$fp = fopen($tmpfilename1, "w");
fwrite($fp, "From: ".$adminmail."\n");
fwrite($fp, "Subject: 你在[".$pagename."]填寫的<意見回饋表>\n\n");
fwrite($fp, "****此信為自動回覆信件,請勿回覆...****\n\n");
fwrite($fp, "非常感謝你在[".$pagename."]填寫意見回饋表!\n以下是您在".$nowtime."填寫的詳細內容...\n");
fwrite($fp, "姓名:".$formno1."\n性別:".$formno2."\n...意見建議:".$formno11."\n");
fwrite($fp, $pagename.":".$pageline."\nE-mail:".$adminmail);
fclose($fp);
$execstr = "cat ".$tmpfilename1." | /usr/sbin/sendmail ".$Email;
exec($execstr);

寄件人設為管理員信箱,內容包含完整回顯與站點資訊,明確標示為自動回覆避免誤解。

4. 發信記錄 Log

$execstr = "echo $sender $nowtime $REMOTE_ADDR $REMOTE_HOST >> mail.log";
exec($execstr);

簡單的文字檔記錄,包含姓名、時間、IP、主機名,便於事後稽核。

5. 前端 JavaScript 驗證

function save(){
    if(f1.formno1.value!="" && f1.formno2.value!="" && f1.formno3.value!="" 
       && f1.formno4.value!="" && f1.formno11.value!=""){
        f1.submit();
    } else {
        alert("帶*為必填項,請全部填寫後再次提交。\n\n謝謝合作!");
    }
}

檢查五個必填欄位:姓名、性別、年齡、Email、意見建議。未通過阻止送出並彈出提示。

6. HTML 表單結構

表單採用表格佈局,欄位完整涵蓋:

  • 基本資料:姓名*、性別*(單選)、年齡*、Email*
  • 聯絡資訊:工作單位、聯絡地址、郵遞區號、電話、傳真、網址
  • 核心內容:意見或要求*(textarea)
  • 操作按鈕:發送(觸發 JS 驗證)、重設

安全性與架構改進建議

面向現狀風險建議方案
指令注入exec() 直接拼接變數改用 PHPMailer / SwiftMailer 純 PHP 發信
Email Header Injection未過濾換行符過濾 \r\n、使用庫處理標頭
XSS 風險確認頁直接輸出 $_POSThtmlspecialchars() 編碼所有輸出
CSRF 保護無 Token 驗證Session 中產生/驗證 CSRF Token
輸入驗證僅前端 JS,無後端驗證後端必須重新驗證所有欄位
垃圾郵件防護無驗證碼/限流加入 reCAPTCHA / 蜜罐欄位 / IP 限流

現代化重構範例(PHPMailer)

<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'vendor/autoload.php';

$mail = new PHPMailer(true);
try {
    // 管理員通知信
    $mail->setFrom($formno4, $formno1);
    $mail->addAddress($adminmail);
    $mail->Subject = "{$formno1} <{$pagename}-意見回饋表>";
    $mail->Body    = "送信人:{$formno1}\nIP:{$_SERVER['REMOTE_ADDR']}\n時間:{$nowtime}\n\n內容:\n{$formno11}";
    $mail->send();

    // 使用者確認信
    $mail->clearAddresses();
    $mail->setFrom($adminmail, $pagename);
    $mail->addAddress($formno4, $formno1);
    $mail->Subject = "您在[{$pagename}]的意見回饋確認信";
    $mail->Body    = "感謝填寫...\n\n{$formno11}\n\n{$pagename}:{$pageline}";
    $mail->send();
    
    // 顯示成功頁面...
} catch (Exception $e) {
    error_log("Mailer Error: {$mail->ErrorInfo}");
    // 顯示錯誤頁面...
}
?>

部署檢查清單

  • [ ] 伺服器已安裝並設定 sendmail / postfix,或改用 SMTP
  • [ ] ./tmp 目錄存在且 Web 使用者可寫入
  • [ ] mail.log 檔案存在且可寫入
  • [ ] 管理員信箱可正常接收外部郵件
  • [ ] 前端驗證與後端驗證邏輯一致
  • [ ] 已加入 CSRF Token 與驗證碼機制

這個回饋表單展示了經典 PHP 表單處理全流程:驗證、發信、記錄、回顯。雖然使用 exec(sendmail) 的方式在現代架構中較少見,但邏輯結構清晰,遷移至 PHPMailer 等現代庫非常容易。建議部署前務必補強安全防護,避免成為垃圾郵件發送跳板或遭受 XSS/CSRF 攻擊。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved