为什么 Postfix 使用查找表?

为什么 Postfix 使用查找表?

我正在尝试使用 Postfix 在本地发送邮件。我不明白为什么要使用查找表。

我正在尝试从源代码构建最小的 Postfix,因此省略了 berkley DB 支持。因此,我并不期望 postfix 知道如何读取 Berkley DB 格式的文件。我的问题是,为什么 postfix 会尝试这样做?有没有办法避免表查找,即使是最小的 postfix 安装?

我已采取的措施

首先,我运行:./sendmail -t root@localhost 并输入一条消息:

Hi there,
bye.
.

一切似乎都很好。然后我检查了我的 Postfix 日志,其中显示:

Mar 17 18:02:22 USERNAME postfix/qmgr[117616]: ID: from=<[email protected]>, size=317, nrcpt=1 (queue active)
Mar 17 18:02:22 USERNAME postfix/qmgr[117616]: ID: from=<[email protected]>, size=323, nrcpt=1 (queue active)
Mar 17 18:02:22 USERNAME postfix/local[118209]: error: unsupported dictionary type: hash
Mar 17 18:02:22 USERNAME postfix/local[118209]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Mar 17 18:02:22 USERNAME postfix/local[118209]: warning: hash:/etc/aliases is unavailable. unsupported dictionary type: hash
Mar 17 18:02:22 USERNAME postfix/local[118209]: warning: hash:/etc/aliases: lookup of 'root' failed
Mar 17 18:02:22 USERNAME postfix/local[118210]: error: unsupported dictionary type: hash
Mar 17 18:02:22 USERNAME postfix/local[118210]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
Mar 17 18:02:22 USERNAME postfix/local[118210]: warning: hash:/etc/aliases is unavailable. unsupported dictionary type: hash
Mar 17 18:02:22 USERNAME postfix/local[118210]: warning: hash:/etc/aliases: lookup of 'root' failed
Mar 17 18:02:22 USERNAME postfix/local[118209]: ID: to=<root@localhost>, relay=local, delay=1148, delays=1148/0.01/0/0.03, dsn=4.3.0, status=deferred (alias database unavailable)
Mar 17 18:02:22 USERNAME postfix/local[118210]: ID: to=<root@localhost>, relay=local, delay=1115, delays=1115/0.01/0/0.03, dsn=4.3.0, status=deferred (alias database unavailable)

根据这个日志,我推断邮件成功通过了postfix/qmgr流程,而在postfix/local流程中遇到了问题。

我的main.cf文件是:

compatibility_level = 3.9
queue_directory = /srv/mail/postfix/queue
command_directory = /srv/mail/postfix/sbin
daemon_directory = /srv/mail/postfix/daemon
data_directory = /srv/mail/postfix/data
mail_owner = postfix
debug_peer_level = 2
debugger_command =
         PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
         ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /srv/mail/postfix/sendmail
newaliases_path = /srv/mail/postfix/newaliases
mailq_path = /srv/mail/postfix/mailq
setgid_group = postdrop
html_directory = /srv/mail/postfix/html
manpage_directory = /srv/mail/postfix/man
sample_directory = /srv/mail/postfix/conf
readme_directory = no
inet_protocols = ipv4
shlib_directory = no
meta_directory = /srv/mail/postfix/meta
mailbox_command=
maillog_file_prefixes=/srv/mail/postfix
maillog_file=/srv/mail/postfix/logs/mail.log

这里没有提到hash表格格式。我注意到hash默认设置中提到了格式。运行./postconf -d | grep hash返回:

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, nis:mail.aliases
default_database_type = hash
hash_queue_depth = 1
hash_queue_names = deferred, defer

有经验的人能告诉我 Postfix 是否需要使用某种类型的数据库吗?这种情况发生在哪里?

我的下一个计划是构建支持 MySQL 的 postfix 并使用该mysql:name格式 - 我宁愿不使用任何数据库,因为我正在尝试进行最小构建。

答案1

这就是为什么要使用查找表。

实现其“别名”功能。

禁用 BDB 并不等同于禁用所有依赖查找表的功能。你禁用的只是 20 多个不同的功能之一后端用于查找表,但您并没有禁用查找表的整体概念 - 或者邮箱别名。

有经验的人能告诉我 Postfix 是否需要使用某种类型的数据库吗?这种情况发生在哪里?

它出现在默认设置中,您刚刚在上一段中找到它。

默认设置并非全有或全无——它们会单独应用于您未明确指定的每个参数。因此,如果您未设置alias_maps自定义设置,则 Postfix 将使用hash:/etc/aliases, nis:mail.aliases默认值。

为了避免这种情况,请设置alias_maps为自定义。

查看数据库自述文件如果您不想使用 BDB,可以使用其他替代方案。“texthash:”类型是小型映射最接近的等效类型,它依赖于内存中的哈希表。非常小的映射可以使用“inline:”(用于多个条目)或“static:”(catch-all)以内联方式指定。

答案2

Postfix 使用哈希表来组织大部分数据。

Postfix 文档在文章中对此进行了描述 Postfix 查找表模型

Postfix 使用查找表来存储和查找信息,用于访问控制、地址重写甚至内容过滤。所有 Postfix 查找表都指定为“type:table”,其中“type”是本文档末尾“Postfix 查找表类型”下描述的数据库类型之一,其中“table”是查找表名称。Postfix 文档使用术语“数据库”和“查找表”来表示同一事物。

Postfix 文档中经常出现的查找表示例:

/etc/postfix/main.cf:
    alias_maps = hash:/etc/postfix/aliases            (local aliasing)
    header_checks = regexp:/etc/postfix/header_checks (content filtering)
    transport_maps = hash:/etc/postfix/transport      (routing table)
    virtual_alias_maps = hash:/etc/postfix/virtual    (virtual aliasing)

所有 Postfix 查找表都以 (键,值) 对的形式存储信息。这个接口乍一看可能过于简单,但实际上却非常强大。(键,值) 查询接口完全隐藏了 Postfix 中的 LDAP 或 SQL 的复杂性。这是用简单接口连接复杂系统的一个很好的例子。

哈希表是一种非常有效的组织键值对的方式,其中对键进行哈希处理作为查找值的一种方式,即使它是空的(如文档中所述)。

您可能阅读过有关哈希表的文章 维基百科

相关内容