CGI简明教程第八章

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程序,但是相当不幸,此类程序直到现在也没有很成功的例子。它们的问题是过于占用系统资源,并非常容易被黑客攻击。所以这里我就不提供程序了。

CGI教程目录