我正在我的 ubuntu 9.10 机器上进行 Web (php) 开发。
我使用 sendmail 发送邮件,在本地机器上进行开发时,我会发送本地邮件(发送给我的用户“doron”)。
直到几天前,我既可以通过 php 的 mail() 函数发送邮件,也可以使用 mail 命令从命令行发送邮件。
我使用带有 mailutils 的 sendmail。
从最近几天开始,它似乎停止工作了。
当我尝试从命令行发送邮件时,我在 syslog(以及 mail.info 和 mail.log)中收到以下内容:
Mar 3 13:27:58 doron-desktop sendmail[4693]: o23BRwlA004693: from=doron, size=84, class=0, nrcpts=1, msgid=<201003031127.o23BRwlA004693@doron-desktop.>, relay=doron@localhost
Mar 3 13:27:58 doron-desktop sm-mta[4694]: o23BRwtQ004694: ruleset=check_rcpt, arg1=<doron@doron-desktop>, relay=localhost [127.0.0.1], reject=553 5.1.8 <doron@doron-desktop>... Domain of sender address doron@doron-desktop does not exist
Mar 3 13:27:58 doron-desktop sendmail[4693]: o23BRwlA004693: to=<doron@doron-desktop>, ctladdr=doron (1000/1000), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30084, relay=[127.0.0.1] [127.0.0.1], dsn=5.1.8, stat=User unknown
Mar 3 13:27:58 doron-desktop sm-mta[4694]: o23BRwtQ004694: from=<doron@doron-desktop>, size=84, class=0, nrcpts=0, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1]
尝试本地 telnet 到端口 25 的结果如下(doron@doron-desktop 的输出相同):
doron@doron-desktop:/var/mail$ telnet localhost 25
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 doron-desktop. ESMTP Sendmail 8.14.3/8.14.3/Debian-9ubuntu1; Wed, 3 Mar 2010 13:26:06 +0200; (No UCE/UBE) logging access from: localhost(OK)-localhost [127.0.0.1]
helo localhost
250 doron-desktop. Hello localhost [127.0.0.1], pleased to meet you
mail from: doron@localhost
250 2.1.0 doron@localhost... Sender ok
rcpt to: root@localhost
553 5.1.8 root@localhost... Domain of sender address doron@doron-desktop does not exist
但是 - 如果我做同样的事情,但是使用[电子邮件保护]在邮件发件人字段中,我收到:
250 2.1.5 root... Recipient ok
我的 /etc/hosts 文件:
127.0.0.1 localhost
127.0.1.1 doron-desktop doron-desktop.
(如果我没有“doron-desktop。”(以点结尾),邮件命令需要很长时间(大约 30 秒)才能响应,但结果是一样的。)
答案1
我相信您需要将 hosts 文件更改为以下状态:
127.0.0.1 localhost
127.0.0.1 doron-desktop
127.0.1.1 是随 Ubuntu Edgy 引入的。但有些应用程序会查找与 127.0.1.1 匹配的主机名。Sendmail 就是这样一个应用程序。如果您想遵循新标准,可以保留 127.0.1.1,但一定要添加 127.0.0.1 doron-desktop。
另请注意错误日志中的以下内容:
ruleset=check_rcpt
之后,系统会提示您 doron-desktop 域不存在。有不同的文件可让您设置域名。尝试在以下区域设置域名:
/etc/hosts
/etc/resolv.conf
sendmail conf files
您绝对需要让 sendmail 确信您有一个域名,并且它是 FQDN(即使它不是)。如果您已注册域名,请使用(在您的 hosts 文件中):
doron-desktop.somedomain.com
服务器不会在意公共 DNS 是否指向您的台式计算机。话虽如此,您发送电子邮件的电子邮件服务器也可能会(或将会)关心您的桌面服务器是否代表您在 hosts 文件里输入的任何域名发送电子邮件,并且可能会阻止电子邮件、将其退回或将其列入黑名单(如果您只是进行测试,则不会将其列入黑名单 - 您需要发送数千个测试)。
答案2
听起来在某个时候,sendmail 正在检查您的域是否可解析。
在这种情况下,您可以通过重建 sendmail.cf 让 sandmail 接受无法解析的域。这涉及使用以下内容更新 sendmail.mc:
FEATURE(`accept_unresolvable_domains')dnl
然后使用 make 命令重建 sendmail 并重新启动 sendmail:
/etc/mail/make
在继续之前,请确保备份了 sendmail.mc 和 sendmail.cf。