Perl使用Net::SMTP_auth认证发送邮件

 

#!/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


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
m.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required错误是由于在使用spring boot整合jpa连接mysql时引入的mysql数据库版本过高导致的。该错误提示需要使用CLIENT_PLUGIN_AUTH认证插件才能连接到数据库。 解决这个问题的方法是将mysql数据库版本降低到一个较低的版本。可以通过修改pom.xml文件中的mysql-connector-java依赖的版本号来实现。将版本号改为一个低版本,例如5.1.4,然后重新运行项目。 另外,在pom.xml文件中还可以配置低版本的mysql驱动的jar包,如将mysql.version设置为5.1.6,然后重新编译和运行项目。这样就可以解决m.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required错误了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [com.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required 这个问题怎么解决](https://blog.csdn.net/sxeric/article/details/116187961)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [启动报错 Caused by: com.mysql.cj.exceptions.UnableToConnectException: CLIENT_PLUGIN_AUTH is required](https://blog.csdn.net/m0_37622302/article/details/122160849)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值