這是一個功能完整的 PHP 意見回饋表單,包含前端 JavaScript 驗證、後端雙向 Email 發送(管理員通知 + 使用者確認信)、資料記錄與回顯確認頁。可輕鬆修改為聯絡表單、線上報名等用途。
$adminmail = "admin@acme.oso.com.cn"; // 管理員信箱
$pagename = "Acme"; // 站點名稱
$pageline = "https://acme.oso.com.cn"; // 站點網址
集中管理寄件人資訊與站點識別,方便部署不同站點時修改。
$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 與時間便於追蹤。
$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);
寄件人設為管理員信箱,內容包含完整回顯與站點資訊,明確標示為自動回覆避免誤解。
$execstr = "echo $sender $nowtime $REMOTE_ADDR $REMOTE_HOST >> mail.log";
exec($execstr);
簡單的文字檔記錄,包含姓名、時間、IP、主機名,便於事後稽核。
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、意見建議。未通過阻止送出並彈出提示。
表單採用表格佈局,欄位完整涵蓋:
| 面向 | 現狀風險 | 建議方案 |
|---|---|---|
| 指令注入 | exec() 直接拼接變數 | 改用 PHPMailer / SwiftMailer 純 PHP 發信 |
| Email Header Injection | 未過濾換行符 | 過濾 \r\n、使用庫處理標頭 |
| XSS 風險 | 確認頁直接輸出 $_POST | htmlspecialchars() 編碼所有輸出 |
| CSRF 保護 | 無 Token 驗證 | Session 中產生/驗證 CSRF Token |
| 輸入驗證 | 僅前端 JS,無後端驗證 | 後端必須重新驗證所有欄位 |
| 垃圾郵件防護 | 無驗證碼/限流 | 加入 reCAPTCHA / 蜜罐欄位 / IP 限流 |
<?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}");
// 顯示錯誤頁面...
}
?>
./tmp 目錄存在且 Web 使用者可寫入mail.log 檔案存在且可寫入這個回饋表單展示了經典 PHP 表單處理全流程:驗證、發信、記錄、回顯。雖然使用 exec(sendmail) 的方式在現代架構中較少見,但邏輯結構清晰,遷移至 PHPMailer 等現代庫非常容易。建議部署前務必補強安全防護,避免成為垃圾郵件發送跳板或遭受 XSS/CSRF 攻擊。