`
cloudmail
  • 浏览: 271383 次
  • 来自: 广州
社区版块
存档分类
最新评论

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


 

1
4
分享到:
评论

相关推荐

    perl 写的发邮件smtp

    下面将详细介绍如何使用Perl编写SMTP邮件发送脚本。 首先,你需要一个Perl模块来处理SMTP通信。最常用的模块是`Net::SMTP`,它包含在Perl的标准库中,因此无需额外安装。这个模块提供了与SMTP服务器交互的接口,...

    perl发送邮件

    Perl发送邮件主要依赖于`Net::SMTP`模块,这是一个标准的Perl模块,用于通过简单邮件传输协议(SMTP)发送邮件。以下是一个简单的Perl脚本示例,展示了如何使用这个模块发送邮件: ```perl use Net::SMTP; # 邮件...

    Linux或Ubuntu下SVN服务器自动发送邮件配置

    这个模块是Perl通过SMTP发送邮件时进行身份验证所必需的。如果没有安装,当尝试发送邮件时,你会看到一个错误提示:“SMTP Error: Need MIME::Base64 and Authen::SASL todo auth”。在Ubuntu上,可以使用`apt-get`...

    Net_SMTP-1.8.0.tgz

    Net_SMTP库提供了一系列的方法来与SMTP服务器交互,例如`connect()`用于建立到SMTP服务器的连接,`auth()`用于身份验证,`mail()`和`rcpt()`分别用于指定发件人和收件人,`data()`用于发送邮件内容,以及`quit()`...

    邮件发送smtp类ereg等函数替换版

    2. **身份验证**:使用SMTP服务器的身份验证机制,如AUTH LOGIN或AUTH PLAIN。 3. **邮件构建**:创建邮件头和邮件体,包含发件人、收件人、主题、正文以及可能的附件。 4. **SMTP命令交互**:使用SMTP命令如HELO/...

    net-server-mail:STMP协议及其不同演变的可扩展Perl实现(即:ESMTP,LMTP)

    5. **ESMTP扩展**:Perl中的`Net::SMTP::ESMTP`模块提供了对SMTP扩展的支持,如AUTH(支持多种认证方式,如PLAIN, LOGIN, CRAM-MD5等)、STARTTLS(为连接提供安全加密)以及各种邮件属性设置。开发者可以利用这些...

    SMTP协议实现总集

    "mail"可能是另一个邮件发送程序,它可能使用了特定的语言(如C或Perl)实现SMTP通信。通过分析这个项目的源码,我们可以了解如何处理SMTP响应、错误处理和邮件编码等问题。 5. **smtp协议** 这个文件名可能代表...

    Linux系列实验之[构建Postfix电子邮件系统]

    Cyrus-SASL是用于认证邮件客户端的身份验证机制。确保其已正确安装,以支持Postfix的认证功能。 **3. 创建运行Postfix服务的用户与组** 为Postfix创建一个专用的系统用户和组,以便它能在合适的权限级别下运行。 ...

    blat324_32.full.zip

    6. **配置文件**:用户可以通过配置文件来设置默认的SMTP服务器、发件人地址、认证信息等,以便于多次使用。 7. **身份验证**:Blat支持多种身份验证机制,如SMTP-AUTH,包括用户名和密码、NTLM、Kerberos等,这...

    ldap+openldap作postfix的sasl

    通过Perl脚本生成Base64编码的凭据,然后使用`telnet`命令连接到Postfix服务器,发送`AUTH PLAIN`命令,检查认证结果。 通过以上步骤,可以有效地将OpenLDAP与Postfix集成,实现SASL认证,增强了邮件服务器的安全性...

    bugzilla安装步骤

    1. 最后一步,确保Bugzilla可以正常使用邮件发送功能。配置SMTP服务器信息,如邮箱服务器地址等。 2. 修改注册表键值以支持CGI脚本执行: ``` Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.cgi\...

    xampp环境下bugfree3.0.2安装

    Bugfree 3.0.2虽然存在一些已知问题,比如邮件发送可能会有延迟,但基本功能依然可以正常使用。 总结:通过以上步骤,您应该已经在XAMPP环境中成功安装并配置了Bugfree 3.0.2,可以开始使用这个强大的缺陷跟踪工具...

    PHP使用Pear发送邮件(Windows环境)

    使用Pear的命令行工具安装Mail、Mail_Mime和Net_SMTP类库,这些类库提供了发送邮件所需的功能。安装命令为`pear install Mail Mail_Mime Net_SMTP`。安装完成后,使用命令`pear list`可以查看是否已经安装了上述类库...

    nginx详解.pptx

    * 使用外部 HTTP 认证服务器认证用户后重定向连接到内部 SMTP 后端 * 支持的认证方式:POP3: USER/PASS, APOP, AUTH LOGIN/PLAIN/CRAM-MD5; IMAP: LOGIN, AUTH LOGIN/PLAIN/CRAM-MD5; SMTP: AUTH LOGIN/PLAIN/CRAM-...

    Nginx中配置用户服务器访问认证的方法示例

    - 使用Nginx的负载均衡功能,将经过认证的请求合理地分配到集群的各个节点。 8. 配置权限和可执行权限: - 为Perl脚本赋予适当的执行权限,以便可以直接运行脚本。 通过上述方法可以有效地在Nginx中配置用户...

    友盟 Open API.pdf

    例如,在获取应用信息时,可以使用GET方法,并将认证信息(auth_token)作为参数附加在URL上。 4. JSON格式:友盟Open API的接口通常以JSON(JavaScript Object Notation)格式返回数据。JSON是一种轻量级的数据...

    Nginx_模块参考手册中文版

    邮件认证模块支持SMTP身份验证,增强了邮件服务的安全性。 ##### 邮件代理模块(Mail Proxy) 邮件代理模块允许Nginx作为邮件代理服务器,转发邮件请求。 ##### 邮件SSL认证模块(Mail SSL) 邮件SSL认证模块...

Global site tag (gtag.js) - Google Analytics