我需要为测试环境设置一个邮件服务器配置,该配置将接受所有邮件(即所有用户和所有域,甚至非本地的邮件)并将其放入单个本地综合邮箱中。
我拥有的是带有 Sendmail (8.14) 的 SLES 11,我尝试修改 /etc/mail/virtusertable 使其看起来像
@ catchall
或者类似
@* catchall
但无济于事 - 目标邮件地址(例如“[电子邮件保护]“)不会被重写为全部@,因此尝试将邮件投递至相应的 MX:
# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> 3,0 [email protected]
canonify input: santa @ northpole . org
Canonify2 input: santa < @ northpole . org >
Canonify2 returns: santa < @ northpole . org . >
canonify returns: santa < @ northpole . org . >
parse input: santa < @ northpole . org . >
Parse0 input: santa < @ northpole . org . >
Parse0 returns: santa < @ northpole . org . >
ParseLocal input: santa < @ northpole . org . >
ParseLocal returns: santa < @ northpole . org . >
Parse1 input: santa < @ northpole . org . >
MailerToTriple input: < > santa < @ northpole . org . >
MailerToTriple returns: santa < @ northpole . org . >
Parse1 returns: $# esmtp $@ northpole . org . $: santa < @ northpole . org . >
parse returns: $# esmtp $@ northpole . org . $: santa < @ northpole . org . >
查找表的源域部分似乎不支持通配符。
我该如何使用 Sendmail 实现这一点?
编辑:按照Andrzej 的评论我已经尝试过 mailertable 条目
. local:catch-all-outgoing
也
.. local:catch-all-outgoing
sendmail -bv
并在两种情况下收到相同的输出:
# sendmail -d60.5 -bv [email protected]
map_lookup(dequote, root, %0=root) => NOT FOUND (0)
map_lookup(host, example.net, %0=example.net) => example.net. (0)
[email protected]... deliverable: mailer esmtp, host example.net., user [email protected]
(是的,root,因为sendmail
似乎无法以非root身份运行)
编辑:事实证明,宏文件中尚未启用 mailertable 功能,因此 sendmail.cf 不包含使其正常工作所需的适当的重写规则。
答案1
您在这里遇到的问题:/etc/mail/virtusertable
我相信仅限于入站电子邮件,而不限出站电子邮件。
您可以使用 mailertable 或 SMART_HOST 中的默认路由将所有非本地消息发送到一个本地邮箱/别名。
mailertable entry:
. local:catch-all-outgoing
aliases:
catch-all-outgoing: some-local-account
任何不以点开头的 LHS 条目都与指定的完整主机名匹配。以点开头的 LHS 条目与以该域名结尾的任何内容匹配(包括前导点)——也就是说,它们可以被视为具有非空字符序列的前导“.+”正则表达式模式。
RHS 应始终为“mailer:host”对。mailer 是邮件程序的配置名称(即 sendmail.cf 文件中的 M 行)。“host”将是传递给该邮件程序的主机名。
(参考:sendmail 自述文件,“使用 MAILERTABLES” 部分)
因此类似于:
. local:catch-all-outgoing
(只有一个点Adrzej 的评论) 应导致任何 domain.tld 重定向到 sendmail.cf 中定义的本地邮件程序配置。别名会捕获主机名catch-all-outgoing
并使其成为本地电子邮件地址。
要使 mailertable 正常工作,需要在配置中启用它。添加
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
生成配置的 m4 宏文件应该可以解决该问题。
另请参阅来自 sendmail 站点帮助文件的内容:
邮寄表:
包含一个“邮件表”,可用于覆盖特定域的路由(不属于 {w} 类,即本地主机名)。FEATURE 的参数可以是键定义。如果没有指定,则使用的定义是:
哈希 /etc/mail/mailertable
该数据库中的键是完全限定域名或以点开头的部分域名 - 例如“vangogh.CS.Berkeley.EDU”或“.CS.Berkeley.EDU”。作为后者的特例,“。”匹配其他键未涵盖的任何域。值必须采用以下格式:mailer:domain
其中“mailer”是内部邮件程序名称,“domain”是发送邮件的位置。这些映射不会反映到邮件头中。作为特殊情况,形式:local:user 将使用本地邮件程序转发给指定的用户,
答案2
Sendmail:本地和非本地地址的综合解决方案
您可以SMART_HOST
为非本地域和MAIl_HUB
本地电子邮件域进行定义。
发送邮件.mc:
define(`SMART_HOST',`local:some_existing_user')dnl
define(`MAIL_HUB',`local:some_existing_user')dnl
dnl optional part to list local users/mailboxes excluded from the redirect
dnl in /etc/mail/direct-users file (one user per line)
LOCAL_CONFIG
FL/etc/mail/direct-users
divert(0)
附言
用于echo '$=w' | sendmail -bt
获取本地电子邮件域列表。默认情况下,Sendmail 会自动填充该列表。
mailertable 可用于从重定向中排除某些外部域
example.net %0