目录 | 第一章 | 第二章 | 第三章 | 第四章 | 第五章 | 第六章 | 第七章 | 第八章 | 第九章 | 第十章 |
Form to Mail
所谓Form to Mail的功能,就是在页面上建立一个表单(form),该表单内记录着用
户的信息,当用户提交了此表单,程序自动将表单内容发送的管理员所设定的信箱里。听
起来这非常简单,根本用CGI就可以写这样的功能。其实当然没有这么简单,实际上许多
公司网页还要求此表单在提交时存如另一个数据库,这样就需要写CGI程序了。
为了便于解说form to mail的功能,我们这里不考虑复杂情况,只考虑最简单的情况。
就是唯一的form to mail功能,其他的功能只要在程序内加入相应的程序块就可以了。
在Unix中,我们最多使用的就是Email网关,因为是CGI开发环境中少数几个标准unix
工具之一。在CGI程序中发送e-mail的命令是mail和Sendmail。我比较喜欢sendmail,因为
它功能更强,Sendmail从STDIN接受数据,遇到Eof或只包含.的一行信息就将信息发送出去。
Perl中使用Sendmail的一个方式是将mail内容写入一个临时文件,然后使用Cat,同时把输
出管道与Sendmail命令相联系起来。
如:
open(EMAIL,”>tempfile $ $,txt”);
print(EMAIL,”stuff to be emailed .. la la la ..\n”);
close(EMAIL);
system(“cat tempfile $ $,txt | /usr/sbin/sendmail $tokens(‘email’)”);
system(“rm tempfile $ $,txt”);
名字tempfile $$,txt中的$ $是Perl中的一个特殊变量,即进程号(PID)。之所以使用
是为了避免两个用户同时启动这个程序会覆盖tempfile文件,使用这种方法每个tempfile
都是唯一的。(由pid表示)。这种好的思想可以用在许多程序中。
Sendmail命令从关联数组元素$token(‘email’)中找到e-mail目标地址,你可以假设
这个变量的值在用户提交的表单由用户输入。如果没有安全措施,这样做是很危险的,设想
有恶意的用户在Web表单中给你如下地址:Noone@nowhere.net;cd/;rm-R *
分号是表示unix命令结束的符号并将命令提交unix命令解释器。精通web的人谁也不会在根
目录运行httpd,这个例子将删除整个文件系统。所以在设计整个系统的时候,必须考虑到这
种用户直接到达Shell的情况。
Windows 下的Form to Mail
很不幸,Windows没有类似于Unix的mail网关,不管是WinNt和Windows都无法做到类似的
功能。当然也有些非常热心的程序员写过Dos接口的mail程序,但是相当不幸,此类程序直到
现在也没有很成功的例子。它们的问题是过于占用系统资源,并非常容易被黑客攻击。所以
这里我就不提供程序了。