-5

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

真诚感谢任何帮助。

4

1 回答 1

4

但我对PERL一无所知。

那么解决方案是

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


如果您决定尝试自己解决这个问题,这里有一些建议:

问题可以分解为子问题:

  • 解析规则文件。使用该split功能相当容易。

    该函数接受零到三个参数:正则表达式、字符串、限制。如果省略限制,则生成的片段数是任意的。如果省略字符串,则使用$_特殊变量。如果省略了正则表达式,它将被视为" "赋予了特殊值:拆分所有空格,并删除前导空格。

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

    • 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
}

剩下的……</h3>

…如果你记得的话,这几乎是微不足道的

  • 正确规范化,
  • use strict; use warnings;可以帮助您发现许多错误,并且
  • 该字符串比较是由eq操作员完成的。

于 2013-04-09T17:48:37.430 回答