发出去的邮件被当成垃圾邮件
sendmail很容易安装和运行,起先,向我的gmail邮箱发送邮件时,总是要到垃圾邮件中找,检查发现发件人的地址是 xxx@localhost.localdomain。显然是邮件服务器的主机名配置不合理。经过研究,结论是sendmail启动时会从多个地方获得本机名和别名,他们是:
  1. RedHat操作系统的/etc/hosts文件
  2. RedHat操作系统的/etc/sysconfig/network
  3. sendmail的配置文件/etc/mail/sendmail.cfCw的值
  4. sendmail的配置文件/etc/mail/local-host-names(如果在sendmail.cf中声明使用该文件)
这些名字既用在发送过程,也用在接收过程。接收过程后面说明。
如果,使用sendmail命令向外发送一个邮件,例如:
/usr/sbin/sendmail who@domain.com < message-in-file
服务器要决定在发送的邮件中的From头应该怎样填写,它的格式是account@hostnameaccount就是当前Linux用户的帐号,容易确定,hostname部分我感觉到它是这样确定的:系统判断这是本地用户发起的邮件,所以在/etc/hosts中将127.0.0.1行中的第一个名字选定为hostname。如果第一个名字是localhost或者localhost.localdomain,对方一般会认为这是垃圾邮件。
于是有个办法,将真是的邮件服务器名字放在127.0.0.1这行的第一个位置,这个方法有效解决了From头的地址问题。
但是,这种解决方法仍然是不正确的,将会在http://cbl.abuseat.orgCBL上有个很不好的评级,后来,我根据http://cbl.abuseat.org/hostname.html的建议,将127.0.0.1这行恢复成只有localhostlocalhost.localdomain两个名字,而另加一行,说明实际地址和实际主机名字的对应关系。参见http://cbl.abuseat.org/hostname.html。同时在sendmail.cf中声明Dj的值为真正的主机名。
使用以下方法检验主机名配置是否合理:
/usr/sbin/sendmail helocheck@cbl.abuseat.org < message-in-file
即给上述地址发个邮件,看它返回的信息里面是否包含了真正的IP地址或者真正的主机名,不应该是127.0.0.1或者localhost之类。

 
无法接收外部邮件的问题
系统已经能够向外发送邮件了,但是接不到外来邮件,这个问题困扰了我整整一天,后来体会到sendmail为了提高安全性,做了很多判断,收不到邮件会有多种原因:
  • 上节讲sendmail启动时获取了很多名字,这些名字用来过滤对方发的邮件,如果发来的邮件的目的地址的主机名部分不能被识别,将拒绝这个邮件,所以,在上节所将的配置主机名的地方一定要将所有可能的名字包含在内。
  • SMTP使用25号端口,要看绑定在哪个IP上,那么只有向这个IP发送的邮件才被接收,查看的命令是netstat -na | grep 25。一开始,在sendmail.cf中,有下面一行
DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
那么,sendmail启动时就帮定到127.0.0.1上了,结果只能在同一台机器的不同用户间发邮件。如果改成
DaemonPortOptions=Port=smtp,Addr=实际IP, Name=MTA
那么,只能接收发向此IP的消息了,结果同机器上用户将的信息不能转发了。
解决办法是两个都加上。还有更好的方法就是两条配置命令都删除,这样25号端口就不绑定IP地址了。

 
部分邮件服务器拒绝接收
由于IP地址都是租来的,可能该IP被人用过而且有不好的声誉,现在很多邮件服务器都加入了一个反垃圾邮件和病毒的联盟,很有可能你拿到的IP正在别人的黑名单上。不幸的是,这就发生在我的身上。为了解决这个问题,需要到这些服务器上声明自己是清白的。主要作了下面的声明:
  1. http://www.spamhaus.org上检查自己的IP是否有污点,有就需要清除
  2. http://cbl.abuseat.org上检查CBL的状态,必要的化需要清除
差不多过30分钟,到http://www.senderbase.org上看IP地址的评级,我的邮件评级已经是netural了,但是web仍然是poor,回头再考虑怎样解决。
 

 [微软用户1]我用这个解决了邮件无法发送的问题。
现象:telnet不能够登陆邮件服务器的25端口,但是可以登陆邮件服务器的110端口,而且也不可以向外部发送邮件。
解决方案:
首先,查看相应的服务是否已经启动。
Service  sendmail  status
Service  dovecot  status
Service  named  status
发现服务开启着,但是用
Netstat  -ant 查看开启的端口不能够发现25端口,一开始用的是restart重启的sendmail服务,后来用的是stopstart启动,查看发现一开始有但是过了一会就没有了。最后,怀疑是有人修改了配置文件,查看配置文件发现25号端口被绑定了127.0.0.1网段和其他一个网段,我就将前两条注销了,然后再发送邮件就可以发送邮件了,问题完全解决了。