28.5 疑难解答

28.5.1. 为什么必须在我的站点的主机上使用 FQDN?
28.5.2. sendmail 提示信息 “mail loops back to myself
28.5.3. 我如何在一个拨号主机上运行一个邮件服务?
28.5.4. 为什么当我发送邮件到其它主机总是有 “Relaying Denied” 出错信息?

28.5.1. 为什么必须在我的站点的主机上使用 FQDN?

您可能会发现主机实际上是在另外一个域里面, 例如,如果您是在 foo.bar.edu 里,而您要找一台叫 mumble 的主机,它在 bar.edu 域里,您就必须用完整的域名 mumble.bar.edu,而不是用 mumble

传统上,这在 BSD BIND resolvers 中是可行的。 然而目前随 FreeBSD 附带的 BIND 已不为同一域外提供缩写服务。所以,这个不完整的主机名 mumble 必须以 mumble.foo.bar.edu 这种形式才能被找到, 或者将在根域中搜索它。

这跟以前的处理是不同的,以前版本将会继续寻找 mumble.bar.edumumble.edu。 如果您想要了解这种方式是否是好,或者它有什么安全方面的漏洞, 请参阅 RFC 1535 文档。

如果您想要一个好的工作环境,您可以使用如下行:

search foo.bar.edu bar.edu
替换先前旧的版本:
domain foo.bar.edu
把这行放在您的 /etc/resolv.conf 文件中。然而,请一定要确定这样的搜寻顺序不会造成 RFC 1535 里提到的“boundary between local and public administration” 问题。

28.5.2. sendmail 提示信息 “mail loops back to myself

下面是 sendmail FAQ 中的回答:

我得到了如下的信息:

553 MX list for domain.net points back to relay.domain.net
554 <user@domain.net>... Local configuration error

我如何解决这个问题?

您已经通过 MX 记录指定把发送给特定的域 (例如,domain.net)
的邮件被转寄到指定的主机 (在这个例子中,relay.domain.net),
而这台机器并不认为它自己是 domain.net。请把 domain.net 添加到
/etc/mail/local-host-names 文件中 [在 8.10 版之前是 /etc/sendmail.cw]
(如果您使用 FEATURE(use_cw_file) 的话) 或者在 /etc/mail/sendmail.cf
中添加“Cw domain.net”。

sendmail 的 FAQ 可以在 http://www.sendmail.org/faq/ 找到, 如果您想要对您的邮件做任何的“调整”, 则推荐首先看一看它。

28.5.3. 我如何在一个拨号主机上运行一个邮件服务?

您想要把局域网上的 FreeBSD 主机连接到互连网上,而这台 FreeBSD 主机将会成为这个局域网的邮件网关, 这个拨号连接不必一直保持在连接状态。

最少有两种方法可以满足您的要求。一种方法就是使用 UUCP。

另一种方法是找到一个专职的服务器来为您的域提供副 MX 主机服务。 例如,如果您公司的域名是 example.com,您的互连网服务提供者把 example.net 作为您域的副 MX 服务:

example.com.          MX        10      example.com.
                      MX        20      example.net.

只有一台主机被指定当做您的最终收信主机 (在 example.com 主机的 /etc/mail/sendmail.cf 文件中添加 Cw example.com)。

sendmail 试图分发邮件的时候, 它会尝试通过 modem 连接到您 (example.com)。 因为您并不在线,所以总是会得到一个超时的错误。 sendmail 将会把邮件发送到副 MX 主机,也就是说,您的互连网服务提供者 (example.net)。副 MX 主机将周期性的尝试连接并发送邮件到您的主机 (example.com)。

您也许想要使用下面的这个登录脚本:

#!/bin/sh
# Put me in /usr/local/bin/pppmyisp
( sleep 60 ; /usr/sbin/sendmail -q ) &
/usr/sbin/ppp -direct pppmyisp

如果您想要为一个用户建立一个分开登录的脚本, 您可以使用 sendmail -qRexample.com 替换上面的脚本。这样将使所有的邮件按照您的 example.com 队列立即被处理。

更深入的方法可以参考下面这段:

这段信息是从 FreeBSD Internet 服务提供商的邮件列表 拿来的。

> 我们为用户提供副 MX 主机服务。用户每天都会上线好几次
> 并且自动把信件取回主 MX 主机
> (当有他们的邮件时我们并没有通知他们)。
> 我们的 mailqueue 程序每 30 分钟清一次邮件队列。那段时间他们
> 就必须上线 30 分钟以确保他们的信件送达他们的主 MX 主机。
>
> 有任何指令可以用 sendmail 寄出所有邮件么?
> 普通用户在我们的机器上当然没有 root 权限。

在 sendmail.cf 的“privacy flags”部分,有这样的设定
Opgoaway,restrictqrun

移除 restrictqrun 可以让非 root 用户启动队列处理的程序。
您可能也要重新安排您的 MX 设定。我们是用户的 MX 主机,
而且我们还设定了这个:

# If we are the best MX for a host, try directly instead of generating # local config error.
OwTrue

这样的话远程机器会直接把信送给您,而不会尝试连接您的用户的机器。
然后您就可以把邮件发送到您的用户。这个设定只对
“主机”有效,所以您必须要让您的用户在 DNS 中把他们的邮件主机设置为
“customer.com”或者
“hostname.customer.com”。只要为“customer.com”在 DNS
里添加一个 A 记录就可以了。

28.5.4. 为什么当我发送邮件到其它主机总是有 “Relaying Denied” 出错信息?

默认的 FreeBSD 安装中, sendmail 会配置为只发送来自它所在主机上的邮件。 例如,如果有可用的 POP 服务器,则用户将可以从学校、 公司或其他什么别的地方检查邮件,但他们仍然无法从远程直接发送邮件。 通常,在几次尝试之后, MAILER-DAEMON 将发出一封包含 “5.7 Relaying Denied” 错误信息的邮件。

有很多方法可以避免这种现象。 最直截了当的方法是把您的 ISP 的地址放到 /etc/mail/relay-domains 文件中。 完成这项工作的简单的方法是:

# echo "your.isp.example.com" > /etc/mail/relay-domains

建立或编辑这个文件以后您必须重新启动 sendmail。 如果您是一个管理员并且不希望在本地发送邮件, 或者想要在其它的机器甚至其它的 ISP 上使用一个客户端系统, 这个方法是很方便的。如果您仅有一到两个邮件帐户它也非常的有用。 如果有大量的地址需要添加, 您可以很简单的使用您喜欢的文本编辑器打开这个文件添加域名, 每行一个:

your.isp.example.com
other.isp.example.net
users-isp.example.org
www.example.org

现在邮件可以通过您的系统传送, 这个列表中存在的主机 (前提是用户在您的系统上已经有一个帐户) 将可以成功的发送。这是一个允许正常的远程用户从您的系统发送邮件, 并且阻止其它非法用户通过您系统发送垃圾邮件的好方法。

本文档和其它文档可从这里下载:ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读文档,如不能解决再联系<questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.