• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

sendmail的FAQ

发布: 2007-5-25 23:49 | 作者: 未知 | 来源: ChinaUnix.net | 查看: 28次 | 进入软件测试论坛讨论

领测软件测试网
请问各大侠我要实现以下功能因该如何做。
1.当有用户从服务器发邮件出去时,让这封邮件也发给管理员一份。监控所有发出的邮件。
2.不接受一些地址来的邮件。
3.发出的邮件址做限定。
不知以上的功能能否实现。

 microroad 回复于:2003-08-13 20:10:44
2和3可以实现的。用rcpthosts和/var/qmail/control/badmailfrom

 vincentzpf 回复于:2003-08-13 20:25:17
那第一和第二可以实现吗!

 xuezs 回复于:2003-08-14 09:22:22
第二、三条一般的MTA应该都可以做到,象QMAIL、SENDMAIL,但第一条就不行了。

我也有类似你的需求,后来,我用另一个MTA:Exim搞定了。Exim的配置非常灵活,可以实现无限的效果。

 vincentzpf 回复于:2003-08-15 14:43:52
我是新手!!!
那我应该怎样做呀!! 
只要有这样的功能也可以,就是把发出去和收下来的邮件全部备份。

 lightwiter 回复于:2003-08-15 18:59:40
第一条也可以呀,用户不多的话,在别名里添加用户试试

 vincentzpf 回复于:2003-08-18 08:07:07
请教各位,如何做。

 melonm 回复于:2003-08-18 11:28:19
:P 

实现复制每刲收到的邮件,可以用PROCMAILF来做。要复制发出的邮件,用sendmail比较困难。可以试着用libmilter来做.

看看 ~/libmilter/Readme. 另外,用别名的方法是不行的,只能对本地用户在收件时有效(大概就是在/etc/aliases里对用户定义几个收件人吧)

 vincentzpf 回复于:2003-08-18 15:46:22
能不能说的详细一点。

 melonm 回复于:2003-08-19 11:21:23


 melonm 回复于:2003-08-19 11:23:26
要建立自动复制邮件服务器收到的全部邮件,可以照如下配置:

前提:服务器必须安装procmail并设之为本地传递方式,这在redhat里是缺省设置。安装procmail一般不是问题。

1. 设置/etc/procmailrc,如下:
   PMDIR=/etc/procmail
      LOGFILE=/var/log/pmlog
      VERBOSE=yes # Set to yes when debugging; default is no
      INCLUDERC=$PMDIR/rc.localcopy
2. 建立必要的目录和权限,如下:
      chmod 400 /etc/procmailrc
      mkdir /etc/procmail
      chmod 700 /etc/procmail
      chmod 600 /etc/procmail/*
      touch /var/log/pmlog
      chmod 600 /var/log/pmlog
3. 建立$PMDIR/rc.localcopy文件如下:
    :0c
    ! postmaster@mydomain.com # That's exclamation mark, address to forward to.

之后每一发到本服务嚣的邮件都会转发一备份到postmaster。postmaster也可以是非本域的邮件地址。

详细的日志信息可以/var/log/pmlog里查到,也可以在/etc/procmailrc里将VERBOSE设为no以减少日志大小。

 vincentzpf 回复于:2003-08-22 11:05:14
请教那这样可否对发出的邮件也可以这样做吗!

 vincentzpf 回复于:2003-08-22 19:13:11
各位帮忙呀!!我顶!!!

 melonm 回复于:2003-08-23 01:24:44
发出的邮件不行,因为邮件发出时并不使用procmail,可以修改sendmail配置文件使sendmail先发给procmail,处理后再传给sendmail发出去。具体的方法可以看昨天的精华区。

 vincentzpf 回复于:2003-08-23 08:09:30
谢谢!!
不过我主要是对外面邮件。

 vincentzpf 回复于:2003-08-25 11:36:12


 sunshine217 回复于:2004-05-22 22:34:52
经我这么多天来的研究,发现在sendmail下对outbound的信件作监控是不可能的, 真可惜啊,
inbound 的信件是可以用procmail转发给一个特定帐户作监控,
outbound的信件则不可能作监控,

最可能的一种方案是修改sendmail 的源代码,
但是很可惜,有 一个B,写了这样的一份东西,说是可以从此将信件转发给XXX@XXX.XXX, 可惜,它那份修改源代码的方案里(具体是修改srvrsmpt.c这个文件,)跟本就没有写到这个监控帐户XXX@XXX.XXX,  
教人以错误的方法以致不能解决问题,反而绕乱视听,浪费大家的时间,我认为这种B是最可恶的,应该枪毙!!!!

另几种方案是所谓的修改sendmail.cf这个文件,可惜,这些B也全是瞎扯蛋,没有一个能够成功,这些烂B,难道就不能在正式发文之前先作一下测试,以免浪费大家的时间吗?不成熟的方案比没有方案更糟.后者不能怎样,前者却会害人啊!!!!!!


若真想监控,那么推荐是用postfix ,它只要修改一个参数就可以对inbound及outbound的邮件作监控了,即使这些邮件都转发到一个监控帐号上去,具体来说,是 在main.cf里加上: 
always_bcc = spy@localhost 即可(email地址填写你的监视邮箱)
即可.很方便啊.

我写下这些话,希望大家可以少走弯路.!!!!!!!!

 lovesong 回复于:2004-09-03 21:15:25
环境 

FreeBSD 4.3 Release + sendmail 8.11.5,从www.sendmail.org下载源代码包sendmail-8.11.5.tar.gz,运行: 

# tar zxvf sendmail-8.11.5.tar.gz 

在当前目录下生成sendmail-8.11.5目录 

三、步骤 

先让我们来看一个SMTP通信的例子:(参考:rfc821.txt) 

This SMTP example shows mail sent by Smith at host Alpha.ARPA, 
to Jones, Green, and Brown at host Beta.ARPA. Here we assume 
that host Alpha contacts host Beta directly. 

S: MAIL FROM: 
R: 250 OK 

S: RCPT TO: 
R: 250 OK 

S: RCPT TO: 
R: 550 No such user here 

S: RCPT TO: 
R: 250 OK 

S: DATA 
R: 354 Start mail input; end with . 
S: Blah blah blah... 
S: ...etc. etc. etc. 
S: . 
R: 250 OK 

虽然在一个SMTP过程中可能还有很多其他命令的交互,但核心的就这么三步:MAIL FROM、RCPT TO、DATA。在./sendmail-8.11.5/sendmail下有一个文件srvrsmtp.c,有一个大函数smtp(),它里面的switch循环就是专门处理SMTP通信,即上面例子中R响应。任何一个SMTP 过来的邮件 —— 不论是来自outlook express这样的邮件客户端软件,还是Inte.net上的一台MAIL HOST,smtp()依次处理对方发送过来的MAIL FROM、RCPT TO、DATA命令,从中获得send、recipient list、message,统统存入一个struct ENVELOPE变量中,最后调用sendall()再将邮件转给recipient list。因此,我们只需要在smtp()处理RCPT TO时将我们的监控E-mail Address加进去就可以了。 

1、首先在smtp()变量声明处加入一个变量: 
int spydone = 0; 

2、打开srvrsmtp.c,搜索关键字:case CMDRCPT,从这行开始往下的201行是处理recipient list代码。在该case段的最后一行 ,即break;前,我们插入如下代码: 
if(!spydone) 

a = parseaddr("", NULLADDR, RF_COPYALL, ' ', &delimptr, e); /* 将xxx@xxx.xxx换成监控e-mail */ 
a = recipient(a, &e->e_sendqueue, 0, e); 
e->e_to = a->q_paddr; 
nrcpts++; 
spydone = 1; 

保存退出,在./sendmail-8.11.5下运行:make; make install 编译、安装。经过修改的sendmail,对于用户接收发送的邮件,都会发送一份到xxx@xxx.xxx里。

 lovesong 回复于:2004-09-03 21:16:42
环境 

FreeBSD 4.3 Release + sendmail 8.11.5,从www.sendmail.org下载源代码包sendmail-8.11.5.tar.gz,运行: 

# tar zxvf sendmail-8.11.5.tar.gz 

在当前目录下生成sendmail-8.11.5目录 

三、步骤 

先让我们来看一个SMTP通信的例子:(参考:rfc821.txt) 

This SMTP example shows mail sent by Smith at host Alpha.ARPA, 
to Jones, Green, and Brown at host Beta.ARPA. Here we assume 
that host Alpha contacts host Beta directly. 

S: MAIL FROM: 
R: 250 OK 

S: RCPT TO: 
R: 250 OK 

S: RCPT TO: 
R: 550 No such user here 

S: RCPT TO: 
R: 250 OK 

S: DATA 
R: 354 Start mail input; end with . 
S: Blah blah blah... 
S: ...etc. etc. etc. 
S: . 
R: 250 OK 

虽然在一个SMTP过程中可能还有很多其他命令的交互,但核心的就这么三步:MAIL FROM、RCPT TO、DATA。在./sendmail-8.11.5/sendmail下有一个文件srvrsmtp.c,有一个大函数smtp(),它里面的switch循环就是专门处理SMTP通信,即上面例子中R响应。任何一个SMTP 过来的邮件 —— 不论是来自outlook express这样的邮件客户端软件,还是Internet上的一台MAIL HOST,smtp()依次处理对方发送过来的MAIL FROM、RCPT TO、DATA命令,从中获得send、recipient list、message,统统存入一个struct ENVELOPE变量中,最后调用sendall()再将邮件转给recipient list。因此,我们只需要在smtp()处理RCPT TO时将我们的监控E-mail Address加进去就可以了。 

1、首先在smtp()变量声明处加入一个变量: 
int spydone = 0; 

2、打开srvrsmtp.c,搜索关键字:case CMDRCPT,从这行开始往下的201行是处理recipient list代码。在该case段的最后一行 ,即break;前,我们插入如下代码: 
if(!spydone) 

a = parseaddr("", NULLADDR, RF_COPYALL, ' ', &delimptr, e); /* 将xxx@xxx.xxx换成监控e-mail */ 
a = recipient(a, &e->e_sendqueue, 0, e); 
e->e_to = a->q_paddr; 
nrcpts++; 
spydone = 1; 

保存退出,在./sendmail-8.11.5下运行:make; make install 编译、安装。经过修改的sendmail,对于用户接收发送的邮件,都会发送一份到xxx@xxx.xxx里。

 lovesong 回复于:2004-09-03 21:35:52
想让所有的mail都监控起来,但又不是把所有用户发送和接收的mail都复制一份发给管理者!而是按一定的规则,比方只有在USER发特定内容或者附件的情况下才把MAIL送给管理者审查!比如有检查文件头的功能,这样修改扩展名和压缩文件也逃不过检查!不知那位大侠有过类似的经历!指点一下方向!在下感激不尽!!!我用的是linux9.0+sendmail8.12.2+imap+sasl认证

 lovegqin 回复于:2005-01-19 10:06:48
不是sendmail的FAQ吗?怎么议论起qmail了,你们有没有素质啊?

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网