在公司负责一些文件整理工作,需要经常查看一下公司samba服务器libraray文件夹下面inbox中是否有其他同事丢入的文件,然后在分门别类放好。如果每天都查看,就显得很繁琐了,由此我想到了可以写个perl脚本自动检查这个文件夹是否为空,不为空的话,发通知邮件给我。
首先library文件夹是在samba服务器上的,首先link到本地来:
:START net use * /del /y net use F: \\10.53.13.245\library 756823 /user:libmgr c:\Perl\bin\perl.exe cfn.pl c:\Perl\bin\perl.exe library.pl
下面利用perl检查文件夹,并通过SMTP发送到自己的工作邮箱
: #Use perl eval `exec perl -S $0 "$@"` if $running_under_some_shell; #!perl use File::Copy; use Net::SMTP; my $dirname = "F:\\inbox"; my $temp_file = "dummy.txt"; my $count = 0; my $message; my @dir_files=<$dirname/*>; if(@dir_files){ opendir DIR,$dirname or die $!; @files = readdir DIR; closedir DIR; for(@files){ next if(/^\./); next if(/^\.\./); #send_mail("smtp.163.com","xxxxx\@163.com","xxxx\@163.com","$_"); $count = $count +1; $message= $message."$_ \n"; #print("$message $count"); } #print("$message $count"); if($count == 1){ $message = "The following 1 file is in $dirname:\n".$message; }else{ $message = "The following $count files is in $dirname:\n".$message; } send_mail("smtp.163.com","xxxxxx\@163.com","xxxxxx\@scsemicon.com","$message"); } sub send_mail { my($host, $auth, $to, $mail_body) = @_; my $smtp = Net::SMTP->new( Host => $host, Hello => $host, Timeout => 30, Debug => 1 ); $smtp->auth('xxxxxx@163.com', 'pass') || die; $smtp->mail($auth); $smtp->to($to); $smtp->bcc($auth); $smtp->data(); #$smtp->datasend("Content-Type:text/plain;charset=GB2312\n"); #$smtp->datasend("Content-Transfer-Encoding:base64\n"); $smtp->datasend("From:$auth \n"); $smtp->datasend("To:$to \n"); $smtp->datasend("Subject: Library Inbox is NOT empty\n"); $smtp->datasend("\n"); $smtp->datasend("$mail_body\n"); $smtp->dataend(); $smtp->quit; }
用Net::SMTP发邮件,但是有些网站的认证会出问题,所以要用Net::SMTP_auth来发才好用.
注:后来发现,只要装一下Authen::SASL这个模块,或是装Net::SMTP_auth这个模块以后,还是用Net::SMTP也是可以的.
最后windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务。 通过'添加任务计划'的一步步引导,则可建立一个定时执行的任务