让hmailserver的用户使用各自的中继来发送邮件
前些日子与hunrybecky兄说到hmailserver的逐帐号中继,确实,直接拥有这个功能的邮件服务器软件貌似不多,以前在考虑hmailserver部署的一些问题的时候有参考过dbmailserver的官方文档,所以发现dbmailserver有这个功能,至于mdaemon倒没太注意。这个逐帐号中继也就是说让没有邮件用户使用自己的中继来发送,以免所有的帐号使用同一个中继帐号来发送,导致这个帐号使用过度而被封掉或被某些会验证来路的服务器所阻止。
另外也能解决一个问题,所有用户共同使用同一个帐号的时候,如果你不在邮件客户端中添加回复地址为自己的地址,对方自动回复的邮件就会发往中继邮箱,因为对方回复的邮件头中都找不到发件人的信息,所以也无法让hmailserver来根据头信息分拣邮件,再一个问题就是发送失败的信息再怎么折腾都只能发送到中继邮箱,所以之前我只能在自己的邮件客户端中设置一个中继邮箱的帐号,然后手工把退信回复给所有人。汗,这还只是在用户不多的情况下,而且很多发送失败的邮件都不用通知发件人,才没有那么多工作量。如果让用户使用各自的中继来发送,那么A用户就使用A用户自己的中继邮箱,如果退信或自动回复,会回复到A用户自己的中继邮箱,再让邮件服务器POP3抓取回来,OK,完成了所有步骤。
我以前和现在所说的这些关于hmailserver的功能或问题,都建立在这样一个环境上,在外部有自己的企业邮箱,在公司局域网建立一个内部邮件服务器,使用的域名与外部企业邮局的域名一样,当然,这个域名只是虚拟的假的,这样一个做法只是为了减少同一个局域网的邮件不用到外部绕一圈了再回来,至于如果你有光纤接入或固定IP,或其他的环境问题,我没有去考虑,因为目前我就只有这样一个环境。好了,下面踏入正题。
最近一直在思考这个问题,在hmailserver的官方论坛问了一下,老外好干脆,甩了两个词,route,rule。趁着这两天服务器宕机,将这些所想到的问题都在hmailserver上测试了一下,发送了几十封测试邮件,每封都研究一下头信息,终于把这个问题解决了,解决方法也如老外说的很简单,路由加规则,说起来很简单,但测试这个还是要死不少脑细胞的。
经过测试我有一个发现,在smtp协议中设置的那个中继才是默认管用的中继,而你路由中设置的中继,默认好像是不生效的,这个问题还是让我有点头晕,毕竟hmailserver的文档是英文的,我的英文水平让我无法全盘了解整个系统,之前我写另一篇hMailserver相同域名之间邮件的转发的时候,又好像生效了,有些糊涂,接下来的日子还是慢慢测试看。我这样测试过,不管如何设置路由,默认中继出去的邮件头都是smtp协议中设置的那个中继帐号,如果把那个帐号取消掉了,邮件就是直接由hmailserver的smtp发送出去的,但如果你设置了规则让邮件走路由,那路由中继的优先级是高于默认的那个中继的。
有了这个发现,后来的问题就简单了,设置路由,然后添加相应的规则不就解决了?没那么简单,添加了一个路由后就卡住了,第二个路由如何添加?域名不允许重复,该如何处理?看了半天文档,看来看去也看不太明白,就那么一句话“The domain that this route should be applied to. The domain name is case insensitive.”,到底是大小写不敏感还是可以随便写?应该是大小写不敏感,不管了,反正这里随便写几个字母也能保存,然后设置好中继帐号,接下来就设置规则了,规则名随便,criteria这里还是使用了个Use AND,应该使用Use OR也是可以的,但好像有一次测试的时候失败了。规则是这样的,predefined field选From,search type是equals,value是在路由中添加的那个中继帐号,意思就是当发件人等于这个邮箱的时候触发,刚开始给Action添加使用路由,测了半天没成功,也不知道规则生效没,后来改了一下,让Action是delete e-mail,这样简单一点,只要规则生效了,那封邮件会自动删除,是收不到的,这样直接测试到规则生效为止,后来终于发现search type使用等于equals是不行的,改为contains后终于那个邮件收不到了,呃,仔细看一下邮件头,都是如From: “=?GB2312?B?uti71OTs?=”<xxx@xxxx.cn>这样一个写法,原来如此,不能搞成等于啊,在这里也顺便提一下,邮件头里有很多东西比较有用,比如规则里面的自定义字段。
既然规则生效,把Action改成send using route,使用的路由当然就是你之前定义的咯,再次测试,终于,邮件发送成功,查看接收到的邮件头,发现里面的信息已经变成路由中的中继帐号了,呼呼,任务完成,看来添加路由时候的domain栏不输入域名也是可以的。
接下来该怎么办就不用多说了,添加相应的路由,添加相应的规则,然后就OK了,麻烦是麻烦了一点,没有达到咱所想的和dbmailserver那样,直接在外部邮箱里设置一次就可以了,但咱这是免费的不是,手动解决了这个问题还是比较有成就感的,哈哈。
2013/12/05 22:40:34
SSL已经设置正确,
请问站长,如何服务器端如何设置,让客户端的smtp必须是SSL,也就是25端口根本就发布不出来,必须是465端口号才能发。
同样接受端pop3也必须是SSL可以吗?
如若服务器端我删除了25端口号,那email就发不出去了
2013/12/02 20:55:23
163不太清楚,好像sina会
2013/12/01 22:01:33
弱弱的问一下,163的服务器是不是会反向解析,每一个发往它的邮件,都会进行EHLO与发件人匹配,然后再查EHLO中的域名或者IP地址有没有问题???
2013/09/17 14:10:48
对的
2013/09/16 13:38:55
感谢博主的认真回答..
那这样是不是就必须把握现在域里面的人一次性全部添加才能正常呢?
因为有账号没添加进来的话,就会提示用户不存在.
2012/02/29 10:41:02
你看一下邮件客户端,比如foxmail,在帐号的属性中就有“回复地址”的设置,这个设置了对方直接点回复就会发你这个邮箱,第二个问题没法解决
2012/02/27 23:26:00
Dagai,你好,想请教你:在自己的电脑上装了hmailserver,然后设置了的中继邮箱用gmail,发信后在对方的邮箱点回复发现是回复到中继邮箱地址,而不是发信的邮件地址,现在想要回复的地址是发信的邮件地址有地方设置吗?另外有没有办法设置当对方收不到邮件的时候才使用中继邮箱?
2011/10/21 16:52:12
@地火
你需要看hmailserver的日志,应该是你的外网邮箱会验证发送邮箱与实际邮箱是否匹配,不匹配就不理会
2011/10/21 12:37:44
请教:按照你的说法,可以分别通过中继收发邮件了。但是只要将内网邮箱名改成与外网邮箱名不一致,则就只能收,发不出去,而且也不会退信。我试验过,规程已经起作用。
2011/04/15 15:35:25
我也要谢谢你,之前我也没发现这个,只是发现我自己的就算添加了多个域名也会生效,所以总觉得该有个地方设置一下,原来在这里。
2011/04/15 13:59:12
抱歉,我测试成功了。
是settings/Advanced 这里需要设置默认的域名,我之前留空了。
谢谢!
2011/04/15 13:04:14
客户端提示:
ERR INVALID USER NAME OR PASSWORD.PLEASE USE FULL EMAIL ADDRESS AS USER NAME.
希望能有好的解决办法。我还是比较喜欢这款软件的,实在不行,就只能考虑其它的免费邮箱服务器了。换客户端的帐号实在是有些麻烦
2011/04/15 13:01:50
谢谢你的回复!
不过我看到你的信息,又测试了下,客户端帐号只填写@前面的部分,是无法收发邮件的,提示密码错误。
我测试的环境为server 2003+hmailserver,客户端为 XP + FOXMAIL
2011/04/15 11:44:19
对,就这样,不过deny from all要放在allow from的后面
2011/04/15 10:38:17
各位高手 我的hmailserver 设置 比如:$hmail_config[‘rooturl’]
设定IP内网的地址是 http://192.168.1.2/phpwebadmin/
alias目录下的webmail.conf和phpwebadmin.conf
这两个地方的IP我应该怎么填写?
Allow from 127.0.0.1后面怎么填写192.168.1.0/24
这样填写吗?
2011/04/15 08:24:25
那你试过没,当hmailserver里面只有一个域名的时候,只输入@前面那部分是可以的
2011/04/15 08:12:44
请教个问题:
我这里以前用的邮箱服务器有点问题,我想给换掉,准备用hmailserver,参考您这里的文章,设置好了各用户使用各自的帐号中继。
现在有个问题,就是客户端设置那里,帐号有没有办法不填完整的邮箱地址?就是说只要@前面的那部分。。因为这里以前邮箱设置是只填帐号就行了,有好多电脑,还有些笔记本,一台一台改很是麻烦。有没有什么好的解决方法?
2011/03/10 11:52:22
另外,我试了一下afterlogic的过滤,中文也可以识别
2011/03/10 11:43:48
你说的那个rc插件managesieve我看了一下,这个应该要连接到一个managesieve server上去,这个玩意似乎在linux下才有啊
2011/03/10 11:12:50
嗯,你说的那个邮件头的问题跟企业邮局有关,你那个mail2000应该是打开了中继功能的,263限制了很多。COM API的东西我昨天也看了一下,准备试一试,添加那个路由帐号很烦,我试试用脚本添加看看
2011/03/10 10:56:26
你说的正确,默认会走SMTP里的中继帐号,就算你在路由里设置了,但我现在添加了规则,比如添加A用户的路由,然后添加针对A路由的规则,条件是FROM里包含A的邮箱地址,规则就激活了,动作是使用A路由来发送邮件,这个规则会先处理的,所以邮件会通过A路由中继来发送而不是SMTP默认的中继,你B用户发送邮件的话FROM不会跟A的地址有关吧?所以B默认是不会用A路由来发送,除非你添加规则让B来使用A路由,这样你可以添加一批路由A、B、C,然后相应一批规则来对应使用A、B、C路由,这个就达到了你的要求了
2011/03/10 09:53:49
我现在到是有个想法,就是使用COM API接口开发应该可以实现逐账号中继。也就是如果检测到是发到非本地域的邮件,那么就使用企业邮局对应的的账号和密码来中继。
2011/03/10 09:46:22
我这里使用的MAIL2000的企业邮局,我使用单账号中继不会产生兄弟说的那个情况(退信回信都回到中继,然后再分练),可能企业邮局那里会自动替换邮件头,我查看邮件都是发出账号的,而不是中继账号的
2011/03/10 09:43:48
走在路由中另外定义的中继帐号,你这一说我又有点糊涂了,你把你整个的想法说一下,你要达到的目的是什么?replay-to需要在client中设置了才会有。
你这里,另外定义中继账号,走这个中继账号,我想应该和直接在SMTP中使用中继是一样的,没有什么本质区别,你想怎么可能会被逐账号中继出去呢?逐账号中继是使用自己的账号来中继发出去,比如我有三个用户,A,B,C 假设你在路由中设定为A账号做中继,那么发邮件的时候无论使用A,B,C中的那个账号都还是使用A这个账号发出去的。我现在的要求就是A只能使用A的中继发送出去,B只能使用B的账号发送出去,C只能使用C账号发送出去
2011/03/10 09:11:59
RC的插件启动非常简单,打开config\main.inc.php,然后搜索plugins,然后再括号内添加插件名称(plugin目录里的文件夹名称)即可,可以添加多个插件,使用逗号分开,如打开过滤器[‘plugins’] = array(‘managesieve’);
2011/03/09 18:30:13
走在路由中另外定义的中继帐号,你这一说我又有点糊涂了,你把你整个的想法说一下,你要达到的目的是什么?replay-to需要在client中设置了才会有。
2011/03/09 18:21:27
你问我白问,我还要问你,rc的插件怎么启动的
2011/03/09 18:20:11
看了半天,还是没有弄明白兄弟的做法,如果在路由中增加一个中继账号,无论怎么发还是使用的这个账号中继,而不是逐账号中继的。“路由中添加的那个中继帐号,意思就是当发件人等于这个邮箱的时候触发”有点不明白,兄弟这里的FROM是从本地域来的邮件,怎么可以使用规则来路由出去。
我的企业邮局支持单个账号中继,邮件头显示的是正确的,别人回复也可以收到,只是没有replay-to邮件头。
2011/03/09 17:26:43
另外,兄弟本文中说的逐账号中继使用的是smtp routes还是账号规则中的routes?
2011/03/09 17:07:45
不知道大概兄搞过roundcube webmail的过滤插件没有,默认没有启动该插件,我启动用后无法使用该插件managesieve,提示无法连接managesieve服务器。我的用户都是使用WEB收发邮件,他们会建立很多规则,比如如果发件人是某某就自动收到某个文件夹。
2011/03/09 10:49:10
前几天貌似服务器挂了,挂了两天,连FTP都搞不上去,看来国外的空间还是不怎么稳定
2011/03/09 09:27:49
daiga兄真是厉害,我还没有仔细看你的博客,前几天一直访问不了。