设为首页 收藏本站
查看: 1500|回复: 0

[经验分享] Perl使用Net::SMTP_auth认证发送邮件

[复制链接]
发表于 2017-5-19 10:36:58 | 显示全部楼层 |阅读模式
#!/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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-379009-1-1.html 上篇帖子: [经验总结]Perl模块使用 => 简短例子代码集合 下篇帖子: perl语言入门第四版第五章习题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表