#!/usr/bin/perl -w
# http://perldoc.perl.org/Net/SMTP.html
# http://search.cpan.org/~apleiner/Net-SMTP_auth-0.08/SMTP_auth.pm
use strict;
use threads;
use Net::SMTP_auth;
my $emlPath="@EML_PATH_VAR@";
my $smtpSvrIP = "@SMTP_SVR_IP_VAR@";
my $LocalBindIP = "@LOCAL_BIND_IP_VAR@";
my $heloDomain="@HELO_DOMAIN_VAR@";
my $authUsername="@AUTH_USERNAME_VAR@";
my $authPassword="@AUTH_PASSWORD_VAR@";
my $mailFrom = "@MAIL_FROM_VAR@";
my $rcptTo1 = "@RCPT_TO_VAR@";
my $needRetry = 0;
sub getDateTime
{
my $tTime = shift || time();
my ($second, $minute, $hour, $monthday, $month, $year, $weekday, $yearday, $isdst) = localtime($tTime);
$month++;
$second = ($second < 10) ? "0$second" : $second;
$minute = ($minute < 10) ? "0$minute" : $minute;
$hour = ($hour < 10) ? "0$hour" : $hour;
$monthday = ($monthday < 10) ? "0$monthday" : $monthday;
$month = ($month < 10) ? "0$month" : $month;
$year += 1900;
return "$year-$month-$monthday $hour:$minute:$second";
}
sub printResult
{
#my ($args) = @_;
my ($beginTime, $strCmd, $smtpConnector) = @_;
#my $smtpConnector = shift;
my $nowTime = &getDateTime();
my $spendTime = time - $beginTime;
my $retCode = $smtpConnector->code();
my $retMessage = $smtpConnector->message();
if ( $needRetry == 0 && $retCode > 400 && $retCode < 500 )
{
$needRetry = 1;
print "[$nowTime] cmd:$strCmd,from:$mailFrom,to:$rcptTo1,server:$smtpSvrIP,path:$emlPath,respond:$retCode $retMessage,spend:$spendTime, will retry\n";
return;
}
if ( $strCmd eq "DATA" )
{
my $newLinePos = index($retMessage, "\n");
$retMessage = substr($retMessage, $newLinePos + 1);
}
chop $retMessage;
print "[$nowTime] cmd:$strCmd,from:$mailFrom,to:$rcptTo1,server:$smtpSvrIP,path:$emlPath,respond:$retCode $retMessage,spend:$spendTime\n";
}
sub smtpSendSingleEML
{
open(EMLFILE, $emlPath) || die "Cannot open eml file: $emlPath($!)";
my $beginTime = time;
my $smtpConnector = Net::SMTP_auth->new($smtpSvrIP, Port => 25, Hello => $heloDomain, Timeout => 60, LocalAddr => $LocalBindIP, Debug => 0);
if ( defined($smtpConnector) )
{
if ( $authUsername ne "" )
{
if ( ! ($smtpConnector->auth('LOGIN', $authUsername, $authPassword)) )
{
printResult($beginTime, "AUTH", $smtpConnector);
return 0;
}
}
if ( ! ($smtpConnector->mail($mailFrom)) )
{
printResult($beginTime, "MAIL", $smtpConnector);
return 0;
}
if ( ! ($smtpConnector->to($rcptTo1)) )
{
printResult($beginTime, "RCPT", $smtpConnector);
return 0;
}
if ( ! ($smtpConnector->data()) )
{
printResult($beginTime, "DATABEGIN", $smtpConnector);
return 0;
}
while( <EMLFILE> )
{
chop $_;
$smtpConnector->datasend("$_\n");
}
$smtpConnector->dataend();
printResult($beginTime, "DATA", $smtpConnector);
$smtpConnector->quit();
}
else
{
my $nowTime = &getDateTime();
my $spendTime = time - $beginTime;
print "[$nowTime] cmd:HELO,from:$mailFrom,to:$rcptTo1,server:$smtpSvrIP,path:$emlPath,respond:550 Connect to server fail,spend:$spendTime\n";
}
close(EMLFILE);
}
=comment
sub smtpSendByFolder
{
my $sendEmlCnt = 0;
chdir($emlDir) || die "Cannot chdir to $emlDir: ($!)";
for( my $i = 1; $i <= $cycleCnt; $i++ )
{
while( glob("*.eml") )
{
$sendEmlCnt++;
$emlPath = "$emlDir/$_";
smtpSendSingleEML();
}
}
}
$SIG{'PIPE'} = 'IGNORE';
my @threadpool;
for( my $i = 1; $i <= $threadCnt; $i++ )
{
my $thread = threads->create(\&smtpSendByFolder, "Thread: $i");
push(@threadpool, \$thread);
}
foreach my $thread (@threadpool)
{
$$thread->join();
}
=cut
smtpSendSingleEML();
if ( $needRetry == 1 )
{
sleep 60;
smtpSendSingleEML();
}
几点说明:
1,发送邮件前,需要替换文件头的 "@SMTP_SVR_IP_VAR@" 等变量
2,可自动识别是否需要认证,即可连接smtp服务器或mx服务器发信
3,安装perl后默认安装Net::SMTP模块,但没有安装Net::SMTP_auth模块,需要另外安装
4,Net::SMTP_auth要用到Digest::HMAC_MD5和Authen::SASL,需要另外安装
5,所有perl模块都可以在http://search.cpan.org找到下载,下载后解开安装包,执行perl Makefile.pl && make && make install可完成安装,或将*.pm拷贝到/usr/lib/perl5/5.8.8相应的目录下完成安装
6,查看系统已经安装的perl模块的方法:find /usr/lib/perl5/5.8.8 | grep .pm
分享到:
相关推荐
下面将详细介绍如何使用Perl编写SMTP邮件发送脚本。 首先,你需要一个Perl模块来处理SMTP通信。最常用的模块是`Net::SMTP`,它包含在Perl的标准库中,因此无需额外安装。这个模块提供了与SMTP服务器交互的接口,...
Perl发送邮件主要依赖于`Net::SMTP`模块,这是一个标准的Perl模块,用于通过简单邮件传输协议(SMTP)发送邮件。以下是一个简单的Perl脚本示例,展示了如何使用这个模块发送邮件: ```perl use Net::SMTP; # 邮件...
这个模块是Perl通过SMTP发送邮件时进行身份验证所必需的。如果没有安装,当尝试发送邮件时,你会看到一个错误提示:“SMTP Error: Need MIME::Base64 and Authen::SASL todo auth”。在Ubuntu上,可以使用`apt-get`...
Net_SMTP库提供了一系列的方法来与SMTP服务器交互,例如`connect()`用于建立到SMTP服务器的连接,`auth()`用于身份验证,`mail()`和`rcpt()`分别用于指定发件人和收件人,`data()`用于发送邮件内容,以及`quit()`...
2. **身份验证**:使用SMTP服务器的身份验证机制,如AUTH LOGIN或AUTH PLAIN。 3. **邮件构建**:创建邮件头和邮件体,包含发件人、收件人、主题、正文以及可能的附件。 4. **SMTP命令交互**:使用SMTP命令如HELO/...
5. **ESMTP扩展**:Perl中的`Net::SMTP::ESMTP`模块提供了对SMTP扩展的支持,如AUTH(支持多种认证方式,如PLAIN, LOGIN, CRAM-MD5等)、STARTTLS(为连接提供安全加密)以及各种邮件属性设置。开发者可以利用这些...
"mail"可能是另一个邮件发送程序,它可能使用了特定的语言(如C或Perl)实现SMTP通信。通过分析这个项目的源码,我们可以了解如何处理SMTP响应、错误处理和邮件编码等问题。 5. **smtp协议** 这个文件名可能代表...
Cyrus-SASL是用于认证邮件客户端的身份验证机制。确保其已正确安装,以支持Postfix的认证功能。 **3. 创建运行Postfix服务的用户与组** 为Postfix创建一个专用的系统用户和组,以便它能在合适的权限级别下运行。 ...
6. **配置文件**:用户可以通过配置文件来设置默认的SMTP服务器、发件人地址、认证信息等,以便于多次使用。 7. **身份验证**:Blat支持多种身份验证机制,如SMTP-AUTH,包括用户名和密码、NTLM、Kerberos等,这...
通过Perl脚本生成Base64编码的凭据,然后使用`telnet`命令连接到Postfix服务器,发送`AUTH PLAIN`命令,检查认证结果。 通过以上步骤,可以有效地将OpenLDAP与Postfix集成,实现SASL认证,增强了邮件服务器的安全性...
1. 最后一步,确保Bugzilla可以正常使用邮件发送功能。配置SMTP服务器信息,如邮箱服务器地址等。 2. 修改注册表键值以支持CGI脚本执行: ``` Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.cgi\...
Bugfree 3.0.2虽然存在一些已知问题,比如邮件发送可能会有延迟,但基本功能依然可以正常使用。 总结:通过以上步骤,您应该已经在XAMPP环境中成功安装并配置了Bugfree 3.0.2,可以开始使用这个强大的缺陷跟踪工具...
使用Pear的命令行工具安装Mail、Mail_Mime和Net_SMTP类库,这些类库提供了发送邮件所需的功能。安装命令为`pear install Mail Mail_Mime Net_SMTP`。安装完成后,使用命令`pear list`可以查看是否已经安装了上述类库...
* 使用外部 HTTP 认证服务器认证用户后重定向连接到内部 SMTP 后端 * 支持的认证方式:POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5; IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5; SMTP: AUTH LOGIN/PLAIN/CRAM-...
- 使用Nginx的负载均衡功能,将经过认证的请求合理地分配到集群的各个节点。 8. 配置权限和可执行权限: - 为Perl脚本赋予适当的执行权限,以便可以直接运行脚本。 通过上述方法可以有效地在Nginx中配置用户...
例如,在获取应用信息时,可以使用GET方法,并将认证信息(auth_token)作为参数附加在URL上。 4. JSON格式:友盟Open API的接口通常以JSON(JavaScript Object Notation)格式返回数据。JSON是一种轻量级的数据...
邮件认证模块支持SMTP身份验证,增强了邮件服务的安全性。 ##### 邮件代理模块(Mail Proxy) 邮件代理模块允许Nginx作为邮件代理服务器,转发邮件请求。 ##### 邮件SSL认证模块(Mail SSL) 邮件SSL认证模块...