配置 Sendmail 服务器以接受外部传入电子邮件

配置 Sendmail 服务器以接受外部传入电子邮件

出于安全原因,sendmail默认情况下配置为接受来自本地系统 (127.0.0.1) 的连接,以避免开放邮件中继问题。但是,

如何强制 sendmail 接受来自互联网的邮件?

本文于http://www.cyberciti.biz/tips/sendmail-is-only-accepting-connections-from.htmlAddr=127.0.0.1说,从中删除部分

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

DAEMON_OPTIONS(`Port=smtp,Name=MTA')dnl

将“强制接受来自任何主机的连接”。我已经这样做了:

$ grep smtp /etc/mail/sendmail.mc
dnl DAEMON_OPTIONS(`Family=inet6, Name=MTA-v6, Port=smtp, Addr=::1')dnl
DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp')dnl
MAILER(`smtp')dnl

但是,看起来我仍然无法接受来自互联网的来信。因此,按照 moonpoint 的建议,将其注释掉:

$ grep smtp /etc/mail/sendmail.mc
dnl DAEMON_OPTIONS(`Family=inet6, Name=MTA-v6, Port=smtp, Addr=::1')dnl
dnl DAEMON_OPTIONS(`Family=inet,  Name=MTA-v4, Port=smtp')dnl
MAILER(`smtp')dnl

% make
Updating databases ...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...
Creating /etc/mail/relay-domains
# Optional file...
Updating Makefile ...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/Makefile...
Updating sendmail.cf ...
The following file(s) have changed:
  /etc/mail/sendmail.cf /etc/mail/local-host-names
** ** You should issue `/etc/init.d/sendmail reload` ** **

% /etc/init.d/sendmail reload
 * Reloading Mail Transport Agent (MTA) sendmail                    [ OK ]

但是,我认为它没有按预期工作,因为之前至少我得到了“拒绝中继”错误,但现在,当我尝试通过谷歌向我的系统发送电子邮件时,大约 10 分钟内什么都没有发生。尝试自己解决问题,我参考http://support.moonpoint.com/blog/blosxom/2015/04/04#smtp-telnet-commands并尝试使用 连接我的服务器telnet。但我立即收到“连接被拒绝”错误:

$ telnet xpt.mydomain.org 25
Trying 104.243.xx.xx...
telnet: Unable to connect to remote host: Connection refused

删除它dnl以恢复到我之前得到的状态,我现在至少可以连接:

$ telnet xpt.mydomain.org 25
Connected to xpt.mydomain.org.
Escape character is '^]'.
220 mail.xpt.mydomain.net ESMTP Sendmail 8.14.4/8.14.4/Debian-2.1ubuntu4; Sun, 14 Jun 2015 22:16:13 -0400; (No UCE/UBE) logging access from: my.remote.domain

如果我想接受来自互联网的电子邮件,我该怎么做?

更新:我已经将 sendmail 配置为我的 LAN 的邮件服务器,并且认为我已经将 sendmail 配置为接受我在服务器上用于电子邮件的相关域名的电子邮件,但是我得到的结果如下:

% sendmail -bv [email protected]
[email protected]... deliverable: mailer relay, host mail.myisp.com, user [email protected]

现在我知道不是了(实际上它是用我拥有的另一个动态 DNS 名称配置的),所以我将其更改为 xpt.mydomain.org。现在看起来没问题:

% sendmail -bv [email protected]
[email protected]... deliverable: mailer local, user me

但是,使用外部电子邮件帐户向我的系统发送电子邮件时,我收到:

Delivery to the following recipient failed permanently:

     [email protected]

Technical details of permanent failure:
Google tried to deliver your message, but it was rejected by the server for the recipient domain xpt.mydomain.org by xpt.mydomain.org. [104.243.xx.xx].

The error that the other server returned was:
550 5.7.1 <[email protected]>... Relaying denied

----- Original message -----

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=mime-version:date:message-id:subject:from:to:content-type;
        bh=0rLnzRsn....

好的,我很高兴垃圾邮件发送者不能使用我的 Sendmail 服务器来中继电子邮件,但是我也没有收到电子邮件。

那么,如何才能避免开放邮件中继问题,同时允许来自所有 LAN 主机的连接发送邮件并接收来自任何人的电子邮件?

更新 2:为了进一步自行解决问题,我进一步推进,使用 测试了完整的 SMTP 协议telnet。奇怪的是,当我使用 时,我没有收到“拒绝中继”错误telnet

...
mail from: [email protected]
250 2.1.0 [email protected]... Sender ok
rcpt to: [email protected]
550 5.7.1 [email protected]... Relaying denied
rcpt to: [email protected]
250 2.1.5 [email protected]... Recipient ok
Data
354 Enter mail, end with "." on a line by itself
This is a test message.
.
250 2.0.0 t5F2ItI0008331 Message accepted for delivery
quit
221 2.0.0 mail.xpt.mydomain.net closing connection
Connection closed by foreign host.

现在一切都正常了。非常感谢 moonpoint!!!

谢谢

$ lsb_release -a 
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 13.10
Release:        13.10
Codename:       saucy

$ apt-cache policy sendmail-bin
sendmail-bin:
  Installed: 8.14.4-2.1ubuntu4
  Candidate: 8.14.4-2.1ubuntu4
  Version table:
 *** 8.14.4-2.1ubuntu4 0
        500 http://us.archive.ubuntu.com/ubuntu/ saucy/universe amd64 Packages
        100 /var/lib/dpkg/status

PS。关于我为什么要这样做,我想做的只是让我的 sendmail 服务器能够接受来自互联网的邮件,供我个人使用。我曾尝试遵循以下 5简单的多次步骤,

如何通过 5 个简单步骤在 Debian 上设置简单的邮件服务器
http://cnedelcu.blogspot.ca/2014/01/how-to-set-up-simple-mail-server-debian-linux.html

但最后,它们都没起作用,我甚至不知道哪里出了问题。所以我认为最简单的方法是启用我的 sendmail 服务器。

答案1

您是否已将 sendmail 配置为接受服务器上用于电子邮件的相关域名的电子邮件?例如,如果您的域名是 example.com,系统上的有效电子邮件地址应该是[电子邮件保护],如果您从系统上的 root 帐户运行该命令,它是否表明电子邮件是可传递的并引用“mailer local”和本地帐户?例如,您是否看到类似以下内容的内容?sendmail -bv [email protected]

# sendmail -bv [email protected]
[email protected]... deliverable: mailer local, user xpt

如果您已将 sendmail 配置为接受相关域名的电子邮件,它将引用“mailer local”和本地帐户。

更新:您从命令提供的输出sendmail -bv表明您没有将 sendmail 配置为接受发往 xpt.mydomain.org 的电子邮件。要让 sendmail 接受域名的电子邮件,您需要添加该域名 xpt.mydomain.org,然后/etc/mail/local-host-names您需要发出命令makemap hash /etc/mail/local-host-names < /etc/mail/local-host-names。不要担心发出命令时可能会看到的任何“没有 RHS 对应 LHS”消息。尝试一下,然后重新运行相同的命令。当您重新运行命令时,您应该会看到对“mailer local”而不是“mailer reply”的引用,并且“user”后面应该跟着一个本地帐户,而不是“sendmail -bv [email protected]sendmail -bv [email protected][电子邮件保护]“。 看让 sendmail 接受某个域的电子邮件makemap有关和命令输出的示例sendmail -bv

更新 2:你引用了Sendmail 仅接受来自本地主机(127.0.0.1 IP)的连接文章中,但也许您没有对下面的行进行必要的更改/etc/mail/sendmail.mc

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

您需要在该行开头添加“dnl”来注释掉该行。它应该类似于以下行:

dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl

我没有添加文章建议的行来代替原始行,我只是将其注释掉,然后使用以下命令从 sendmail.mc 文件重建 sendmail.cf 文件,以便让 sendmail 接受由运行 sendmail 的服务器之外的电子邮件客户端发送的电子邮件。

m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf

使用 m4 命令重建文件后,您需要重新启动 sendmail。本文建议使用 执行此操作。/etc/init.d/sendmail restart如果该命令没有在您的系统上重新启动 sendmail,例如,如果它生成 ,No such file or directory message请尝试service sendmail restartsystemctl restart sendmail。重新启动 sendmail 后,它应该会接受系统上有效电子邮件地址的电子邮件,即您在 local-host-names 文件中列出的域的电子邮件。

您是否有一个外部电子邮件帐户,可用于将电子邮件发送到系统上的地址,例如 Hotmail、Gmail 或其他电子邮件帐户?如果有,如果您向系统上的有效电子邮件地址发送电子邮件,您会在退回的电子邮件中看到什么?退回的电子邮件中引用的错误是什么?

即使您已正确配置了 sendmail,也可能需要解决其他问题才能从 Internet 接收电子邮件。您说您的防火墙规则已正确配置。您可能需要在运行 sendmail 的系统和 sendmail 服务器所在的局域网 (LAN) 上的任何外部路由器/防火墙上都设置适当的防火墙规则。为了使外部电子邮件服务器与您的电子邮件服务器通信,如果您的 LAN 上的路由器/防火墙正在使用网络地址转换 (NAT)),您需要配置该设备以转发端口连接到端口 25,简单邮件传输协议 (SMTP)用于将电子邮件从一个电子邮件服务器传送到另一个电子邮件服务器、从防火墙/路由器传送到您的发送邮件服务器的端口。

如果您已正确设置了所需的防火墙规则和所需的端口转发,则外部系统应该能够成功连接到您的 sendmail 服务器上的端口 25。您可以使用许多网站免费提供的众多端口检查服务之一来测试这是否可行,这将有助于缩小问题根源。例如,您可以使用端口转发测试器。如果您没有从服务器运行测试,则可能需要提供外部系统在尝试与您的服务器通信时将看到的 IP 地址,如果您的服务器所在的网络上有防火墙或路由器,并且使用 NAT 将您的服务器与互联网隔离,则该 IP 地址将与您分配给它的 IP 地址不同。要找到外部系统将看到的地址,您可以使用许多免费服务中的任何一种,这些服务会在您访问提供该服务的实体的网站时向您显示设备的外部可见 IP 地址。例如,您可以使用 Web 浏览器访问whatismyip.com来自您的 sendmail 服务器。然后在端口转发测试器站点,您将使用该 IP 地址作为“远程地址”,并使用 25 作为端口号。单击“检查”时,您应该会看到“端口 25 已打开”,后面跟着您提供的 IP 地址(如果您已正确配置了必要的防火墙规则和任何所需的端口转发)。

您还可以使用远程登录在网络之外的系统上尝试连接到 sendmail 服务器上的端口 25。如果您已设置了所需的防火墙规则和任何所需的端口转发,则应该会在服务器上看到来自 sendmail 的响应。如果您可以建立与 sendmail 服务器上端口 25 的连接,则可以发出 SMTP 命令,以便尝试向服务器上的帐户发送测试消息。例如,请参阅使用 SMTP 命令测试电子邮件传送

如果你能通过该方法成功发送电子邮件,那么也许你没有合适的邮件交换器 (MX) 记录您的电子邮件服务器。假设完全限定域名您的 sendmail 服务器的地址是 example.com。如果有人使用 Hotmail、Gmail 或除您的电子邮件服务器之外的任何电子邮件服务器向您发送电子邮件,假设使用[电子邮件保护],其他电子邮件服务器将检查指定哪个或哪些电子邮件服务器来处理 example.com 的电子邮件。不一定非得是 example.com。例如,您可以使用外部电子邮件提供商提供的电子邮件服务,比如 bigemailprovider.com。

您可以使用MX 查询服务来检查您域名的 MX 记录。只需输入您的域名并点击“MX 查询”即可。例如,这个关联将显示 gmail.com 的结果。如果您尝试从 sendmail 服务器向 gmail.com 地址发送电子邮件,您的服务器将执行类似的检查并看到类似的结果。Google 有许多电子邮件服务器可以为 Gmail 用户接受来自其他服务器的电子邮件。您将看到具有不同首选项和 IP 地址的此类服务器的列表。您的服务器和其他服务器将首先尝试具有最低首选项的服务器。例如,将先尝试首选项为 5 的 Gmail 服务器,然后再尝试首选项为 10 的服务器。如果您的服务器无法与首选项为 5 的 Gmail 服务器通信,它将尝试首选项为 10 的服务器,也许在放弃之前尝试许多 Gmail 服务器。

如果您没有看到任何域名的 MX 记录,那也没关系。如果您使用的是 example.com,而 example.com 上没有 MX 记录,那么另一个电子邮件服务器会认为 example.com 的 IP 地址是它应该尝试发送电子邮件的位置。如果您看到 MX 记录指向的 IP 地址不是您的发送邮件服务器的 IP 地址,那么您可能需要通过域名注册商(例如,您通过其注册服务器域名的公司)提供的域名系统 (DNS) 设置网页修改域名的 MX 记录。有些注册商会默认在您注册域名时创建指向其电子邮件服务器的 MX 记录。您可以在 Unix、Linux、OS X 或 Microsoft Windows 系统上从命令行提示符手动执行相同的检查使用 nslookup 命令检查 MX 记录.例如,nslookup -querytype=mx gmail.com

相关内容