验证电子邮件发件人是否有权发送到某个地址

时间:2013-04-09 13:40:14

标签: arrays perl policy qmail mail-sender

我被迫在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。

真心感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

  

但我根本不了解PERL。

然后解决方案是

(顺便说一句,该语言被称为 Perl ,用于运行Perl程序的解释器称为 perl 。其他大写有点不受欢迎。)< / p>


如果您决定尝试自己解决这个问题,请参考以下几点:

问题可以分解为子问题:

  • 解析规则文件。使用split函数非常简单。

    该函数需要零到三个参数:regex,string,limit。如果省略限制,则产生的片段的数量是任意的。如果省略该字符串,则使用$_特殊变量。如果省略了正则表达式,它将被视为给出了特殊值" ":在所有空格上拆分,并删除前导空格。

    要解析一行,必须完成以下操作:

    • 使用chomp
    • 删除尾随换行符
    • :上的行拆分为发件人和规则字符串,最多包含两个片段,
    • ,上的规则字符串拆分为单个规则
    • @处的每个规则拆分为用户和域部分。

    然后可以将规则保存在数据库或Perl数据结构中。

  • 给定一对发件人和收件人地址的匹配规则。对于数据库,可以使用一个很好的SQL查询来完成。如果是Perl数据结构,您可以:

    • 检索发件人地址的所有规则
    • 迭代所有规则:匹配用户和域部分,并在两者匹配后返回true。
    • 否则,返回false

    将规则与地址匹配将首先检查规则部分(用户/域)是否为*。否则,测试零件是否相等。用户和域部分都必须匹配整个规则才能匹配。

  • 选择一个好的Perl数据结构:为了让我们的生活更轻松,所有电子邮件地址和规则只能以其标准化形式处理。这意味着例如小写。对于上述算法中的每个对象,可以定义一个单独的类。这可能是不可取的。取而代之的是,

    • 每个规则可以表示为2值数组引用
    • 发件人的规则列表可以表示为规则的数组引用。
    • 发件人地址和收件人规则之间的关联可以通过哈希进行。

代码示例

解析一行

这一行在$_中给出,而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运算符完成的。