Perl 用 Socket 发送邮件详解(3)
本文的前两个部分发布在:
http://community.csdn.net/Expert/topic/3473/3473313.xml?temp=.8989984
http://community.csdn.net/Expert/topic/3473/3473340.xml?temp=.867901
对于 ISP 来说,你无法将你自己构造的模块放到 Perl 的缺省库目录,既然采用模块的方式,就有个使用方法的问题,采用无条件的 use 方法时无法使用的。
我们需要修改环境变量,将你的模块所在的位置添加的搜索路径中去,在你的 Perl 程序的前面加上:
BEGIN {
($0 =~ m!(.*)(\\|/)[^/\\]+!) && unshift(@INC, $1);
$| = 1;
}
然后在适当的位置加载:
use SendMail;
现在我们来看一个例子,看看用这个模块发送邮件有多简单,但是使用之前,你最好已经查看了模块中的 POD 内容。
#!d:/perl/bin/perl.exe
BEGIN { # get our modules directory set up
($0 =~ m!(.*)(\\|/)[^/\\]+!) && unshift(@INC, $1);
$| = 1;
}
use Socket;
use FileHandle;
use CGI;
use SendMail;
my $query = new CGI; # 创建 CGI 命名空间
$query->import_names('q'); # 获取表单参数
# 这一段用于 DOS 下的测试
# $q::smtpserver = "mail.myweb.com"; # 邮件服务器
# $q::authmail = "myname\@myweb.com"; # 验证地址
# $q::authuser = "myname"; # 验证帐号
# $q::authpass = "mypass"; # 验证密码
# $q::name = "万春"; # 发件人名称(任意)
# $q::sender = "allchn\@sohu.com"; # 发件人地址(可能需要和发件服务器吻合)
# $q::receiver = "allchn\@sohu.com"; # 收件人地址
# $q::subject = "测试Perl邮件"; # 邮件主题
# DOS 下的测试结束
SetupPreferences "-s $q::smtpserver", "-m $q::authemail", "-u $q::authuser", "-p $q::authpass", "-t text"; # , "-debug";
# 依次为: 发件人, 收件人, 邮件标题, 邮件正文
# -t 邮件格式, -s 邮件服务器, -m 验证用的邮件地址, -u 验证用户名, -p 验证用户密码(本行的内容通常省略)
# "-f 附件文件名", "-f 附件文件名", ...
# 附件文件以 -f 引导,可以放在参数的任何位置,其它任何内容如果没有省略,则前面的内容不能为空白
$msg = SendMail("'$q::name' <$q::sender>", "$q::receiver", "$q::subject", "$q::contents", "-f d:/ubb65/ubb650.nsi");
print "RETURN: $msg\n";
print "Content-type: text/html\n\n";
print qq~<HTML>
<HEAD>
<title>Perl 发送邮件</title>
<style type="text/css">
p { font-family: "宋体", "宋体"; font-size: 15px}
</style>
</HEAD>
<BODY>
<p>从 $q::name <$q::sender> 发送邮件到 $q::receiver
<p>主题: $q::subject
<p>正文: $q::contents
<p>返回信息: $msg
</BODY>
</HTML>
~;
exit 0;
请注意被注释掉的 DOS 部分,如果你不能用 Web 来测试这个程序(随后会提供一个 HTML 文件),可以在本地安装 Perl,把 DOS 部分的注释去掉,如果你要看服务器的应答,还可以修改其下面的一行为:
SetupPreferences "-s $q::smtpserver", "-m $q::authemail", "-u $q::authuser", "-p $q::authpass", "-t text", "-debug";
在 DOS 下运行就可以发送邮件了,如果不能成功,你可以查看服务器的返回信息找到原因。