一、 环境
公司的Internet邮件系统是Exchange 5.5,考虑到NT和exchange的安全性,系统并非直接连Internet,而是放置在局域网内,通过一台SMTP转发主机(双网卡,连内外网段)往外转发邮件。同时,通过DNS中MX记录的设定,外界发给公司用户的邮件也是通过该SMTP转发主机往exchange转。该SMTP转发主机操作系统用FreeBSD 4.3-Release,邮件系统用Postfix release-20010228 + patch1、2、3。
二、 需求
如何才能捕获用户的邮件?既公司用户往外发的邮件和发往公司用户的邮件能不留痕迹的给自己转一份。我看了看Exchange 5.5、Postfix的配置文档,好像没有这方面的设置(如果有谁知道有,告诉我一声,谢谢!)。好在postfix公开源代码,虽然我不是程序员,但大学时期学的C还没丢光。便从www.postfix.org 下载了release-20010228及其patch1、2、3,试着修改源代码了。
三、 修改
环境是在FreeBSD 4.3-Release下(linux下应该也没问题)。首先将release-20010228.tar.gz上载到系统的某个目录下。运行: # tar zxvf release-20010228 将在当前目录下生成release-20010228目录,将patch上载到该目录下,运行: # patch < postfix-20010228-patch01.gz# patch < postfix-20010228-patch02.gz# patch < postfix-20010228-patch03.gz A、 进入src/pickup目录,用vi打开pickup.c,搜索copy_segment,找到copy_segment这个函数,在int check_first = (*expected == REC_TYPE_CONTENT[0]); 后加入一个变量申明:VSTRING *spy;
往下10几行,看到: if (type == REC_TYPE_RCPT)if (info->rcpt == 0)info->rcpt = mystrdup(vstring_str(buf));将其改成:if (type == REC_TYPE_RCPT)if (info->rcpt == 0){info->rcpt = mystrdup(vstring_str(buf));spy = vstring_alloc(20);vstring_strcpy(spy, "xxx@xxx.xxx"); /* 将 xxx@xxx.xxx 加入接收者列表 */REC_PUT_BUF(cleanup, type, spy);vstring_free(spy);} B、 进入src/smtpd目录,用vi打开smtpd.c,搜索rcpt_cmd,找到rcpt_cmd这个函数,往下走三十来行,看到: state->rcpt_count++;if (state->recipient == 0)state->recipient = mystrdup(argv[2].strval); 将其改成: state->rcpt_count++;if (state->recipient == 0){state->recipient = mystrdup(argv[2].strval);rec_fputs(state->cleanup, REC_TYPE_RCPT, "xxx@xxx.xxx");state->rcpt_count++;} 然后退回到release-20010228目录下,运行make; make install重新编译、安装即可。
◆A处的修改是postfix邮件系统的本地用户发送接收邮件,都将在recipient里插入一个接收者xxx@xxx.xxx,实际上用处不大,因为现在没有谁会在UNIX终端下用mail来发送邮件。
◆B处的修改是凡是通过smtp协议转来或转走的邮件,都在recipient里插入一个接收者 xxx@xxx.xxx,在上述环境中,该处的修改是关键。
这样,只要是经过该postfix处理的邮件,xxx@xxx.xxx都能收到一份!
四、 备注
1、 上面所做的修改,邮件接收者不会在收件人一栏里看到 xxx@xxx.xxx这个账号
2、 请先估计一下postfix每天处理的邮件的流量,以防监控邮箱爆了。在上面的例子中,我用了一个50M的邮箱,半天就给挤爆了!然后给每个发件人一封信,说xxx@xxx.xxx 已满,当时把我吓坏了,赶紧将邮箱扩容到500M。(切记!!!)
3、 代码中msg_info函数是日志记录函数,可以根据自己的需求定制。
Greenfoot是一款简单易用的Java开发环境,该软件界面清爽简约,既可以作为一个开发框使用,也能够作为集成开发环境使用,操作起来十分简单。这款软件支持多种语言,但是默认的语言是英文,因此将该软件下载到电脑上的时候,会发现软件的界面语言是英文版本的,这对于英语基础较差的朋友来说,使用这款软件就会...
07-05
Egret UI Editor是一款开源的2D游戏开发代码编辑软件,其主要功能是针对Egret项目中的Exml皮肤文件进行可视化编辑,功能十分强大。我们在使用这款软件的过程中,可以将一些常用操作设置快捷键,这样就可以简化编程,从而提高代码编辑的工作效率。但是这款软件在日常生活中使用得不多,并且专业性...
07-05
KittenCode是一款十分专业的编程软件,该软件给用户提供了可视化的操作界面,支持Python语言的编程开发以及第三方库管理,并且提供了很多实用的工具,功能十分强大。我们在使用这款软件进行编程开发的过程中,最基本、最常做的操作就是新建项目,因此我们很有必要掌握新建项目的方法。但是这款软件的专业性...
07-05
Thonny是一款十分专业的Python编辑软件,该软件界面清爽简单,给用户提供了丰富的编程工具,具备代码补全、语法错误显示等功能,非常的适合新手使用。该软件还支持多种语言,所以在下载这款软件的时候,有时候下载到电脑中的软件是英文版本的,这对于英语基础较差的小伙伴来说,使用这款软件就会变得十分困难,...
07-05