|
----5 怎样在程序中调用系统命令
------以在程序中自动收发邮件为例
----CGI的推出就是为了使WebServer可以与更多的数据源沟通,常用的数据源有三种:数据库、非关系型数据文件(如txt文本)、邮件系统。前二者的连接和读写都有很多的方法,这里就不再相述。我主要想谈谈在CGI程式中怎样才能读取到邮件系统的邮件,自动发送邮件又是怎样进行的。Microsoft最近推出了ADO(ActiveXDataObject),只要相应数据源能提供OLEDB(DataProviderInterfaces),我们的应用程序就可调用ADO透明的访问该数据源(包括前面我们提到的三种数据源)。这种应用在邮件系统方面现在还只限于在MicrosoftExchangeServer上,由于这是新标准,实用与否还要看数据源供应商的反应和是否提供OLEDB接口。下面,我给大家介绍另外一种较为通用的实现方法。
----读取邮件:在很多unix系统中,邮件一般都放在/var/mail目录下,每个用户的邮件就存放在一个以该用户名命名的文本文件中,例如:/var/mail/zyr。如果我们要读取或查找该邮件信息,只要打开相应的文件即可。但该程式的运行者须有读取该用户邮件的权限,可在系统中用命令chmod进行设置。下面以一个perl程序为例:
----#该程序用于读取邮件,如果成功就把每一行数据打印出来
#!/bin/perl
#如果该路径已加入PATH中,上句可省
$mail_path="/var/mail/zyr";
#邮件路径
if(!open(vmail,"< $mail_path")){
print"can'topen$mail_path";
exit;
}
else{
while($temp=< vmail >){
#取出每一行数据放在$temp中
print$temp;
}
}
close(vmail);
----发送邮件:可通过调用系统命令实现,如system"mailxzyr\@gznet.com< a.txt"或exec"mailxzyr\@gznet.com< a.txt"。(a.txt为要发送的邮件内容,"\"是取消@特殊字符的含义)前者系统命令运行完后,会继续执行下面的语句;而后者调用结束后,整个程序就会结束,原来的perl程序也不能继续执行。故一般后者通常放在程序最后一行执行。
----6Server与Client传递数据的方法
----很多人都知道由client传送数据到server可通过下面两种方法,
1)< formmethod="GET/POST"
action="http://10.0.0.1/Script/a.pl" >
< inputtype="hidden"name="a"value="1" >
< inputtype="hidden"name="b"value="2" >
< inputtype="submit"name="submit"value="Go" >
< /form >
2)< ahref="http://10.0.0.1/Scripts/a.pl?a=1&b=2" >
CGI< /a >
----结果也是一样的;但却很少有人会去想这两种方法传输数据时用的是哪种方式。其实,前者采用的方式在method中设置可以是GET也可以是POST,而后者采用的则是GET方式。GET与POST的区别在于,如果以GET方式传输,所带参数附加在CGI程式的URL后直接传给server,并可从server端的QUERY_STRING这个环境变量中读取;如果以POST方式传输,则参数会被打包在数据报中传送给server,并可从CONTENT_LENGTH这个环境变量中读取出来。还有一种情况是,你用的是GET方式,但传送的参数是路径,如:
----< ahref="/cgi-bin/a.pl/usr/local/bin/pine" >CGI< /a >
----这时所传递的参数"/usr/local/bin/pine"存放在PATH_INFO这个环境变量中。环境变量的读取方式为$str=$ENV{'QUERY_STRING'};
----有时候我们非常希望能记录下访问我们页面的用户所用的浏览器是什么?名字、地址又是什么?这时候我们就要借助server端的一系列环境变量了。下面列出其它一些常用的环境变量。
SERVER_NAMEserver的机器名称或IP地址
SERVER_PORTserver正在运行的端口号
REQUEST_METHOD发出request的方法(GET/POST/HEAD)
SCRIPT_NAME程式被调用的路径,如:cgi-bin/a.pl
REMOTE_HOST发出request请求的远端机器(client)的名称
REMOTE_ADDR发出request请求的远端机器(client)的IP地址
REMOTE_IDENT发出request的使用者名称(如是拨号上网,则为用户
ID),当NCSAIdentityCheck为enabled,而且client
机器支持RFC931时,该变量有效
CONTENT_TYPE数据的MIME型别,如:"text/html"
HTTP_ACCEPTclient可以接受的MIME型别列表
HTTP_USER_AGENTclient发出request的浏览器类型
HTTP_REFERER在读取CGI程式之前,client所指的文本URL
----以上环境变量并非所有webserver都支持,需视具体情况而定,建议使用之前先进行测试。
----下面有一个例子,作用是把访问本页面的客户的ip地址和所用的浏览器类型记录并显示出来。
print"HTTP/1.0200OK\n";
print"Content-Type:text/html\n\n";
print"< HTML >\n";
print"< HEAD >\n";
print"< TITLE >test< /TITLE >\n";
print"< /HEAD >\n";
print"< BODY >\n";
print"YourIPAddressis$ENV{'REMOTE_ADDR'}.\n";
print"YourBrowseis$ENV{'HTP_USER_AGENT'}.\n";
print"< /BODY >\n";
print"< /HTML >\n"; |
|
|