参考

参考

我正在使用 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

相关内容