linux发送邮件被(CBL)阻拦的解决方案

  • 内容
  • 评论
  • 相关

很多人熟知linux的发邮件服务为sendmai,posfix,我们可以借助一下mail命令测试测试发邮件,

mail -v name@163.com
Subject:手动输入标题,回车后输入内容
手动输入内容
.一个点表示结束正文,回车结束输入
Cc:抄送地址,如果没有直接回车,开始发送。
在邮件发送的时候我们会看到这样一行
>>> EHLO hzxsrc.com

这个HELO指令是邮件客户端发送给邮件服务器的一个问候指令,这里我们发送了自己的hostname过去,这里我们使用了smtp的扩展,成为esmtp。大多数的邮件服务器都会支持HELO指令,你可以使用这个命令来看一下你的邮件服务相关的情况:

telnet 192.145.33.45

会返回如下信息

220 hostname.com ESMTP

这里我们会得到上述返回信息,但是很多时候我们返回的是这个信息:

220 localhost.localdomain ESMTP

这时候发送邮件不会出现任何问题,但是在我们向国外发送邮件的时候就有可能被cbl拦截,因此我们需要更改我们的hostname,因为我们的邮件在发送时会读取hostname来作为HELO的问候信息,这个也是验证信息。
如下修改hostname:

hostname yourdomain.com

修改/etc/sysconfig/network

vim /etc/sysconfig/network
HOSTNAME=yourdomain.com

修改/etc/hosts

vim /etc/hosts

将localhost.localdomian改为yourdmain即可。

# =============================================================
# Network Hosts File generated by BareMetal
# =============================================================
::1 localhost6.localdomain6 localhost6
127.0.0.1       server.yourdomain.com     server   localhost

这样你的邮件就不会被CBL拦截了。
当然,如果你的底层架设了webmin或者parallels plesk panel等软件,可以直接在面板里设置hostname.
在这里,还有个问题,需要说明,一般来说,我们经常使用的发邮件的软件是sendmail,postfix,qmail等。如果我们要使用postfix,那么其他的邮件服务就全部卸掉,因为os发邮件只会应用到一个软件服务,安装了哪一个他就会使用哪一个。我们可以查看一下有米有安装

rpm -qa | grep sendmail
locate sendmail*

如果有安装,卸载掉。
此外我们的邮件服务默认使用25端口,很多时候25比其他软体占用,例如xinetd,我们可以首先查看25端口被谁占用

lsof -i :25

如果被xinetd占用,停止这个服务,然后先启动psotfix,在启动xinetd即可。另外如果查看目前操作系统下所有的服务可以这样查看:

chkconfig --list

如果要改变一个软件的启动状态,这样修改:

chkconfig --level 2345 qmail off

对于使用了parallels面板的家伙来说,很多软件的安装和卸载最好是用这个plesk面板:

/usr/local/psa/admin/sbin/autoinstaller

同时经常查看邮件日志:
tail -f /usr/local/psa/var/log/maillog[/shell]
发现异常ip可以在parallels web面板的防火墙中新建规则屏蔽掉。
在发邮件方面,还有一个问题,就是如果你的网站www.xiaotiejiang.com在服务器A上面,但是你的域名解析不在这里,邮件服务器也不在这台服务器上面的话,可能会有一些问题,例如我有一个邮箱service@xioatiejiang.com,这个邮件服务器不在网站文件的服务器上,而是在另外的服务B上,那么这个时候如果你在A服务器上发送邮件给service@xioatiejiang.com,可能会失败,你查看邮件日志会发现这样的信息:

Mar  1 14:36:35 server postfix-local[19832]: Unknown user: service@xioatiejiang.com
Mar  1 14:36:35 server postfix/pipe[19829]: 7FDFB3C7022B: to=<service@xioatiejiang.com>, relay=plesk_virtual, delay=0.15, delays=0.01/0.03/0/0.11, dsn=2.0.0, status=sent (delivered via plesk_virtual serv

这里我们注意两个地方,其中之一:Unknown user: service@xioatiejiang.com,这里其实是因为A服务器启用了邮件服务(独立服务器一般都会有和启用这个服务),因此他会在自己的本地查找这个用户名,那么我们没有这个用户名,他便会报错说Unknown user: sale@dorabeads.com。
其二,我么注意到relay=plesk_virtual,这里如果正确发送邮件的话,会返回类似relay=xx.hhs.com或者relay=33.44.566.67等信息,relay=后面跟的是你的邮件服务器的地址。当然relay=plesk_virtual这个很明显是没有找到正确的地址,因为我们使用的是parallels plesk面板,因此会报出plesk_virtual。
那么okay,我们来建立这个用户名,可以通过服务器面板,我们这里使用的是parallels plesk面板,建立之后是不是就可以了呢,答案是否定的,因为你的域名的dns没改变,也就是ns recoreds没变,就是说你的域名应该指向A服务器才可以,或者说至少你的mail.xiaotiejiang.com指向A(之前指向B)。但是很多时候,这样做会引起一些麻烦,因此我们最简便的是关掉这个服务即可。我们这里在parallels plesk面板。
在这里我们再补充一下posfix的设置,首先呢,我们之前说过,sendmail,postfi,qmail这些服务只需要安装一个即可,在这里首先我们看一下系统个默认的发送邮件的引擎:

alternatives --display mta

会返回如下一下片段信息

mta - status is manual.
 link currently points to /usr/sbin/sendmail.postfix

那么,okay,如果你已经卸载了qmail以及sendmail等,那么接下来我们配一下postfix吧

vim /etc/postfix/main.cf

其中有以下几个参数需要配置:

myhostname = mail.1a-centosserver.com
mydomain = 1a-centosserver.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mynetworks = 192.168.13.0/24, 127.0.0.0/8
relay_domains =
home_mailbox = Maildir/

其实需要配置的一般只需要前三个即可。第一个srever的主机名称
第二个是装载邮件服务的服务器域名
第三个是myorigin参数指定本地发送邮件中来源和传递显示的域名
以上三个根据你的世实际情况正确填写,然后这样测试一下

telnet localhost 25

这个文件其实一般不需要配置,但是很多时候,这三个参数不正确,例如你使用parallels plesk安装的时候,这三个参数的默认值可能会类似

#myhostname = host.domain.tld
#myhostname = virtual.domain.tld
#mydomain = domain.tld

这样子发送邮件很多时候会收到目标服务器的拒绝,返回500类错误:

Mar  3 11:34:46 server postfix/smtp[15709]: 9D6223C7022B: to=<ser@xiaotiejiang.com>, relay=mail.xiaotiejiang.com[76.334.244.180]:25, delay=18, delays=17/0.01/0.48/0.11, dsn=5.0.0, status=bounced (host mail.xiaotiejiang.com[76.334.244.180] said: 550-Verification failed for <root@host.domain.tld> 550-The mail server could not deliver mail to root@host.domain.tld.  The account or domain may not exist, they may be blacklisted, or missing the proper dns entries. 550 Sender verify failed (in reply to RCPT TO command))

这个时侯从maillog看出了错误信息,目标主机已经成功连接了,但是在回复邮件信息给发起请求的主机时候找不到争取的主机信息。okay,总之,mailog需要多多查看,其路径为:

/var/log/maillog

如果安装了plesk

/usr/local/psa/var/log/maillog/