管理小型的郵件列表 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 管理小型的郵件列表 (http://www.webasp.net/article/16/15108.htm) |
| -- 作者:未知 -- 發佈日期: 2004-11-25 |
| 首先是訂閱/退訂腳本,它所做的工作就是從數據庫表中增加或刪除記錄。把它叫做"manage.phtml" 或
差不多的什麼東西。這樣呢,就需要後台是某種數據庫,在上面可以創建訂閱表。根據政治中的半數原則, 所以我將使用MySQL作為這個例子的數據庫。你可以使用任何你常用的數據庫,只是根據PHP手冊替換正確的 數據庫相關函數。 在我的訂閱表中,我使用了兩個字段:郵件地址(email_addr)和添加日期(date_added)。你可以根據需 要增加字段,或者將date_added字段刪除。在這個例子中,我只是向你展示我做了什麼,你可以適當的進行 修改。在我的訂閱表中,email_addr字段是一個不重複字段,意味著你不能增加另一個與之完全一樣的e-mail 地址。這個可以避免重複訂閱,而且當用戶想退訂時,也使刪除記錄的方法變得簡單和可靠。 那麼,讓我們創建訂閱/退訂表單吧(manager.phtml或你想起的什麼名字)。我使用同一個文件處理訂 閱和退訂,也包括表格自身的動作,所以可能有點複雜。我將從頭到尾講解,然後把所有的片段組合在一起, 放在一個表單中。 在腳本的開始處,是打開數據庫和準備時間戳。在開始時處理這些不顯眼的東西總是可以為我減輕一點 壓力。 -------------------------------------------------------------------------------- // 連接數據庫 $db = mysql_connect("servername", "username", "password") or die ("不能連接。"); mysql_select_db("yourDB", $db) or die ("不能選擇數據庫。"); // 得到時間戳 $add_date = date("Y-m-d"); -------------------------------------------------------------------------------- 我們希望$op的值是"ds"。它不是複雜的程序縮寫----我創的,表示"do something(做某事)" 。所以, 腳本的第一件事就是查看$op的值是不是等於"ds"。這個值只有當表單被提交後才會被發送上來。所以如果 $op的值不是"ds",那麼說明用戶還沒有看過表單,所以應該把表單顯示出來: -------------------------------------------------------------------------------- if ($op != "ds") { //需要訂閱/退訂 $text_block = " <form name=\"form\" method=post action=\"$PHP_SELF\"> <input type=hidden name=op value=ds> <p><strong>your e-mail address:</strong><br> <input type=text name=\"email\" size=25></p> <p><strong>action:</strong><br> <input type=radio name=\"action\" value=\"sub\" checked> sub <input type=radio name=\"action\" value=\"unsub\"> unsub</p> <P><input type=submit name=\"submit\" value=\"do it\"></p> </form> "; }-------------------------------------------------------------------------------- 你會注意到我把文本放在$text_block變量中。通過把文本放在一個變量中,接下來我所要做的就是在 後面在主HTML模板內輸出$text_block的值。這是個人習慣問題,你可以根據你喜歡的時間和方式輸出文本。 這個表單的動作是$PHP_SELF ,可以想像一下,它的意思就是當按下了提交按鈕之後,它將會被重新裝 入。然後,你可以看到這個表單有三個字段:一個隱藏字段,用於給$op賦值為"ds" ;一個文本字段,叫做 "email",在這裡用戶將填入他或她的email地址;還有一個是單選按鈕集,叫做"action",根據它,用戶可 以決定執行哪一個動作(訂閱或退訂)。 在表單被提交之後,$op將等於"ds",並且$action的值將包含"sub"或"unsub"。那麼,我們繼續看上面 的if...語句,一旦提交,它將被跳過(因為$op=="ds")。如果$op的值為"ds"並且$action的值"sub"(訂閱), 下面的else if...句被執行。這段代碼檢查e-mail是否已經存在於訂閱表中,如果不存在則將其插入到表中 並打印出響應,否則忽略。 -------------------------------------------------------------------------------- else if (($op == "ds") && ($action == "sub")) { // 檢查郵件還未提交則提交它們,否則返回信息 $check = "select email_addr from subscribers where email_addr = \"$email\""; $check_result = mysql_query($check) or die("不能執行地e-mail地址的檢查。"); $check_num = mysql_num_rows($check_result); if ($check_num == 0) { // 如果$check_num為0,則沒有找到匹配的記錄,用戶應該被提交 $sql = "insert into subscribers values(\"$email\", \"$add_date\")"; @mysql_query($sql) or die ("Couldn't insert email."); $text_block = " <P>感謝您的註冊!</p> "; } else { // 如果$check_num不為0,則用戶已經提交過了,你應該讓他們知道 $text_block = " <P>你已經訂閱過了!</p> "; } }-------------------------------------------------------------------------------- 下一步:當$action的值為"unsub"(unsubscribe,退訂)而不是"sub"時應該做些什麼。好,就像上面 一樣簡單,那麼對else if...語句擴展一下,多加一塊代碼,用於檢查e-mail在被刪除前是否存在於訂閱表 中,如果存在則刪除它並且打印響應,否則忽略它。 -------------------------------------------------------------------------------- else if (($op == "ds") && ($action == "unsub")) { // 檢查已經訂閱過,然後將他們退訂,否則返回信息 $check = "select email_addr from subscribers where email_addr = \"$email\""; $check_result = mysql_query($check) or die("不能執行對e-mail地址的檢查。"); $check_num = mysql_num_rows($check_result); if ($check_num == 0) { // 如果$check_num為0,則沒有找到匹配記錄,用戶不能被退訂 $text_block = " <P>不能在列表中找到你的e-mail地址!</p> <P>你還沒有被退訂,因為你所輸入的e-mail不在數據庫中。"; } else { // 如果$check_num不為0,則用戶在列表中,所以可以被退訂 $sql = "delete from subscribers where email_addr = \"$email\""; @mysql_query($sql) or die ("不能刪除email。"); $text_block = " <P>退訂成功!</p> "; } } ?>-------------------------------------------------------------------------------- 現在所有艱難的工作已經做完了,只剩下在一塊HTML中輸出$text_block變量了: -------------------------------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <TITLE>訂閱/退訂</TITLE> </HEAD> <BODY> <h1>訂閱/退訂</h1> <?php echo "$text_block"; ?> </BODY> </HTML> -------------------------------------------------------------------------------- 下面是完整的程序清單: -------------------------------------------------------------------------------- <? // 連接數據庫 $db = mysql_connect("servername", "username", "password") or die ("不能連接。"); mysql_select_db("yourDB", $db) or die ("不能選擇數據庫。"); // 得到時間戳 $add_date = date("Y-m-d"); if ($op != "ds") { //需要訂閱/退訂 $text_block = " <form name=\"form\" method=post action=\"$PHP_SELF\"> <input type=hidden name=op value=ds> <p><strong>your e-mail address:</strong><br> <input type=text name=\"email\" size=25></p> <p><strong>action:</strong><br> <input type=radio name=\"action\" value=\"sub\" checked> sub <input type=radio name=\"action\" value=\"unsub\"> unsub</p> <P><input type=submit name=\"submit\" value=\"do it\"></p> </form> "; } else if (($op == "ds") && ($action == "sub")) { // 檢查郵件還未提交則提交它們,否則返回信息 $check = "select email_addr from subscribers where email_addr = \"$email\""; $check_result = mysql_query($check) or die("不能執行地e-mail地址的檢查。"); $check_num = mysql_num_rows($check_result); if ($check_num == 0) { // 如果$check_num為0,則沒有找到匹配的記錄,用戶應該被提交 $sql = "insert into subscribers values(\"$email\", \"$add_date\")"; @mysql_query($sql) or die ("Couldn't insert email."); $text_block = " <P>感謝您的註冊!</p> "; } else { // 如果$check_num不為0,則用戶已經提交過了,你應該讓他們知道 $text_block = " <P>你已經訂閱過了!</p> "; } } else if (($op == "ds") && ($action == "unsub")) { // 檢查已經訂閱過,然後將他們退訂,否則返回信息 $check = "select email_addr from subscribers where email_addr = \"$email\""; $check_result = mysql_query($check) or die("不能執行對e-mail地址的檢查。"); $check_num = mysql_num_rows($check_result); if ($check_num == 0) { // 如果$check_num為0,則沒有找到匹配記錄,用戶不能被退訂 $text_block = " <P>不能在列表中找到你的e-mail地址!</p> <P>你還沒有被退訂,因為你所輸入的e-mail不在數據庫中。"; } else { // 如果$check_num不為0,則用戶在列表中,所以可以被退訂 $sql = "delete from subscribers where email_addr = \"$email\""; @mysql_query($sql) or die ("不能刪除email。"); $text_block = " <P>退訂成功!</p> "; } } ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <TITLE>訂閱/退訂</TITLE> </HEAD> <BODY> <h1>訂閱/退訂</h1> <?php echo "$text_block"; ?> </BODY> </HTML> -------------------------------------------------------------------------------- 現在你已經有了合適的訂閱/退訂機制,我將向你展示如何發出一封新聞信件,只使用一個簡單的表單 和一個郵件腳本。("while"循環是你的好朋友!)。首先,是名為"send_mail.html"的表單。表單的動作 應該是象"do_send_mail.phtml"的什麼東西,並且我只使用了一個用來寫主題的文本字段(subject)和一個 寫信件內容的文本域字段(newsletter)。你可以根據需要使用表單字段,只要適當地修改表單和腳本。 -------------------------------------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <HTML> <HEAD> <TITLE>發送郵件</TITLE> </HEAD> <BODY> <h1>Send a Newsletter</h1> <FORM ACTION="do_send_mail.phtml" METHOD="post"> <P><strong>給出一個主題:</strong><br> <input type="text" name="subject" size=30></p> <P><strong>郵件內容:</strong><br> <textarea name="newsletter" cols=40 rows=30 wrap=virtual></textarea> <p><input type="submit" name="submit" value="Send Newsletter"></p> </form> </BODY> </HTML> -------------------------------------------------------------------------------- 最後一點說明的是關於表單的動作,這個腳本叫做"do_send_mail.phtml"。腳本首先查找$subject和 $newletter的值,並且如果他們的值有一個為空就重定向到表單: -------------------------------------------------------------------------------- if (($subject =="") || ($newsletter == "")) { header("Location: http://www.yourdomain.com/send_mail.phtml"); exit; }-------------------------------------------------------------------------------- 接著,連接到數據庫並且從訂閱表中取出郵件地址: -------------------------------------------------------------------------------- // 連接數據庫 $db = mysql_connect("servername", "username", "password") or die ("不能連接。"); mysql_select_db("yourDB", $db) or die ("不能選擇數據庫。"); $sql = "select email_addr from subscribers"; $res = mysql_query($sql) or die("不能得到郵件地址。"); -------------------------------------------------------------------------------- 在進入到發送郵件信息的循環之前,要建立額外的郵件頭。在這裡,我只用了"From:"行: $headers = "From: \"Your Mailing List\" <you@yourdomain.com>\n"; 現在進入發送郵件的循環中。首先,使用mysql_fetch_array 函數(或同你的數據庫相似的函數)將每 條記錄放在一個數組中。如果你取回的字段多於一個可能更有意義,我用它是因為它快。下面的語句對結果 集進行遍歷並且通過mail()函數對每個在列表中的郵箱發送e-mail: -------------------------------------------------------------------------------- while ($row = mysql_fetch_array($res)) { $email_addr = $row[0]; mail("$email_addr", "$subject", $newsletter, $headers); } -------------------------------------------------------------------------------- $subject和$newletter的值是在前面的表單中輸入的。在腳本的最後增加一行輸出語句,以便你知道執 行完畢了。這就是全部處理了!完整的"do_send_mail.phtml"腳本看上去為: -------------------------------------------------------------------------------- <? if (($subject =="") || ($newsletter == "")) { header("Location: http://www.yourdomain.com/send_mail.phtml"); exit; } else { // 連接數據庫 $db = mysql_connect("servername", "username", "password") or die ("不能連接。"); mysql_select_db("yourDB", $db) or die ("不能選擇數據庫。"); $sql = "select email_addr from subscribers"; $res = mysql_query($sql) or die("不能得到郵件地址。"); $headers = "From: \"Your Mailing List\" <you@yourdomain.com>\n"; while ($row = mysql_fetch_array($res)) { $email_addr = $row[0]; mail("$email_addr", "$subject", $newsletter, $headers); } echo "郵件發送完畢!"; } ?> |
| webasp.net |