Perl 用 Socket 发送邮件详解(3)

AllCHN 2004-10-20 12:07:36
本文的前两个部分发布在:
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 下运行就可以发送邮件了,如果不能成功,你可以查看服务器的返回信息找到原因。
...全文
136 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
PerlExpert 2004-11-15
  • 打赏
  • 举报
回复
up
AllCHN 2004-10-20
  • 打赏
  • 举报
回复
现在来看看怎样通过服务器的 Perl 支持在浏览器里直接发送邮件。
  首先,你需要一个表单程序,这里是一个例子:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>用 Perl 发送邮件</title>
<style type="text/css">
<!--
body, p, a, td, input, textarea {
font-family: "宋体", Arial;
font-size: 9pt;
}
-->
</style>
</head>

<body>
<p align="center"><strong>Perl发送邮件</strong></p>
<blockquote>
<form name="pmail" method="post" action="http://webhost/ucgi/perlmail.pl">
<table border="1" align="center" cellpadding="4" cellspacing="0" bordercolorlight="#000000" bordercolordark="#FFFFFF" bgcolor="#CCCCCC">
<tr bgcolor="#00CCFF">
<td colspan="2"><strong>邮件信息</strong></td>
</tr>
<tr>
<td align="right">发件人名称:</td>
<td><input name="name" type="text" id="name" size="40"></td>
</tr>
<tr>
<td align="right">发件人地址:</td>
<td><input name="sender" type="text" id="sender" size="40"></td>
</tr>
<tr>
<td align="right">收件人地址:</td>
<td><input name="receiver" type="text" id="receiver" size="40"></td>
</tr>
<tr>
<td align="right">邮件主题:</td>
<td><input name="subject" type="text" id="subject" size="40"></td>
</tr>
<tr>
<td align="right">附件:</td>
<td>(固定)</td>
</tr>
<tr>
<td align="right" valign="top">邮件正文:</td>
<td><textarea name="contents" cols="40" rows="10" id="contents"></textarea></td>
</tr>
<tr bgcolor="#33CCFF">
<td colspan="2"><strong>验证信息</strong></td>
</tr>
<tr>
<td align="right">SMTP服务器:</td>
<td><input name="smtpserver" type="text" id="smtpserver" size="40"></td>
</tr>
<tr>
<td align="right">验证地址:</td>
<td><input name="authmail" type="text" id="authmail" size="40"></td>
</tr>
<tr>
<td align="right">验证帐号:</td>
<td><input name="authuser" type="text" id="authuser" size="40"></td>
</tr>
<tr>
<td align="right">帐号密码:</td>
<td><input name="authpass" type="password" id="authpass" size="40"></td>
</tr>
<tr>
<td> </td>
<td align="center"><input type="submit" name="Submit" value=" 发送邮件 "></td>
</tr>
</table>
</form>
</blockquote>
<p><strong>说明</strong>:<br>  支持SMTP验证,验证方式可以是 LOGIN 或 PLAIN,根据服务器的返回信息自动识别,支持附件(这里是发送一个固定的文件)。</p>
<p> </p>

</body>
</html>

  注意: 你需要修改 action 部分的 http://webhost/ucgi/perlmail.pl 以和你的 Perl 程序对应,将这个 HTML 文件传到服务器上,然后用浏览器打开就可以了。
  另外,在上面的 Perl 程序中,我们要求了一个附件 "-f d:/ubb65/ubb650.nsi",你必须指定一个绝对路径的文件,或者干脆删除这一个参数项(不发送附件)。多个附件可以多次使用这样的参数。

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧