国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

讓PHP管理小型的郵件列表

2024-05-04 21:51:13
字體:
來源:轉載
供稿:網友

最近有一個讀者問我關于ThickBook新聞列表中處理訂閱/退訂的機制,并且是如何與實際的發送信息相配合,給郵件列表中的所有收信人的。問題提的不錯,有一個相當容易的方法,但是我首先要說的是我所做的沒有任何投機取巧的地方,因為我非常的酷----就是有,我使用這個方法也只是因為我懶。注意,在市面上有非常多的郵件列表軟件,可以把它裝在系統上,并且也有一些別的,更多的是結合在一起的腳本集,你 也可以用來做同樣的事情。但是,正如我所說,我是一個懶人,不想下載和安裝任何東西,所以我生成了幾 個相當簡單的頁面,用來執行我所要求的工作。很希望,有人能從中學到一些東西。

首先是訂閱/退訂腳本,它所做的工作就是從數據庫表中增加或刪除記錄。把它叫做"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 "郵件發送完畢!";
}
?>
--------------------------------------------------------------------------------

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 五寨县| 连平县| 广南县| 祁阳县| 乌兰县| 剑阁县| 富民县| 武胜县| 桑日县| 晋宁县| 太保市| 内乡县| 康保县| 仙游县| 新化县| 高唐县| 拉萨市| 方山县| 哈尔滨市| 泰安市| 靖宇县| 北川| 扶余县| 同德县| 郸城县| 青岛市| 华容县| 彰化县| 孙吴县| 仁寿县| 扶沟县| 清水河县| 秦皇岛市| 吉木萨尔县| 获嘉县| 临安市| 扬中市| 科技| 安阳市| 延庆县| 德化县|