我正在尝试使用 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 的复杂性。这是用简单接口连接复杂系统的一个很好的例子。
哈希表是一种非常有效的组织键值对的方式,其中对键进行哈希处理作为查找值的一种方式,即使它是空的(如文档中所述)。
您可能阅读过有关哈希表的文章 维基百科。