Sendmail:本地和非本地地址的综合解决方案

Sendmail:本地和非本地地址的综合解决方案

我需要为测试环境设置一个邮件服务器配置,该配置将接受所有邮件(即所有用户和所有域,甚至非本地的邮件)并将其放入单个本地综合邮箱中。

我拥有的是带有 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

相关内容