我被迫在qmail中实施发件人政策。
我有一个描述政策的文件:
User1@domain1.com:*@domain1.com,x@Domain2.COM,y@DOMAIN.com
user2@domain1.com:*@*
USER3@domain1.com:
此文件描述了以下情况:
user1@domain1.com can send messages to anyone having the address defined on domain1.com, to x@domain2.com and to y@domain.com
user2@domain1.com can send messages to anyone
user3@domain1.com can not send messages at all
应忽略字母大小写。
我必须使用qmailqueue和PERL(Mail :: Qmail :: Queue :: Message)在qmail中实现这些限制,但我根本不了解PERL。
真心感谢任何帮助。
答案 0 :(得分:4)
但我根本不了解PERL。
然后解决方案是
(顺便说一句,该语言被称为 Perl ,用于运行Perl程序的解释器称为 perl 。其他大写有点不受欢迎。)< / p>
如果您决定尝试自己解决这个问题,请参考以下几点:
问题可以分解为子问题:
解析规则文件。使用split
函数非常简单。
该函数需要零到三个参数:regex,string,limit。如果省略限制,则产生的片段的数量是任意的。如果省略该字符串,则使用$_
特殊变量。如果省略了正则表达式,它将被视为给出了特殊值" "
:在所有空格上拆分,并删除前导空格。
要解析一行,必须完成以下操作:
chomp
,:
上的行拆分为发件人和规则字符串,最多包含两个片段,,
上的规则字符串拆分为单个规则@
处的每个规则拆分为用户和域部分。然后可以将规则保存在数据库或Perl数据结构中。
给定一对发件人和收件人地址的匹配规则。对于数据库,可以使用一个很好的SQL查询来完成。如果是Perl数据结构,您可以:
将规则与地址匹配将首先检查规则部分(用户/域)是否为*
。否则,测试零件是否相等。用户和域部分都必须匹配整个规则才能匹配。
选择一个好的Perl数据结构:为了让我们的生活更轻松,所有电子邮件地址和规则只能以其标准化形式处理。这意味着例如小写。对于上述算法中的每个对象,可以定义一个单独的类。这可能是不可取的。取而代之的是,
这一行在$_
中给出,而hashref $rules_for_sender
在范围内
chomp;
my ($sender, $rules) = map lc, split /:/, $_, 2;
my @rules = map [split /@/], split /,/, $rules;
$rules_for_sender->{$sender} = \@rules;
for my $rule (@{ $rules->{$sender} } {
my ($rule_user, $rule_domain) = @$rule;
...; # do stuff here
}
...如果你还记得
,那几乎是微不足道的use strict; use warnings;
可帮助您找到许多错误,eq
运算符完成的。