管理小型的郵件清單_PHP

來源:互聯網
上載者:User
關鍵字 小型 管理 退訂 訂閱 不能 die
首先是訂閱/退訂指令碼,它所做的工作就是從資料庫表中增加或刪除記錄。把它叫做"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 = "



";

}--------------------------------------------------------------------------------
  你會注意到我把文本放在$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 = "

感謝您的註冊!


";

} else {

// 如果$check_num不為0,則使用者已經提交過了,你應該讓他們知道

$text_block = "

你已經訂閱過了!


";

}

}--------------------------------------------------------------------------------
  下一步:當$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 = "

不能在列表中找到你的e-mail地址!


你還沒有被退訂,因為你所輸入的e-mail不在資料庫中。";

} else {

// 如果$check_num不為0,則使用者在列表中,所以可以被退訂

$sql = "delete from subscribers
where email_addr = \"$email\"";

@mysql_query($sql) or die ("不能刪除email。");

$text_block = "

退訂成功!


";
}

}

?>--------------------------------------------------------------------------------
  現在所有艱難的工作已經做完了,只剩下在一塊HTML中輸出$text_block變數了:

--------------------------------------------------------------------------------



訂閱/退訂




訂閱/退訂







--------------------------------------------------------------------------------
  下面是完整的程式清單:

--------------------------------------------------------------------------------

// 串連資料庫
$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 = "



";
} 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 = "

感謝您的註冊!


";

} else {

// 如果$check_num不為0,則使用者已經提交過了,你應該讓他們知道

$text_block = "

你已經訂閱過了!


";

}

} 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 = "

不能在列表中找到你的e-mail地址!


你還沒有被退訂,因為你所輸入的e-mail不在資料庫中。";

} else {

// 如果$check_num不為0,則使用者在列表中,所以可以被退訂

$sql = "delete from subscribers
where email_addr = \"$email\"";

@mysql_query($sql) or die ("不能刪除email。");

$text_block = "

退訂成功!


";
}

}
?>




訂閱/退訂




訂閱/退訂







--------------------------------------------------------------------------------
  現在你已經有了合適的訂閱/退訂機制,我將向你展示如何發出一封新聞信件,只使用一個簡單的表單
和一個郵件指令碼。("while"迴圈是你的好朋友!)。首先,是名為"send_mail.html"的表單。表單的動作
應該是象"do_send_mail.phtml"的什麼東西,並且我只使用了一個用來寫主題的文字欄位(subject)和一個
寫信件內容的文本域欄位(newsletter)。你可以根據需要使用表單欄位,只要適當地修改表單和指令碼。

--------------------------------------------------------------------------------



發送郵件




Send a Newsletter







--------------------------------------------------------------------------------
  最後一點說明的是關於表單的動作,這個指令碼叫做"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\" \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\" \n";


while ($row = mysql_fetch_array($res)) {

$email_addr = $row[0];

mail("$email_addr", "$subject", $newsletter, $headers);

}

echo "郵件發送完畢!";
}
?>
  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.