所谓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的情况。