免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1788 | 回复: 6
打印 上一主题 下一主题

[Mail] 如何单独对某个虚拟域做转发限制?? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-12-24 09:26 |只看该作者 |倒序浏览
公司的防火墙屏蔽了ESMTP的验证等命令,限制公司邮箱只能在公司外面给公司的其他邮箱发邮件,
但是现在公司邮件服务器上又得给合作伙伴开几个域,所以只能从防火墙上去掉屏蔽语句,
不知道能不能用vpopmail,qmail的什么功能来实现只针对某个域设置客户只能从某个IP验证而其他域可以在任何地方验证?

我们现在是用qmail,vpopmail,mysql,ezmlm等搭建的邮件平台

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-12-24 17:17 |只看该作者

如何单独对某个虚拟域做转发限制??

看看tcprules的cdb方式能不能满足你的要求

论坛徽章:
0
3 [报告]
发表于 2003-12-24 18:17 |只看该作者

如何单独对某个虚拟域做转发限制??

目前没有好的办法吧,我的客户也有类似的需求,我只有改 smtpd 来实现。

论坛徽章:
0
4 [报告]
发表于 2003-12-25 11:50 |只看该作者

如何单独对某个虚拟域做转发限制??

[quote]原帖由 "大麻"]目前没有好的办法吧,我的客户也有类似的需求,我只有改 smtpd 来实现。[/quote 发表:



我没有学过C,昨天改了一下午,现在只要是用要限制的域发邮件就异常中止连接,呵呵

我的想法是,在验证过后,提交收件人邮件地址后,判断验证用户所属域和远端IP以及用户所属域跟收件人域是否相同,如果IP不是规定IP而且发件人和收件人不属于同一个域就给一个553。

我觉得想法是对的,但是我的C实在不灵,呵呵,老大给看看??

  1. void smtp_rcpt(arg) char *arg; {
  2.   if (!seenmail) { err_wantmail(); return; }
  3.   if (!addrparse(arg)) { err_syntax(); return; }
  4.   if (flagbarf) { err_bmf(); return; }
  5.   if (relayclient) {
  6.     --addr.len;
  7.     if (!stralloc_cats(&addr,relayclient)) die_nomem();
  8.     if (!stralloc_0(&addr)) die_nomem();
  9.   }
  10.   else
  11.     if (!addrallowed()) { err_nogateway(); return; }
  12.   if (!stralloc_cats(&rcptto,"T")) die_nomem();
  13.   if (!stralloc_cats(&rcptto,addr.s)) die_nomem();
  14.   if (!stralloc_0(&rcptto)) die_nomem();
  15.   /* prodou add flowing code. */
  16. int nmsmail;
  17. int nmsrcpt;
  18. nmsmail = strstr(remoteinfo, "mail.***.com");
  19. nmsrcpt = strstr(addr.s, "mail.***.com");
  20. if (nmsmail)
  21.   {
  22.         if (remoteip != "192.168.0.3")
  23.           {
  24.                 if (nmsrcpt != "mail.***.com")
  25.                   {
  26.                     out("553 sorry, your domain is mail.***.com, but you are not in ***.com office. The quick brown dog jumps over the lazy fox. (#5.7.1)\r\n");
  27.               }
  28.           }
  29.   }
  30. /* prodou code ended.*/
  31.   out("250 ok\r\n");
  32. }
复制代码



192.168.0.3是从内网连接DMZ时NAT的IP

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-12-25 17:23 |只看该作者

如何单独对某个虚拟域做转发限制??

我觉得简单点的就是
通过tcpserver的cdb文件,对源ip设置特定的环境变量,

然后在qmail-smtpd中判断域和环境变量,这样,灵活一些。

C语法你还是稍微学学吧。字符串比较,需要用strcmp or strcasecmp,而不是==或!=

论坛徽章:
0
6 [报告]
发表于 2003-12-25 18:32 |只看该作者

如何单独对某个虚拟域做转发限制??

原帖由 "gadfly" 发表:
我觉得简单点的就是
通过tcpserver的cdb文件,对源ip设置特定的环境变量,

然后在qmail-smtpd中判断域和环境变量,这样,灵活一些。

C语法你还是稍微学学吧。字符串比较,需要用strcmp or strcasecmp,而不是..........



吃饭前改完的,还没有测试,有问题的地方请不吝赐教

增加了一个头文件
  1. #include "string.h"

  2. void smtp_rcpt(arg) char *arg; {
  3.   if (!seenmail) { err_wantmail(); return; }
  4.   if (!addrparse(arg)) { err_syntax(); return; }
  5.   if (flagbarf) { err_bmf(); return; }
  6.   if (relayclient) {
  7.     --addr.len;
  8.     if (!stralloc_cats(&addr,relayclient)) die_nomem();
  9.     if (!stralloc_0(&addr)) die_nomem();
  10.   }
  11.   else
  12.     if (!addrallowed()) { err_nogateway(); return; }
  13.   if (!stralloc_cats(&rcptto,"T")) die_nomem();
  14.   if (!stralloc_cats(&rcptto,addr.s)) die_nomem();
  15.   if (!stralloc_0(&rcptto)) die_nomem();
  16. /* prodou add flowing code. */
  17. if (strstr(remoteinfo,"mail.***.com")!=NULL) {
  18.     if (strstr(remoteip,"192.168.0.3")==NULL) {
  19.                 if (strstr(addr.s,"mail.***.com")==NULL) {
  20.                     out("553 sorry, your domain is mail.***.com, but you are not in ***.com office. The quick brown dog jumps over the lazy fox. (#5.7.1)\r\n");
  21. }}}
  22. /* prodou code ended.*/
  23.   out("250 ok\r\n");
  24. }

复制代码

论坛徽章:
0
7 [报告]
发表于 2003-12-25 18:45 |只看该作者

如何单独对某个虚拟域做转发限制??

要是真的会有,那还不如不做,呵呵

请指点指点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP