首页 > PHP教程

功能齐全的发送PHP邮件类

PHP--下面这个类的功能则很强大,不但能发html格式的邮件,还可以发附件
<?php
class Email {
//---设置全局变量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 发件人
var $mailSubject = ""; // 主题
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函数setTo($inAddress) :用于处理邮件的地址 参数 $inAddress
为包涵一个或多个字串,email地址变量,使用逗号来分割多个邮件地址
默认返回值为true
**********************************************************/
function setTo($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i ){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailTo = implode($addressArray, ",");
return true; }
/**************************************************
函数 setCC($inAddress) 设置抄送人邮件地址
参数 $inAddress 为包涵一个或多个邮件地址的字串,email地址变量,
使用逗号来分割多个邮件地址 默认返回值为true
**************************************************************/
function setCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i ){ if($this->checkEmail($addressArray[$i])==false) return false; }
//--所有合法的email地址存入数组中
$this->mailCC = implode($addressArray, ",");
return true; }
/***************************************************
函数setBCC($inAddress) 设置秘密抄送地址 参数 $inAddress 为包涵一个或多
个邮件地址的字串,email地址变量,使用逗号来分割多个邮件地址 默认返回值为
true
******************************************/
function setBCC($inAddress){
//--用explode()函数根据”,”对邮件地址进行分割
$addressArray = explode( ",",$inAddress);
//--通过循环对邮件地址的合法性进行检查
for($i=0;$i<count($addressArray);$i )
{ if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入数组中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/*****************************************************************
函数setFrom($inAddress):设置发件人地址 参数 $inAddress 为包涵邮件
地址的字串默认返回值为true
***************************************/
function setFrom($inAddress){
if($this->checkEmail($inAddress)){
$this->mailFrom = $inAddress;
return true;
} return false; }
/**********************
函数 setSubject($inSubject) 用于设置邮件主题参数$inSubject为字串

阅读全文

用LibTemplate实现静态网页的生成

原来在dev-club发表的一篇文章,将怎么用模板处理程序PHPlib 中的template.inc实现静态网页的生成,呵呵,居然被列入精华,并被多个网站转载,想来这是荣幸。其实网上这方面的东西很多了,我上此发布的所谓IAMS( iwind 文章治理系统),里面也有,有心人可以看一下。下面我只是简要在总结一次。

现在一般说生成静态网页的方法有三种,一个是配置服务器,大家可以到http://www.devarticles.com/c/b/PHP/ 去找找看,对于这个很多地方都有的。另外一个是用ob_函数控制输出。方法如下:先用ob_start();打开输出缓冲器,然后是对数据的分析,操作等等,跟着用ob_get_contents();获取缓冲区的内容,然后再写入文件。根据这个步骤,可以写出以下程序:
<?php
ob_start();
//主体部分,数据操作,处理,输出等等。。。
require”global.php”;
mysql_connect(“localhost”,”root”,””);
…..
//获取缓冲区内容
$contents=ob_get_contents();
//假如不想输出任何东西,可以加上这句
ob_end_clean();
//写入目的文件
$fp=@fopen($targetFile,”w ”) or die(“打开文件时出错”);
fwrite($fp,$contents);
?>

这样就把这个动态页面的内容写入了静态页面,$targetFile.像有的网站首页内容很多,要调用n多个查询语句时,不妨定时生成静态网页,既大幅提高了访问速度,也减轻了服务器负担。

你可以看出来,我用ob_只是处理单个页面,对于批量写入或更新多个页面,这个方法就不行了。这就是我要讲的第三种方法,用模板。模板是个好东东,现在大家都或多或少在用它,建议还不会简单模板处理的网友,花点时间去学它,一般的模板处理程序都很简单的。用模板实现静态网页的生成是非常简单的,方法就是获取分析结果,把分析结果写入文件。下面就以PHPlib中的template.inc来谈谈假如用模板生成静态网页。

一, 修改template.inc
加入以下的几个函数:
//将分析结果保存到文件中去
function savetofile ($dir,$varname){
$data=$this->finish($this->get_var($varname));
$fp=fopen($dir,"w ");
fwrite($fp,$data);
}
//清除已赋值数组
function renew(){
$this->varkeys=array();
$this->varvals=array();
$this->file=array();
}

第一个函数是结果保存到静态文件中,第二个是把所有的模板分析变量都置为空,以免批量处理时相互影响。

二,实现静态网页生成。
<?php
$itpl->set_file(“main”,”mian.tpl”);
//分析模板变量
…..
//分析main&#61664;mains
$tpl->parse("mains","main");
//把分析结果mains存入main.html
$tpl->savetofile("main.html","mains");
//置空
$tpl->renew();//至关重要
?>

呵呵,是不是很简单,main.html就是我们要的内容。下面是一个结合数据库的例子,并用函数封装了起来。
<?php
//$aid是数据库中的文章id,$table是表名称,$template是模板地址,$tpl是template.inc的一个实例
//每一个aid对应一个静态网页地址,都存在一个数据表中
//表的结构类似于 aid target title
// 1 a1.html ….
// 2 a2.html ….
// 3 a3.html ….
function staticInfo($aid){
global $table,$template,$tpl;

阅读全文

使用Perl常规表达式进行匹配

长期以来,Perl以其对常规表达式的固有支持,一直是非常流行的文本处理工具。在这篇入门性文章中,我们将带领你简单了解如何在你自己的程序中使用常规表达式,实现更加强大的文本搜索和替代功能。

我们首先了解最简单的常规表达式:匹配。假如在字符串中找到相匹配的模式,匹配操作就返回真值。因此下面的表达式:

$string =~ m/text/

只有在变量“$string”中的字符串包含子字符串“text”时才返回真值。这是最基本的常规表达式,它对每个字符进行逐字匹配。当然,这只是对常规表达式作用的一个尝试。以需要查找以“ext”结尾的四个字母的单词为例。为达到这个目的,我们使用一个非凡的字符“.”,常规表达式中的句号告诉Perl匹配其中的任何单独的字符。因此下面这个表达式:

$string =~ m/.ext/

将与单词“text”和“next”匹配。

不过,这个表达式并非完美,因为它与包含“ext”的更长单词的一部分相匹配,如“dextrous”和“flextime”。我们可以使用锚字符来限制匹配的位置。“^”字符匹配字符串的开头,因此:

$string =~ m/^.ext/

与“dextrous”匹配,但不与“context”匹配。

同样,“$”字符匹配字符串的结尾:

$string =~ m/.ext$/

与“context”匹配,但不与“dextrous”匹配。

假如你只希望匹配以“ext”结尾的四个字母的字符串,那么你可以组合使用上面的两个表达式,像这样:

$string =~ m/^.ext$/

现在,假如你需要匹配一组给定的字符,而不是句号位置的任何字符,那该怎么办呢?常规表达式通过使用方括号提供一个方法。以下面的表达式为例:

$string =~ m/^[tT]ext$/

这个表达式只与单词“text”和“Text”匹配。一对方括号将转换其中的任何单个字符。这个功能相当强大,例如:

$string =~ m/[aeiouAEIOU]/

假如$string变量中含有元音,则上面的例子返回真值。

假如括号中的第一个字符是“^”,这时它就不是一个锚字符,而是执行“非”操作,匹配不在括号内的任意字符,因此假如$string变量中只包含辅音或标点符号,可以对上面的例子进行调整,使它返回真值:

$string =~ m/[^aeiouAEIOU]/

方括号符号还可以指定字符的范围,让你不必列举一整串连续的数字或字母

阅读全文

虚拟主机中对PHP的特殊设置

虚拟主机设置
<VirtualHost 127.0.10.10>
ServerAdmin webmaster@hostmachine.com
DocumentRoot /www/virtual.com/htdocs
ServerName www.virtual.com
UserDir /www/virtual.com/htdocs
ScriptAlias /cgi-bin/ /www/virtual.com/cgi-bin/
ErrorLog /www/virtual.com/logs/error_log
CustomLog /www/virtual.com/logs/access_log common

目录设置
<Directory /www/virtual.com/htdocs>
# 对该虚拟主机设置是否使用php3
php3_engine On
# 设置php3出错信息的调试级别
php3_error_reporting 1
# 设置是否记录php3出错日志
php3_log_errors On
# 设置php3的出错日志文件
php3_error_log /www/virtual.com/logs/php3_error_log
# 设置一个php3线程的最长存活时间
php3_max_execution_time 180
# 设置用户临时上载目录
php3_upload_tmp_dir /www/virtual.com/htdocs/tmp
# 设置包含头文件
php3_include_path /www/virtual.com/htdocs/include

可执行目录设置

Options Indexes FollowSymLinks
AllowOverride All
Order allow,deny
Allow from all

阅读全文

PHP如何更好更有效的实现---用户注册页面

当程序员的人应该都去过论坛,都在应该注册过论坛的用户吧.论坛上用户注册的步骤分为几部:
第一步 协议页面, 只有同意这个协议才可以进入下一步注册
第二步 表单输入页面, 输入用户的注册信息
第三步 注册结果页面,提示注册成功


在实际工作中,假如我们要开发实现这种注册页面,要注重很多的问题:

1用户跳过"第一步",没有阅读协议页面,直接通过第二步的url直接访问表单输入页面.
2用户在完成"第三步"的时候,不停的刷新页面,这个用户输入的信息就在每刷新一次的时候被重新保存一次
3用户在完成"第三步"的时候,点击后退,修改某个信息后,再次提交.


类似这种得表单在web开发的过程中会经常碰到, 对于第3点, 几乎目前所有的论坛中都有这个问题存在,;第2点在一些留言板中经常碰到, 但是怎么作才可以避免上述的问题呢?


今天老板让我帮别人做个文件上传的东西, 答应任何人来上传符合要求文件, 页面模板已经设计好了, 就是和用户注册的步骤是一样的, 分三步骤. 以前做过类似的东西, 但是防刷新机制设计的不是很好. 反正今天没事做, 就稍微研究一下, 看看如何实现代码可以避免上述的问题.
-----------------------------------------------
-----------------------------------------------
下面是个人设计的实现代码,可以避免上述的问题. 通过浏览器访问register.php,在输入"用户名"和"地址"的时候, 两个都不能为空,为空的时候,会提示错误信息; 当两个输入框都不为空的时候, 可以提交成功,提交成功以后,你再进行刷新和后退,看看是不是达到了效果了.


文件一: config.inc.php

<?php

//开始session
session_start();

//设置不进行本地缓存
header('Expires: '.date('D,d M Y H:i:s',mktime(0,0,0,1,1,2000)).' GMT');
header('Last-Modified:'.gmdate('D,d M Y H:i:s').' GMT');
header('Cache-control: private, no-cache,must-revalidate');
header('Pragma: no-cache');

?>


文件二: register.php

<?php

require_once "config.inc.php";

if(isset($_SESSION[step2]) && isset($_POST[step2])) {
//注册的最后一步
$errorStr = formStep3();
if($errorStr!=null){
require_once('step2.html');
}else{
require_once('step3.html');
unset($_SESSION[step2], $_SESSION[step1]);
}

} else if(isset($_SESSION[step1]) && isset($_GET[step1])) {
//注册的第二步
require_once('step2.html');
$_SESSION[step2] = 1;

} else {

阅读全文

发布一个最强的PHP通用分页类

假如你学过Asp.net,你一定知道它里面有一个叫datalist之类自带的分页功能十分强大,这里的这个类就模拟了一部份这个功能,我敢用“强大”来定义它,是因为作为一个通用的页类,这个类真正做到了“通用”。
废话少说,马上介绍一下是如何使用的。
1、先新建一个用于测试的表
CREATE TABLE `test` (
`aa` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`bb` VARCHAR(50) NOT NULL,
`cc` VARCHAR(50) NOT NULL,
`tt` INT DEFAULT '0' NOT NULL
);
2、制作一个模板文件,保存为:test.htm
{dede:page pagesize=15/}
<table width='100%' border='0' cellpadding='1' cellspacing='1' bgcolor='#CCCCCC'>
<tr bgcolor='#F8FFEE' align='center'>
<td width='10%'>aa</td>
<td width='30%'>bb</td>
<td width='30%'>cc</td>
<td width='30%'>tt</td>
</tr>
{dede:datalist}
<tr bgcolor='#FFFFFF' align='center'>
<td>[field:aa/]</td>
<td>[field:bb/]</td>
<td>[field:cc/]</td>
<td>[field:tt function='date("Y-m-d H-i-s","@me")'/]</td>
</tr>
{/dede}
<tr bgcolor='#F8FFEE'>
<td colspan='4'>
{dede:pagelist listsize=3/}
</td>
</tr>
</table>
3、编写调用这个类的代码
数据库的连接信息均在config_base.php这个文件是设定
showtable.php
<?
require("inc_datalist.php");
$dlist = new DataList();
$dlist->Init();
$dlist->SetTemplet("./test.htm");
$dlist->SetSource("select * from ttt");
$liststring = $dlist->Display();

阅读全文

escape和urldecode

来自 http://cn.php.net/urldecode 评论中的例子,但是中文经escape处理后的字符串再执行此函数,返回的是中文的utf-8编码.

function unicode_urldecode($url)
{
preg_match_all('/%u([[:alnum:]]{4})/', $url, $a);

foreach ($a[1] as $uniord)
{
$dec = hexdec($uniord);
$utf = '';

if ($dec < 128)
{
$utf = chr($dec);
}
else if ($dec < 2048)
{
$utf = chr(192 (($dec - ($dec % 64)) / 64));
$utf .= chr(128 ($dec % 64));
}
else
{
$utf = chr(224 (($dec - ($dec % 4096)) / 4096));
$utf .= chr(128 ((($dec % 4096) - ($dec % 64)) / 64));
$utf .= chr(128 ($dec % 64));
}

$url = str_replace('%u'.$uniord, $utf, $url);
}

return urldecode($url);
}

阅读全文

学习动态网页PHP技术常见问题汇总解答

1:为什么我得不到变量

我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值?

在PHP4.2以后的版本中reGISter_global默认为off
若想取得从另一页面提交的变量:

方法一:在PHP.ini中找到register_global,并把它设置为on.
方法二:在接收网页最前面放上这个extract($_POST);extract($_GET);(注重extract($_SESSION)前必须要有Session_Start()).
方法三:一个一个读取变量$a=$_GET["a"];$b=$_POST["b"]等,这种方法虽然麻烦,但比较安全.

2:调试你的程序

在运行时必须知道某个变量为何值。我是这样做的,建立一文件debug.php,其内容如下:

PHP代码:

<?PHP
Ob_Start();
Session_Start();
Echo "<pre>";

Echo "本页得到的_GET变量有:";
Print_R($_GET);

Echo "本页得到的_POST变量有:";
Print_R($_POST);

Echo "本页得到的_COOKIE变量有:";
Print_R($_COOKIE);

Echo "本页得到的_SESSION变量有:";
Print_R($_SESSION);

Echo "</pre>";
?>

然后在php.ini中设置:include_path = "c:/php",并将debug.php放在此文件夹,以后就可以在每个网页里包含此文件,查看得到的变量名和值.

3:如何使用session

凡是与session有关的,之前必须调用函数session_start();

为session付值很简单,如:

PHP代码:

<?php
Session_start();
$Name = "这是一个Session例子";
Session_Register("Name");//注重,不要写成:Session_Register("$Name");
Echo $_SESSION["Name"];
//之后$_SESSION["Name"]为"这是一个Session例子"
?>

在php4.2之后,可以为session直接付值:

PHP代码:

<?PHP
Session_Start();
$_SESSION["name"]="value";
?>

取消session可以这样:

  PHP代码:

<?php
session_start();
session_unset();
session_destroy();
?>

取消某个session变量在php4.2以上还有BUG.

阅读全文

PHP版的验证码程序

<?php
//生成验证码图片
Header("Content-type: image/PNG");
srand((double)microtime()*1000000);//播下一个生成随机数字的种子,以方便下面随机数生成的使用

session_start();//将随机数存入session中
$_SESSION['authnum']="";
$im = imagecreate(62,20); //制定图片背景大小

$black = ImageColorAllocate($im, 0,0,0); //设定三种颜色
$white = ImageColorAllocate($im, 255,255,255);
$gray = ImageColorAllocate($im, 200,200,200);

imagefill($im,0,0,$gray); //采用区域填充法,设定(0,0)

while(($authnum=rand()0000)<10000);
//将四位整数验证码绘入图片
$_SESSION['authnum']=$authnum;
imagestring($im, 5, 10, 3, $authnum, $black);
// 用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 座标处(图像的左上角为 0, 0)。
//假如 font 是 1,2,3,4 或 5,则使用内置字体

for($i=0;$i<200;$i ) //加入干扰象素
{
$randcolor = ImageColorallocate($im,rand(0,255),rand(0,255),rand(0,255));
imagesetpixel($im, rand()p , rand()0 , $randcolor);
}


ImagePNG($im);
ImageDestroy($im);
?>

阅读全文

根据来路是否为搜索引擎来决定是否跳出弹窗代码

代码: <?php
$referer = $_SERVER['HTTP_REFERER'];
if(!$referer == ''){
if(ereg('http',$referer)){
$referer = @explode('.',$referer);
if(is_array($referer)){
$referer = $referer['1'];
if($referer == 'google' OR $referer == 'baidu'){
?>
<script language="javascript">
<!--
window.open ('http://web.etoow.com', 'ad', 'height=600, width=800, top=0,left=0,toolbar=yes, menubar=yes, scrollbars=yes, resizable=yes, location=yes, status=yes')
//写成一行
-->
</script>
<?php

}
}
}
}
?>

使用方法:将代码修改后复制插入到所需要的PHP页面里面。
搜索引擎可以自己增加。

阅读全文

通过PHP程序知道蜘蛛是否访问你的网站(附代码)

搜索引擎的蜘蛛访问网站是通过远程抓取页面来进行的,我们不能使用JS代码来取得蜘蛛的Agent信息,但是我们可以通过image标签,这样我们就可以得到蜘蛛的agent资料了,通过对agent资料的分析,就可以确定蜘蛛的种类、性别等因素,我们在通过数据库或者文本来记录就可以进行统计了。
数据库结构:
#
# 表的结构 `naps_stats_bot`
#

CREATE TABLE `naps_stats_bot` (
`botid` int(10) unsigned NOT NULL auto_increment,
`botname` varchar(100) NOT NULL default '',
`botagent` varchar(200) NOT NULL default '',
`bottag` varchar(100) NOT NULL default '',
`botcount` int(11) NOT NULL default '0',
`botlast` datetime NOT NULL default '0000-00-00 00:00:00',
`botlasturl` varchar(250) NOT NULL default '',
UNIQUE KEY `botid` (`botid`),
KEY `botname` (`botname`)
) TYPE=MyISAM AUTO_INCREMENT=9 ;

#
# 导出表中的数据 `naps_stats_bot`
#

INSERT INTO `naps_stats_bot` VALUES (1, 'Googlebot', 'Googlebot/2.X ( http://www.googlebot.com/bot.html)', 'googlebot', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (2, 'MSNbot', 'MSNBOT/0.1 (http://search.msn.com/msnbot.htm)', 'msnbot', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (3, 'Inktomi Slurp', 'Slurp/2.0', 'slurp', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (4, 'Baiduspider', 'Baiduspider ( http://www.baidu.com/search/spider.htm)', 'baiduspider', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (5, 'Yahoobot', 'Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)', 'slurp', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (6, 'Sohubot', 'sohu-search', 'sohu-search', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (7, 'Lycos', 'Lycos/x.x', 'lycos', 0, '0000-00-00 00:00:00', '');
INSERT INTO `naps_stats_bot` VALUES (8, 'Robozilla', 'Robozilla/1.0', 'robozilla', 0, '0000-00-00 00:00:00', '');

PHP程序:

error_reporting(E_ALL & ~E_NOTICE);

function get_naps_bot()
{
$useragent = strtolower($_SERVER['HTTP_USER_AGENT']);

if (strpos($useragent, 'googlebot') !== false){
return 'Googlebot';
}

if (strpos($useragent, 'msnbot') !== false){
return 'MSNbot';
}

if (strpos($useragent, 'slurp') !== false){
return 'Yahoobot';
}

if (strpos($useragent, 'baiduspider') !== false){
return 'Baiduspider';
}

if (strpos($useragent, 'sohu-search') !== false){
return 'Sohubot';
}

if (strpos($useragent, 'lycos') !== false){
return 'Lycos';
}

if (strpos($useragent, 'robozilla') !== false){
return 'Robozilla';
}
return false;
}

$tlc_thispage = addslashes($_SERVER['HTTP_USER_AGENT']);
//添加蜘蛛的抓取记录
$searchbot = get_naps_bot();
if ($searchbot) {
$DB_naps->query("UPDATE naps_stats_bot SET botcount=botcount 1, botlast=NOW(), botlasturl='$tlc_thispage' WHERE botname='$searchbot'");
}

?>

阅读全文

用PHP来验证Email是否正确

当你在某个论坛上注册时,通常都有一个 e-mail 地址验证的功能,当你输入非法的一个格式时会出现某种错误提示信息的。

  我们可以使用下面的规则表达式
ereg("^[a-zA-Z0-9_] @[a-zA-Z0-9-] .[a-zA-Z0-9-.] $]", $email);

  但是上面这个式子的功能是只能检查字符串,不能进行输出。我们可以进一步利用这个式子来达到返回信息的功能:
if (eregi("^[a-zA-Z0-9_] @[a-zA-Z0-9-] .[a-zA-Z0-9-.] $]", $email))
{
return FALSE;
}

  下面我们可以进一步来检测主机名,是不是存在:
list($Username, $Domain) = split("@",$email);
if(getmxrr($Domain, $MXHost))
{
return TRUE;
}
else
{
if(fsockopen($Domain, 25, $errno, $errstr, 30))
{
return TRUE;
}
else
{
return FALSE;
}
}

  现在我们再把上面的两个功能用PHP组织起来构成一个函数:
function checkEmail($email)

{ if(eregi("^[a-zA-Z0-9_] @[a-zA-Z0-9-] .[a-zA-Z0-9-.] $]", $email))
{
return FALSE;
}

list($Username, $Domain) = split("@",$email);

if(getmxrr($Domain, $MXHost))
{
return TRUE;
}
else
{
if(fsockopen($Domain, 25, $errno, $errstr, 30))
{
return TRUE;
}
else
{
return FALSE;
}
}
}

  之后我们就可以利用这个函数来检测是否存在输入的一个Email了,举个例子:

if(checkEmail(web@etoow.com) == FALSE)
{
echo "您输入的E_mail是不正确的.";
}
else
{
echo "输入的E_mail是正确的.";
}

阅读全文