perl实现自动邮件回复疑惑

perl实现自动邮件回复疑惑

现象:
     公司服务器端使用exchange做MTA,客户端用MS office2003-outlook.我们一般建议用户将自己的邮件保存到本地硬盘以减轻邮件服务器的负荷,当用户个人文件夹的邮件超过3G的时候,就有可能无法收发邮件了,就必须重新建立一个新的邮件文件夹存放新邮件,但是很多员工并不注意这个问题.

想法:
      用perl写个程序,实现:当用户个人文件夹的邮件超过3G的时候,会自动给该用户发送一封邮件,给出"请新建个人文件夹"的提示.
我用perl对某个文本大小做限制没有什么问题,现在我不能解决的是如何让系统给用户自动发送一封邮件!这个邮件如何能自动发送给用户?请大大们指教,谢谢您!
----------------------------------------------------------接我白天的话题------
程序如下:
opendir(DIRMAIL, "d:/Mail") or die "serious dainbramage: $!";
my @allfiles = readdir DIRMAIL;
closedir DIRMAIL;

foreach my $allfiles(@allfiles){
if (-s $allfiles > 3000000){#这里似乎有问题,运行结果说"Use of uninitalized value in numeric gt (>) atsmtp1.pl line 5.
use Net::SMTP;

my $mailhost = "IP"; # the smtp host
my $mailfrom = 'Emailaddress'; # your email address
my @mailto = ('Emailaddress'); # the recipient list
my $subject = "个人文件夹的邮件超出3G限制";
my $text = "温馨提示:\n您的个人文件夹邮件超过3G限制,请您新建一个新的个人文件夹以防止无法接收邮件\n详细设置方法为......";

$smtp = Net::SMTP->new($mailhost, Hello => 'localhost', Timeout => 120, Debug => 1);

# anth login, type your user name and password here
$smtp->auth('user','pass');

foreach my $mailto (@mailto) {
# Send the From and Recipient for the mail servers that require it
$smtp->mail($mailfrom);
$smtp->to($mailto);

# Start the mail
$smtp->data();

# Send the header
$smtp->datasend("To: $mailto\n");
$smtp->datasend("From: $mailfrom\n");
$smtp->datasend("Subject: $subject\n");
$smtp->datasend("\n");

# Send the message
$smtp->datasend("$text\n\n");

# Send the termination string
$smtp->dataend();
}
$smtp->quit;
}
}
问题1.
上面说了:
if (-s $allfiles > 3000000){#这里似乎有问题,运行结果说"Use of uninitalized value in numeric gt (>) atsmtp1.pl line 5.
但我觉得没有什么问题啊,请指教!
问题2.
我将if (-s $allfiles > 3000000){该句改为:
if (-s 'd:/Mail/'.$allfiles > 3000000){
此时程序可以运行了,不过每运行一次,我都同时收到两封邮件,WHY?请指教!
请朋友们指教!

注明:这里拿了perlChina路扬老大的部分程序来用,在此标明.偶学习了,谢谢您!
仔细看了看我上面的程序,感觉没有什么实际价值:
1.针对局域网所有邮件用户(XP-PRO系统),这个opendir该如何写?
2.用(-s $allfiles > 3000000)限定不理想.因为当第">=2"次运行该程序的时候,无论个人文件夹2,3,4...容量是否达到3G,文件夹1已经满足了>3G,该程序都将自动给用户发送警告邮件.失去了预期的功效!

或许,用来监控邮件服务器更好吧!
请大大们给点意见,谢谢您!
怎么没人回复呢?真郁闷呀!
针对你的第一贴:
1: 可能你的文件路径不存在, 所以-s返回undef, 这个问题需要重视, 因为你的文件路径有问题.
2: 显然,你用了绝对路径,解决了问题1. 至于发出两封信, 可能是readdir读出了.和..了吧, 把$allfiles print出来看看.


QUOTE:
原帖由 windows.li 于 2007-9-11 23:22 发表
仔细看了看我上面的程序,感觉没有什么实际价值:
1.针对局域网所有邮件用户(XP-PRO系统),这个opendir该如何写?

这是因为你用readdir获取的文件列表,这时得到的只是一堆文件/目录名而已,没有路径的话,-s测试的时候会在当前目录找,当然找不到文件。
我看你第二个问题自己加了个路径,应该知道什么原因了。

QUOTE:
2.用(-s $allfiles > 3000000)限定不理想.因为当第">=2"次运行该程序的时候,无论个人文件夹2,3,4...容量是否达到3G,文件夹1已经满足了>3G,该程序都将自动给用户发送警告邮件.失去了预期的功效!

你用-s来获取该目录里的文件大小么?这个值不对吧。
针对你的第二贴

1: 没用过这个系统, 自己研究怎么获得所有用户的邮件存储文件列表吧.
2: 没太看明白, 你是说第二次运行的时候, 文件夹1仍然报警吗? 如果你不希望这样, 程序就要做的复杂一点, 判断该用户是否所有文件夹都超过3G, 都超过了才报警.
另外exchange有设置quota的吧,为什么要自己做呢。
如何管理配额邮件
http://technet.microsoft.com/zh-cn/library/bb232089.aspx

首先谢谢大家的回复,然而依然没有帮我解决问题啊!
4#兄弟:这与读入.和..没有任何关系.my @allfiles = grep { not /^\.{1,2}\z/ } readdir DIRMAIL;这样依然不行!
5#兄弟:-s 文件或目录存在,大小大于0(值为文件的大小,单位:字节).这个有什么问题么?

另外:感觉"d:/Mail"这种写法不科学,因为Exchange的outlook文件都是以.pst格式存在的,我想foreach硬盘中所有.pst文件更好些.请问,这句该如何写?
请您继续关注!
硬盘中所有的.pst文件,那可得搜索几个小时呢.

建议你做成google desktop的插件吧, 这样每次它搜到.pst文件的时候你可以判断下.

问题是你如何判断出哪些pst文件是属于同一个用户的呢?


QUOTE:
原帖由 windows.li 于 2007-9-12 12:05 发表
5#兄弟:-s 文件或目录存在,大小大于0(值为文件的大小,单位:字节).这个有什么问题么?

抱歉没说清楚。
我不知道exchange的邮件是怎么保存的,是一个用户一个文件
比如
d:.
└─Mail
        tom.pst
        jack.pst
        ...
还是一个用户一个文件夹,然后每封邮件一个文件。
d:.
└─Mail
    ├─tom
    │      1.pst
    └─jack
            1.pst
如果是一个用户一个文件,那用-s测试文件大小应该没问题。
不过我看见你提了是用户的文件夹,所以我猜测是第二种方式保存的,那么按照前面程序的做法,
-s只测试的目录文件大小,这个值并不代表这个目录下文件大小啊。