首页 | 邮件资讯 | 技术教程 | 解决方案 | 产品评测 | 邮件人才 | 邮件博客 | 邮件系统论坛 | 软件下载 | 邮件周刊 | 热点专题 | 工具
网络技术 | 操作系统 | 邮件系统 | 客户端 | 电子邮箱 | 反垃圾邮件 | 邮件安全 | 邮件营销 | 移动电邮 | 邮件软件下载 | 电子书下载

邮件服务器

技术前沿 | Qmail | IMail | MDaemon | Exchange | Domino | 其它 | Foxmail | James | Kerio | JavaMail | WinMail | Sendmail | Postfix | Winwebmail | Merak | CMailServer | 邮件与开发 | 金笛 |
首页 > 邮件服务器 > 邮件与程序开发 > PHP高级特性讨论之邮件相关 > 正文

PHP高级特性讨论之邮件相关

出处:赛迪网 作者:小椰子 时间:2005-8-16 16:42:00
邮件发送和收取是目前网上交流最为重要的途径之一,我们当然很希望自己的PHP程序也能够实现某些商业网站注册程序中采用的方法,即通过邮件方式进行密码(或激活码)发送和资料确认。另一方面,这种方式也是一种反馈用户信息的有效途径。当然,要实现这些功能是离不开邮件服务器的,目前比较流行的Mail服务器(更准确的说是邮件传输代理MTA)有:sendmail、qmail、postfix。至于如何配置其中的pop、smtp、imap等服务已经超出这篇文章的范围,读者可以参考其他这方面文章。那么好了,我们究竟可以利用PHP来作些什么呢?

1. 简单邮件发送

PHP函数库中有一个mail函数,可以用来进行简单的邮件发送,函数原型为:

boolean mail(string $to, string $subject, string $message, string [$additional]);

$to指定邮件寄送地址,$subject指定邮件标题,$message指定邮件内容,$additional指定邮件的附加头部,例如:

<?php
mail( "ywg_263@263.net", "message from php", "hello, xiaoyz! " );
?>


就可以向 ywg_263@263.net发送一个标题为“message from php” 内容为“hello, xiaoyz!”的邮件,其中的邮件接受人$to可以是多个邮件地址,也就是说可以同时给多个人发送同一份邮件,邮件地址之间用逗号分隔,示例如下:

<?php
$emails = Array( "xiaoyz@birdy.dhs.org", "xiaoyz@hotmail.com" );
mail( implode(",", $emails), "message from php", "hello, xiaoyz!" );
?>


笔者做过的论坛程序中的注册部分就曾经使用过这种方法,不过最后还是采用了一种变通的形式,下文将会具体讲到。其中主要的需求是:当一个用户注册之后,必须得到组管理员的身份确认才能成为论坛的正式会员,我所采用的方法是:用户注册完成提交表单时,先把用户各种注册信息写入数据库,同时把用户的必要信息通过邮件的方式发送给用户所注册组的所有组管理员(如果没有组管理员的话,会给站管理员发送邮件,并告之该组没有组管理员),当然,读者可能会觉得如果有人恶意注册了很多id的话是否会在数据库中造成很多垃圾信息呢?这种考虑是必要的,所以我们需要给出一个策略,提供一个管理界面,来剔除掉这些垃圾,一种简单的方法就是对于超过了给定时期还没有成为正式会员的id一律删除,前提就是必须保证组管理员要在给定时期之内审批这些id,否则会造成误删。读者可以试试上面的代码能否工作,如果没有发送成功,请考虑重新配置邮件服务器的smtp服务。好了,按照上述形式发送的邮件将只是简单的文本形式,如果希望发送一个HTML形式的邮件,就需要知道如何发送MIME形式的邮件了。

2. MIME邮件发送

MIME(Multi-purpose Internet Mail Extensions,多用途Internet邮件扩展) 协议扩展了基于文本的Internet邮件系统,以便可以在消息体中包含二进制附件。MIME信息由正常的Internet文本邮件组成,在文本邮件中包含了一些信息头和格式化过的信息体(用ASCII 码子集表示的附件),这些MIME信息头给出了在邮件中表示附件的特定方法。

刚才通过mail函数发送的邮件接受之后的MIME信息如下(其中的localhost

(localhost[127.0.0.1])表示采用本机上的postfix提供的smtp服务,userid 48表示apache):

Received: from localhost (localhost [127.0.0.1])
by mx01.263.net (Postfix) with SMTP id E7C8B1DC38A78
for <ywg_263@263.net>; Sat, 8 Dec 2001 20:08:45 +0800 (CST)
Received: by birdy.dhs.org (Postfix, from userid 48)
id 706F3C4923A; Sun, 9 Dec 2001 03:52:26 +0800 (CST)
To: ywg_263@263.net
Subject: message from php
Message-Id: <20011208195226.706F3C4923A@birdy.dhs.org>
Date: Sun, 9 Dec 2001 03:52:26 +0800 (CST)
From: apache@birdy.dhs.org (Apache User)


hello, xiaoyz!

可以看出其中的Received、To、Subject、Message-ID、Date、From部分都是信息头(To、Subject信息头分别对应着mail函数中的$to、$subject),而“hello, xiaoyz!”是信息体,如果没有指定Content-Type信息头,则默认为“Content-Type: text/plain;Charset='us-ascii'”。既然如此,我们当然可以用这种方法来发送HTML形式的邮件了(注意:HTML也是文本格式的)!示例如下:

<?php
$to = "ywg_sn@sina.com";
$subject = "html message from php";
$message = "<html><title>html message</title><body bgcolor=#cccccc>
<h1><font color=red>hello, xiaoyz!</font></h1></body></html>";
$additional = "From: ywg_263@263.net\nReply-To:ywg_263@263.net\n
X-Mailer:PHP\nX-Priority:2\nContent-Type: text/html; charset=\"GB2312\"\n
Content-Transfer-Encoding: 7bit\nMIME-Version: 1.0";
mail( $to, $subject, $message, $additional );
?>


其中有几个新的信息头:From表示邮件来源地址,Reply-To表示邮件回复地址,X-Mailer表示邮件发送程序,X-Priority表示邮件优先级,Content-Transfer-Encoding表示编码方式。用Outlook Express接受此邮件,我们发现它确实是一封HTML邮件,查看各信息头(在Outlook Express中选择该邮件,点右键,查看“属性”中的“详细信息”),正如上面所述。至此,我们已经可以发送各种文本格式的MIME邮件了,那么又该如何发送各种二进制格式的MIME邮件呢?比如图片;同时又该如何发送具有混合格式的MIME邮件呢?比如HTML和图片,请看第三部分和第四部分。

3. 二进制格式邮件发送

一个JPG图片的MIME信息格式大致如下:

To: ywg_sn@sina.com
Subject: jpg picture from xiaoyz
Content-Type: image/jpg; name='picture.jpg'
Content-Transfer-Encoding: base64
Content-Description: xiaoyz's picture
From: 'xiaoyz' <ywg_263@263.net>


...这里是JPG图片的base64编码...

其中,name表示附件的名称,Content-Description表示附件的描述,一般显示为附件的标题。显然,我们必须把从表单提交的JPG图片文件进行base64编码,这个具体该如何实现呢?假定文件上传标签的名称为attach,即,则代码片断如下:

<?php
$fp = fopen( $attach, "r" );
$content = fread($fp, filesize($attach)); //读取文件内容
$content = chunk_split( base64_encode($content) ); //进行base64编码,并在每76个字符后面加上\r\n
?>


然后只要把HTML格式邮件发送示例中的$to, $subject, $additional信息头部分换成这里对应的信息头,并将其中的$message换成这里的$content,就可以发送JPG图片的附件了,事实上任何类型的文件皆可通过这种方式进行发送。现在我们来看混合格式即多部分信息邮件。

4. 混合格式邮件发送

一个带HTML格式附件的邮件的MIME信息大致如下:

Return-Path: <ywg_263@263.net>
Delivered-To: ywg_sn@sina.com
Received: (qmail 20639 invoked from network); 9 Dec 2001 08:04:25 -0000
Received: from unknown (HELO smtp.263.net) (202.96.44.19)
by 202.106.187.149 with SMTP; 9 Dec 2001 08:04:25 -0000
Received: from localhost (localhost [127.0.0.1])
by smtp.263.net (Postfix) with SMTP id B431D1DEBCAAA
for <ywg_sn@sina.com>; Sun, 9 Dec 2001 16:08:44 +0800 (CST)
Message-ID: <004f01c18089$938e83b0$a32869a2@xiaoyz>
From: <ywg_263@263.net>
To: <ywg_sn@sina.com>
Subject: multipart MIME
Date: Sun, 9 Dec 2001 16:14:08 +0800
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_NextPart_000_0049_01C180CC.87D17760"
X-Priority: 3
This is a multi-part message in MIME format.

----=_NextPart_000_0049_01C180CC.87D17760
Content-Type: text/plain; charset="gb2312"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline





hello, xiaoyz!

------=_NextPart_000_0049_01C180CC.87D17760
Content-Type: text/html; name="index.html"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="index.html"

<html>
<title>html attachment</title>
<body>
hello, xiaoyz!
</body>
</html>
------=_NextPart_000_0049_01C180CC.87D17760--



注意其中的Content-Type信息头,mulitipart/mixed表示这封邮件由多部分组成,boundary指定各部分之间的边界符为“----=_NextPart_000_0049_01C180CC.87D17760”,我们看到确实存在着三个边界符将邮件分成了三部分:信息头部分,纯文本部分,HTML部分。Content-Disposition告诉邮件程序应该如何显示附件。如果Content-Disposition被设置为attachment,那么邮件程序就不会显示HTML文件的内容,而是显示一个链接;如果设置为inline,则HTML文件的内容直接显示。一般情况下,如果附件是文本格式的(HTML也是文本格式的),Content-Disposition会被设为inline,否则Content-disposition设为attachment。好了,我想现在读者可能已经对邮件的各组成部分及其含义了然于胸了,现在就差如何用PHP来实现混合格式邮件的发送,当然,你可以用PHP来生成全部的信息,现在讨论表单发送的情形,代码如下:

<form name="frm_mail" action="<? print $PHP_SELF; ?>" enctype="multipart/form-data" method="post">
from: <input type="text" name="from"><br>
to: <input type="text" name="to"><br>
subject: <input type="text" name="subject"><br>
attach: <input type="file" name="attach"><br>
message: <textarea name="message"></textarea>
<input type="submit" name="send" value="send">
</from>


<?php
if( isset($send) )
{
//定义边界线
$boundary = uniqid( "" );

//生成邮件头
$header = "From: $from\nContent-type: multipart/mixed;boundary=\"$boundary\"\nX-Mailer:PHP\nX-Priority:3";

//获取上传文件的MIME类型
if( $attach_type )
$mimetype = $attach_type;
else
$mimetype = "application/unknown";

//获取上传文件的名字
$filename = $attach_name;
$filename = $attach_name;

//对上传文件进行编码和切分
$fp = fopen($attach, "r");
$content = fread($fp, filesize($content));
$content = chunk_split( base64_encode($content) );

//生成邮件主体
$body ="
--$boundary
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit

$message

--$boundary
Content-Type: $mimeType; name=$filename
Content-Disposition: attachment; filename=$filename
Content-Transfer-Encoding: base64

$content

--$boundary--";

mail( $to, $subject, $body, $header );
}
?>



首先通过uniqueid函数得到惟一的边界符,然后得到上传文件的MIME类型,再对上传文件进行base64编码和切分,最后进行组合,得到mail函数中的$body和$header,并调用mail函数。到现在为止,我丝毫不怀疑您可以作出一个非常漂亮有声有色的注册验证程序了。最后,笔者将来谈谈身份验证中对邮件方式的一种替代方案,其实也很简单,就是使用数据库来保存用户的各种申请通知。具体地说,每当有一个用户填写完注册表单并发送之后,除了在数据库中记录用户的注册信息,同时要在数据库中产生一个申请通知,比如:有一个用户abc申请加入group1组,而通过数据库查询得知group1组有两个组管理员admin1和admin2,就需要在数据库中加入两条记录,fromwho字段为abc,towho字段分别admin1和admin2,readed字段为0,表示组管理员还没有查看这个通知。当组管理员登录之后,会对申请通知进行检索,发现存在没有查看的通知,会弹出一个窗口界面供管理员进行审批。管理员通过该申请,则将abc的权限更新为正式会员;拒绝该申请,则将abc的申请通知和用户记录删除。好了,就此打住,请继续关注PHP高级特性讨论系列。
,
相关文章 热门文章
  • Phorum violation.php3转发任意邮件漏洞
  • @Mail admin.php页面跨站脚本漏洞
  • U-Mail edit.php任意文件上传漏洞
  • Linux下如何破解PHP加密dezend软件
  • Maia Mailguard login.php远程目录遍历漏洞
  • 用PHPMyVisites精确分析web日志(下)
  • 用PHPMyVisites精确分析web日志(上)
  • iGENUS webmail file.php远程目录遍历漏洞
  • Win下配置Apache2,PHP5,MYSQL5,Zend
  • Apache+php+mysql在windows下的安装与配置图解
  • REDHAT + QMAIL + OPENSSL + APACHE + PHP + MYSQL + VPOPMAIL (with MySQL accounts)
  • win2003下用WinWebMail让PHP能发邮件
  • 用C++ Builder实现电子邮件群发
  • 用Cdonts实现发送Email
  • Jmail的主要参数列表
  • ASP.NET 2.0发送电子邮件全面剖析之二
  • VC++ SMTP协议电子邮件传送剖析
  • 通过sina的smtp验证的Java发送邮件源代码
  • ASP.NET 2.0中发送电子邮件剖析之一
  • 在Asp.Net中使用SmtpMail发送邮件的方法
  • .NET环境下Email的技术介绍
  • ASP.NET 2.0发送电子邮件中存在的问题
  • 用ASP判断Email地址是否有效
  • IIS如何接收ServerXMLHTTP传过来的编码字符?
  • 自由广告区
     
    最新软件下载
  • SharePoint Server 2010 部署文档
  • Exchange 2010 RTM升级至SP1 教程
  • Exchange 2010 OWA下RBAC实现的组功能...
  • Lync Server 2010 Standard Edition 标..
  • Lync Server 2010 Enterprise Edition...
  • Forefront Endpoint Protection 2010 ...
  • Lync Server 2010 Edge 服务器部署文档
  • 《Exchange 2003专家指南》
  • Mastering Hyper-V Deployment
  • Windows Server 2008 R2 Hyper-V
  • Microsoft Lync Server 2010 Unleashed
  • Windows Server 2008 R2 Unleashed
  • 今日邮件技术文章
  • 腾讯,在创新中演绎互联网“进化论”
  • 华科人 张小龙 (中国第二代程序员 QQ...
  • 微软推出新功能 提高Hotmail密码安全性
  • 快压技巧分享:秒传邮件超大附件
  • 不容忽视的邮件营销数据分析过程中的算..
  • 国内手机邮箱的现状与未来发展——访尚..
  • 易观数据:2011Q2中国手机邮箱市场收入..
  • 穿越时空的爱恋 QQ邮箱音视频及贺卡邮件
  • Hotmail新功能:“我的朋友可能被黑了”
  • 入侵邻居网络发骚扰邮件 美国男子被重..
  • 网易邮箱莫子睿:《非你莫属》招聘多过..
  • 中国电信推广189邮箱绿色账单
  • 最新专题
  • 鸟哥的Linux私房菜之Mail服务器
  • Exchange Server 2010技术专题
  • Windows 7 技术专题
  • Sendmail 邮件系统配置
  • 组建Exchange 2003邮件系统
  • Windows Server 2008 专题
  • ORF 反垃圾邮件系统
  • Exchange Server 2007 专题
  • ISA Server 2006 教程专题
  • Windows Vista 技术专题
  • “黑莓”(BlackBerry)专题
  • Apache James 专题
  • 分类导航
    邮件新闻资讯:
    IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮
    电子邮箱 | 反垃圾邮件|邮件客户端|网络安全
    行业数据 | 邮件人物 | 网站公告 | 行业法规
    网络技术:
    邮件原理 | 网络协议 | 网络管理 | 传输介质
    线路接入 | 路由接口 | 邮件存储 | 华为3Com
    CISCO技术 | 网络与服务器硬件
    操作系统:
    Windows 9X | Linux&Uinx | Windows NT
    Windows Vista | FreeBSD | 其它操作系统
    邮件服务器:
    程序与开发 | Exchange | Qmail | Postfix
    Sendmail | MDaemon | Domino | Foxmail
    KerioMail | JavaMail | Winwebmail |James
    Merak&VisNetic | CMailServer | WinMail
    金笛邮件系统 | 其它 |
    反垃圾邮件:
    综述| 客户端反垃圾邮件|服务器端反垃圾邮件
    邮件客户端软件:
    Outlook | Foxmail | DreamMail| KooMail
    The bat | 雷鸟 | Eudora |Becky! |Pegasus
    IncrediMail |其它
    电子邮箱: 个人邮箱 | 企业邮箱 |Gmail
    移动电子邮件:服务器 | 客户端 | 技术前沿
    邮件网络安全:
    软件漏洞 | 安全知识 | 病毒公告 |防火墙
    攻防技术 | 病毒查杀| ISA | 数字签名
    邮件营销:
    Email营销 | 网络营销 | 营销技巧 |营销案例
    邮件人才:招聘 | 职场 | 培训 | 指南 | 职场
    解决方案:
    邮件系统|反垃圾邮件 |安全 |移动电邮 |招标
    产品评测:
    邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端
    广告联系 | 合作联系 | 关于我们 | 联系我们 | 繁體中文
    版权所有:邮件技术资讯网©2003-2010 www.5dmail.net, All Rights Reserved
    www.5Dmail.net Web Team   粤ICP备05009143号