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

-- 回目录 --