笔者做过的论坛程序中的注册部分就曾经使用过这种方法,不过最后还是采用了一种变通的形式,下文将会具体讲到。其中主要的需求是:当一个用户注册之后,必须得到组管理员的身份确认才能成为论坛的正式会员,我所采用的方法是:用户注册完成提交表单时,先把用户各种注册信息写入数据库,同时把用户的必要信息通过邮件的方式发送给用户所注册组的所有组管理员(如果没有组管理员的话,会给站管理员发送邮件,并告之该组没有组管理员),当然,读者可能会觉得如果有人恶意注册了很多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):
[code]
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)
T 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也是文本格式的)!示例如下:
Return-Path: <ywg_263@263.net>
Delivered-T 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>
T <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