search
HomeBackend DevelopmentPHP Tutorial管理小型的邮件列表_PHP
管理小型的邮件列表_PHPJun 01, 2016 pm 12:40 PM
cannotmanagesubscriptionUnsubscribe

首先是订阅/退订脚本,它所做的工作就是从数据库表中增加或删除记录。把它叫做"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 = "




your e-mail address:



action:

sub
unsub






";

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




your e-mail address:



action:

sub
unsub






";
} 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 "邮件发送完毕!";
}
?>
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Laravel扩展包管理:轻松集成第三方代码和功能Laravel扩展包管理:轻松集成第三方代码和功能Aug 25, 2023 pm 04:07 PM

Laravel扩展包管理:轻松集成第三方代码和功能引言:在Laravel开发中,我们经常使用第三方代码和功能来提高项目的效率和稳定性。而Laravel扩展包管理系统允许我们轻松地集成这些第三方代码和功能,使得我们的开发工作更加便捷和高效。本文将介绍Laravel扩展包管理的基本概念和使用方法,并通过一些实际的代码示例来帮助读者更好地理解和应用。什么是Lara

如何在麒麟操作系统上进行网络服务器的设置和管理?如何在麒麟操作系统上进行网络服务器的设置和管理?Aug 04, 2023 pm 09:25 PM

如何在麒麟操作系统上进行网络服务器的设置和管理?麒麟操作系统是中国自主开发的一种基于Linux的操作系统。它具有开源、安全、稳定等特点,在国内得到了广泛的应用。本文将介绍如何在麒麟操作系统上进行网络服务器的设置和管理,帮助读者更好地搭建和管理自己的网络服务器。一、安装相关软件在开始设置和管理网络服务器之前,我们需要先安装一些必要的软件。在麒麟操作系统上,可以

如何在麒麟操作系统上进行硬盘空间的管理和清理?如何在麒麟操作系统上进行硬盘空间的管理和清理?Aug 04, 2023 am 09:49 AM

如何在麒麟操作系统上进行硬盘空间的管理和清理?麒麟操作系统是一个基于Linux的操作系统,相比其他操作系统,麒麟提供了更多的自由度和可定制性。在长期的使用过程中,我们经常会遇到硬盘空间不足的问题,这时候就需要进行硬盘空间的管理和清理。本文将介绍如何在麒麟操作系统上进行硬盘空间的管理和清理,包括查看硬盘空间使用情况、删除不必要的文件以及使用磁盘清理工具。首先,

MongoDB技术开发中遇到的事务管理问题解决方案分析MongoDB技术开发中遇到的事务管理问题解决方案分析Oct 08, 2023 am 08:15 AM

MongoDB技术开发中遇到的事务管理问题解决方案分析随着现代应用程序变得越来越复杂和庞大,对数据的事务处理需求也越来越高。作为一种流行的NoSQL数据库,MongoDB在数据管理方面有着出色的性能和扩展性。然而,MongoDB在数据一致性和事务管理方面相对较弱,给开发人员带来了挑战。在本文中,我们将探讨在MongoDB开发中遇到的事务管理问题,并提出一些解

ThinkPHP6中如何进行审核流程管理?ThinkPHP6中如何进行审核流程管理?Jun 12, 2023 am 09:31 AM

随着互联网的发展,越来越多的企业开始使用网络进行业务处理,这就要求企业必须有一套完善的审核流程管理系统来确保业务的安全和规范。在PHP开发中,ThinkPHP6框架提供了便捷的审核流程管理功能,本文将介绍如何在ThinkPHP6中实现审核流程管理。一、ThinkPHP6审核流程管理基本思路ThinkPHP6的审核流程管理基本思路是通过数据库记录来实现,一般需

如何在Linux中进行集群管理如何在Linux中进行集群管理Jun 19, 2023 am 08:21 AM

在高可用性(HA)的系统中,集群是不可或缺的一部分。当一个单一节点不能提供足够的可用性或性能时,集群是一种实用的解决方案。Linux是非常流行的集群环境,它通过多种途径来提供集群的实现和支持。在本文中,我们将学习如何在Linux中进行集群管理。集群管理软件Linux使用许多集群管理软件来帮助管理员轻松地管理多台服务器的集群实例。有许多工具可供选择,其

Vue应用中的HTTPS证书绑定管理Vue应用中的HTTPS证书绑定管理Jun 10, 2023 pm 05:33 PM

随着互联网技术的快速发展,越来越多的应用程序将安全性放在首位,其中HTTPS证书的管理绑定显得越来越重要。在Vue应用中,HTTPS证书的绑定管理也是至关重要的一环,本文将介绍Vue应用中如何进行HTTPS证书的绑定管理。一、HTTPS证书的基础知识HTTPS证书(SSL/TLS证书)的作用是在网站与用户之间建立加密通道,确保用户的数据安全。当用户在浏览器中

麒麟操作系统如何提供多屏幕工作环境的扩展和管理?麒麟操作系统如何提供多屏幕工作环境的扩展和管理?Aug 04, 2023 am 10:15 AM

麒麟操作系统如何提供多屏幕工作环境的扩展和管理?随着计算机技术的不断发展,多屏幕显示已经成为现代工作环境中的一个常见需求。为了满足用户对于多任务处理和工作效率的要求,麒麟操作系统提供了一套强大的多屏幕扩展和管理功能。本文将介绍麒麟操作系统如何实现多屏幕工作环境的扩展和管理,并附上相应的代码示例。多屏幕工作环境的扩展麒麟操作系统通过提供多屏幕工作环境的扩展功能

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.