使用Perl发送邮件

        在之前的监控系统中,邮件系统配置为只能本地调用mail命令发送,这样如果要在每台数据库服务上发送邮件就比较麻烦,需要通过ssh远程调用邮件服务器上的发送脚本。如果要发送文件,还要先将文件复制到邮件服务器上。
随着机器数量的增加,这种方式越来越不灵活。因此希望能通过传统的smtp的方式在任何主机上都能发送邮件,于是花了点时间研究了一下sendmail,根据这篇文章很轻松的让sendmail跑了起来:
修改sendmail配置模板/etc/mail/sendmail.mc
define(QUEUE_DIR, `/var/spool/mqueue/q*')dnl
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
DAEMON_OPTIONS(`Port=25, Name=MTA')dnl

第一行是新增,支持多个队列
第二三行去掉注释
第四行加上注释
第五行新增
根据模板生成配置文件
m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
建立多个队列的目录
cd /var/spool/mqueue/
mkdir q1 q2 q3 q4 q5 q6
启动sendmail
/etc/rc.d/init.d/sendmail start
若要随机自启动sendmail,修改一下chkconfig设置即可
chkconfig --level 35 sendmail on
测试了一下发送邮件成功:
mail -s "test mail" NinGoo@test.com < /tmp/test.log
在CPAN上搜索了一下,Mail:Sender模块发送邮件比较方便,支持多附件,语法也比较简单。需要安装如下两个组件:
MIME::Base64
Mail::Sender
发送邮件的perl示例代码如下,为便于查看邮件发送的详细情况,这里开启了debug模式:
#!/usr/bin/perl -w
use Mail::Sender;
open my $DEBUG, ">> /tmp/mail.log" or die "Can't open the debug file: $!\n";
$sender = new Mail::Sender
 {smtp => 'smtp_server',
   from => 'send@mail.com'};
#发送普通邮件
$sender->MailMsg(
 {to => 'NinGoo@test.com',
 subject => 'test mail',
 msg => 'hello word',
 debug => $DEBUG
 });
#发送带附件的邮件
$sender->MailFile(
 {to => 'NinGoo@test.com',
 subject => 'test mail with attached file',
 msg => 'hello word',
 file => '/tmp/test.txt'
 debug => $DEBUG
 });
经过测试,在邮件服务器本机发送成功,但在远程主机上则失败了,通过debug的log文件,发现错误如下:
>> 550 5.7.1 < NinGoo@test.com>... Relaying denied. Proper authentication required.
因为是内部监控使用,可以配置远程发送到特定的域的邮件无须认证,修改/etc/mail/relay-domains文件,每行加入一个目标域,如taobao.com。
修改配置后注意重启sendmail
/etc/rc.d/init.d/sendmail restart
发送正常的log如下:
>> 250 2.0.0 n69DbJwt011946 Message accepted for delivery