我正在使用 sendmail 从文本文件发送一封非常简单的电子邮件。这是文本文件:
to:[email protected]
from:[email protected]
subject:Testing
test test test
我发送的:
sendmail -t < mail.txt
我运行 sendmail 的服务器是 hostname.tld。这是/etc/hosts:
12.34.56.78 hostname hostname.tld
127.0.0.1 localhost
其中 hostname.tld 是服务器的 FQDN,12.34.56.78 是服务器的公共 IP。 /etc/hostname 仅包含 hostname.tld
当我收到电子邮件时,我收到以下标题:
Received: from hostname.tld (hostname.tld [127.0.0.1])
我不需要 127.0.0.1,我希望有公共 IP,但无论我做什么,都无法让 sendmail 使用它。我还编辑了 /etc/mail/sendmail.mc,使其包含以下行:
define(`confDOMAIN_NAME', `hostname.tld')dnl
但它什么也没做。
我读过很多帖子,人们有类似的问题,但似乎没有任何办法可以解决。我能做些什么?
答案1
守护进程模式与 MSP
您上面提到的IP地址的注释实际上并不是sendmail
服务器本身的配置。如果您查看现代部署,sendmail
它通常分为两个组件。传统服务器(守护进程模式)和另一台服务器运行在邮件提交程序模式(MSP)。您可以通过一个简单的命令看到这一点ps
:
$ ps -eaf | grep send
root 24488 1 0 21:10 ? 00:00:00 sendmail: accepting connections
smmsp 24504 1 0 21:10 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
第一行是守护进程模式下的sendmail,第二行是MSP 模式下的sendmail。您始终可以区分它们,因为大多数附带 sendmail 的发行版都使 MSP 变体作为具有较低权限的特殊用户运行。这是它以用户身份在我的 CentOS 5.x 服务器上运行的情况smmsp
。
笔记:这样做是为了分离处理邮件提交 (MSP) 和邮件传递 (守护进程模式) 的职责。用户在本地使用诸如mail
和 之类的命令发送邮件时连接到 MSP 实例。mailx
在基于 Red Hat 的发行版(例如 CentOS)上处理 sendmail 时,配置文件位于此处:/etc/mail
。我们对此修改感兴趣的文件有 2 个:
- /etc/mail/sendmail.mc
- /etc/mail/submit.mc
第一个文件控制守护程序模式服务器,而第二个文件用于 MSP 服务器。
顺便说一下,这些*.mc
文件并不是两台服务器直接使用的实际配置文件;一般来说sendmail
配置可能会很复杂。鉴于它的年龄和多功能性,它可以通过多种方式进行配置,因此这些*.mc
文件是预配置文件,可以“编译”到实际的sendmail
配置文件中。这些文件的编译版本也位于同一目录中:
- /etc/mail/sendmail.cf
- /etc/mail/submit.cf
通常明智的做法是不要直接更改这两个文件,而是通过其相应的.mc
文件进行更改。您通常会编辑.mc
文件,然后make
在/etc/mail
目录内运行命令。据我所知,这又是一种红帽主义,因此另一个发行版可能会让事情有所不同。
笔记:* 这些.mc
文件采用宏语言,称为M4,所以编译它们的工具当然叫做m4
。你可以用以下命令手动编译这些文件:
$ m4 /etc/mail/submit.mc > /etc/mail/submit.cf
这就是Red Hat 在目录中提供的所有花哨的make
内容。Makefile
/etc/mail
对 Submit.cf 的更改
那么你需要做出哪些改变呢?需要将以下行附加到submit.mc
文件中:
CLIENT_OPTIONS(`Family=inet, Address=<your ip here>, Name=MTA')dnl
请务必在其显示的位置添加您的 IP <your ip here>
。进行此更改后,您需要重新生成submit.mc
文件。
$ cd /etc/mail && make
重新生成.cf
文件后,您需要重新启动sendmail
:
$ /etc/init.d/sendmail restart
-or-
$ /etc/init.d/sendmail reload
完成品
进行上述更改后,您将看到以下标题。例如,在此示例中,我的外部 IP 地址是 50.122.22.45。
Return-Path: <[email protected]>
Received: from mail.sdom.com (mail.sdom.com [50.122.22.45])
by sdom.com (8.14.3/8.14.3) with ESMTP id r5J188Gx018193
for <[email protected]>; Tue, 18 Jun 2013 21:08:08 -0400
Received: (from root@localhost)
by mail.sdom.com (8.14.3/8.14.3/Submit) id r5J15ua4018000;
Tue, 18 Jun 2013 21:05:56 -0400
Date: Tue, 18 Jun 2013 21:05:56 -0400
Message-Id: <[email protected]>
to:[email protected]
from:[email protected]
subject:Testing
X-Spam-Status: No, score=-4.4 required=5.0 tests=ALL_TRUSTED,BAYES_00
autolearn=ham version=3.2.5
X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on mail.sdom.com
X-Greylist: Sender is SPF-compliant, not delayed by milter-greylist-4.0 (sdom.com [127.0.0.1]); Tue, 18 Jun 2013 21:08:09 -0400 (EDT)
test test test
参考
答案2
这是我的解决方案:
/etc/主机:
12.34.56.78 hostname.tld
127.0.0.1 localhost
/etc/mail/submit.mc :
FEATURE(`msp', `[12.34.56.78]', `25')dnl
(最初它有 127.0.0.1 而不是我的公共 IP)
/etc/mail/sendmail.mc :
DAEMON_OPTIONS(`Family=inet, Name=MTA-v4, Port=smtp, Addr=12.34.56.78')dnl
DAEMON_OPTIONS(`Family=inet, Name=MSP-v4, Port=submission, M=Ea, Addr=12.34.56.78')dnl
(这两行最初都有 127.0.0.1,更改它会使 sendmail 侦听您的公共 IP 而不是本地主机)。
运行命令:
make -C /etc/mail
重新加载发送邮件:
service sendmail reload
发送我的测试电子邮件后:
sendmail -t < mail.txt
我现在不喜欢的标题说:
Received: from hostname.tld (hostname.tld [12.34.56.78])
并且标头中的任何位置都没有提及 localhost 或 127.0.0.1