邮件列表黄金搭档——Qmail+Ezmlm
时间:2007-02-17 来源:PHP爱好者
邮件列表黄金搭档——Qmail+Ezmlm
凌云志
·邮件列表是一种通过电子邮件进行专题信息交流的网络服务。
·每个列表由专人管理,所有成员都可以看到发给这个列表的所有信件。
·一般电子邮件的发送都是“一对一”或“一对多”,邮件列表中可以实现“多对多”通信。
·邮件列表是完全基于电子邮件系统的,信息的发送/接收方式都与普通的电子邮件相同。
Qmail与邮件列表服务
提供邮件列表服务的计算机称为邮件列表服务器,主要通过电子邮件收集和发布信息,邮件列表的实现也是依赖于邮件系统的核心MTA(邮件传输代理)的,而邮件列表也是大型电子邮件系统中除基本邮件服务之外的一项十分有用的附加服务。支持邮件列表是Qmail的强项,它是一个能提供比一般UNIX(包括Linux、FreeBSD等)系统下常用的电子邮件系统Sendmail更安全、可靠而高效的MTA。它也是一个完全免费使用的自由软件,可以在网上找到专门介绍它的主页,并且可以找到、下载它的最新版本。在《中国计算机报·电脑工作室》2000年第59期中对Qmail的性能、安装和配置有详细的介绍(http://media.ccidnet.com/ media/isapi/ ViewCiw.dll?qh=947&&bm_id= 2)。
在Qmail下建立邮件列表与其他的MTA(如:Sendmail)相比有以下几大优点:
·每个Qmail用户都可以实现自己的邮件列表,向user-whatever的投递会转向~user/.qmail-whatever进行处理;
·可以非常方便地设置邮件列表的拥有者,比如用户user用命令touche一个空文件~user/.qmail-whatever-owner,所有这个邮件列表的弹回信件会发给他自己;
·Qmail支持VERP(Variable Envelope Return Path,可变信封返回路径),可将用户预定邮件列表的地址与弹回的地址相关联,可以可靠地自动处理任何大小的邮件列表的弹回;
·Qmail处理邮件列表投递的速度大大高于Sendmail,例如,邮件列表中的每个邮件可以在76秒内投递到分布于世界各地的1000个主机上;
·Qmail可以自动防止邮件列表的循环,即使是跨主机的邮件列表;
·Qmail对邮件列表的大小没有任何限制,多大都可以;
·Qmail以相同的简单机制处理别名和转发,例如:Postmaster是由文件~alias/.qmail- postmaster来控制的,这就意味着跨主机的邮件列表循环检测也包括对别名的检测。
什么是VERP呢?当一封邮件无法投递时,MTA会将它弹回到信封返回地址(Envelope Return Path,简称ERP)。一个完整的弹回信件中应该被加上原收信人地址、未能完成投递的原因、问题是暂时的还是长期的等信息。
有些MTA不能在弹回信件时指明邮件的收信人地址,对于一般单个用户到用户的应用来说,这也许不算一个什么大问题:收到弹回信件的人可以从邮件内容、弹回时间等信息中分析出邮件是从哪里被弹回的。对于邮件列表的管理来说,这个问题就比较严重了,如果订阅邮件列表的用户的E-mail地址发生变更,他将所有自己的邮件转发到一个新的地址上,如果这个新地址的投递发生问题,将邮件弹回到邮件列表服务器,邮件列表的管理者从弹回的邮件中是看不出这个邮件原来是发给哪一个订阅者的,因为弹回的信息中只显示了用户变更后的新地址,而没有显示原来用户订阅邮件列表时登记的地址。如果这个用户长期无法进行投递,也就不能及时将他从订阅名单中删除掉,因为不知道是哪一个,这给邮件列表的管理带来了麻烦。
为了解决这个问题,Qmail 的作者DJB提出了VERP的方法通过将用户预定邮件列表的地址与弹回的地址相关联,使得发往每一个订阅者的邮件都有一个单独的返回地址,这样邮件列表管理者在处理弹回的邮件时可以轻松识别出是哪个订阅者的邮件被弹回并可靠地自动处理任何大小的邮件列表的弹回。
正确的弹回处理很重要,比如,一个典型不支持VERP的邮件列表得到的返回地址的格式是listname-owner@ domain,而支持VERP的邮件列表得到的返回地址比较长,其中包括了用户订阅邮件列表时使用的订阅地址,其格式为:listname-owner- subscriber= sdomain@ldomain,用户原来订阅邮件列表时的地址subscriber@sdomain嵌入到了返回地址中,为了符合对邮件地址有关语法规定,用“=”替换了原来的“@”号。
邮件列表管理软件Ezmlm实战
对邮件列表的自动维护是通过运行服务器上的邮件列表管理软件(Mailing-list managers简称 MLM)来完成的,MLM帮助邮件列表的拥有者维护按照专题组成的邮件列表,它的主要任务是管理订阅邮件列表的订阅者名单,并控制邮件列表中向订阅者的邮件发送。邮件列表一般都以某种专题为主题,都有自己专门的电子邮箱地址。当用户希望加入某个邮件列表时,可以按照规定的格式给指定电子邮箱发一封申请加入的电子邮件,该用户的电子邮件地址就会被自动加入该组的通信列表中。一旦加入,这个用户就会不断收到这个邮件列表以电子邮件方式发来的各种信息。如果用户希望退出,只需给指定的电子邮箱发送一封请求退出的电子邮件即可。所以一个MLM应该包括用户预定和退订的处理、对发送邮件的过滤与限制(如只允许邮件列表的成员向列表发送邮件),对邮件列表文件整理归档,以及智能化的弹回处理等管理功能。
Ezmlm简介
Qmail可以与UNIX下各种邮件列表管理软件相配合实现邮件列表服务。目前Internet上常使用Sendmail+Majordomo来实现邮件列表服务,Majordomo仍是目前使用最多的邮件列表管理软件。
虽然Qmail也能很好地支持这个软件,但是Qmail的作者DJB发现它存在安全及效率方面的严重问题,于是开发了基于Qmail的更加安全、可靠、高效和易于使用的邮件列表管理软件Ezmlm,从它的命名(Easy+MLM)就可以看出作者非常强调它的易用性。Ezmlm充分利用了Qmail的优势,可以轻松实现弹回处理、订阅请求和邮件归档等功能。DJB为它建立网页:http://cr.yp.to/ezmlm.html,可以从那里下载软件的最新版本。还有一个关于Ezmlm 的重要的网址:http://www.ezmlm.org/,这里提供ezmlm-idx:Ezmlm的功能增强版,它为Ezmlm增加了很多实用的功能。
与Qmail一样,Ezmlm的安全性和可靠性非常高。即使面对系统的崩溃,Ezmlm依然能保证很高的可靠性。每次向Qmail报告成功之前,它会将每一个订阅、每一个邮件都安全地写到硬盘上。Ezmlm对邮件列表的尺寸没有任何限制,订阅地址清单不会一下子全部调入内存。Ezmlm会首先将订阅地址清单分割(hash)化为一系列单独的文件,以加速处理订阅工作。由于使用Qmail的高速并行的SMTP投递,其投递速度也是很快的。
在Ezmlm下用户可以充分利用Qmail地址的层次结构,除了系统管理员可以在别名目录下建立系统一级的邮件列表外,每个用户都可以方便地在自己的目录下建立和管理用户级的邮件列表。Ezmlm利用VERPs来自动、可靠地处理邮件列表的弹回问题。它还可以为出现暂时投递问题的订阅者提供一份错过邮件的清单,以便他们以后可以从邮件列表档案中找回这些错过的内容。当发给某个订阅者的邮件被弹回时,Ezmlm会进行记录,等待10天后,给这个订阅者发出一个所有被弹回的邮件的清单以示警告,如果这个警告仍被弹回,Ezmlm会发出一个探针(Probe)去检查这个地址,如果探针也被弹回,则自动将这个订阅者删除。
一般的邮件列表分为两种类型。一类是单向通信的,又称订阅型邮件列表,也就是一般的电子期刊。加入这类邮件列表的目的主要是希望定期接收以电子邮件方式发来的信息,而不参与讨论。订阅型邮件列表一般不接受用户的投稿。另一类是双向通信的,参加的用户不但可以接收到邮件列表发来的信息,还可以将自己的信息发送给全组的所有其他成员,让大家参与讨论。这类邮件列表又分为仲裁(moderator list)和非仲裁(non moderator list)两种类型。仲裁型邮件列表设有仲裁人(moderator)。仲裁人在阅读收到的用户信件后,有权决定是否将它转发给全组成员。非仲裁型邮件列表则将收到的邮件直接转发给本组的其他成员。
Ezmlm通过将用户地址加入DIR/allow/和DIR/deny/数据库中来允许或禁止用户发送邮件。另一个重要的数据库是保存仲裁人地址的DIR/mod/,Ezmlm 的仲裁机制除可以决定是否将一个邮件转发给邮件列表的其他成员外,还可以由仲裁人决定是否接收一个新的订阅申请,以及向仲裁人提供远程管理功能。用户在使用ezmlm-make命令时配合不同的参数可以建立不同类型的邮件列表。
对于一些大型的邮件列表,由于订阅的用户很多,每天都要发送上百封信件,流量非常大,给邮件列表服务器带来很大的负担,对订阅邮件列表的用户来说,每天收到这么多邮件也是很麻烦的。在邮件列表管理上建立邮件摘要(digest)可以解决这个问题。摘要是邮件列表中一组邮件的集合,将多个邮件打包后再发给用户,可以减轻服务器和订阅者的负担。
在Ezmlm中可以建立摘要型邮件列表,每两天自动生成一次邮件摘要。如果自上次摘要后有30个新邮件或者有总共大于64kB的邮件,则提前建立摘要,当然这些具体值是可以调节的。对于只对邮件列表中某些特定主题感兴趣的用户,收到经过分类的摘要比每次收到单个邮件更方便一些,这些用户可以直接订阅邮件列表摘要,而不用订阅邮件列表本身。
Ezmlm会自动将所有新邮件标上序列号进行归档,订阅者可以按序列号查找已经归档的邮件,如:订阅者发一个邮件到地址joe-sos-get.123可以得到第123号邮件。邮件归档的格式支持快速检索,即使邮件数量很多,也能保证速度。Ezmlm为用户提供了非常方便的手段对自己的邮件列表进行管理和控制,比如:Joe可以编辑~/sos/text/?来修改发往订阅者的管理信息,删除~/sos/public和~/sos/archived就可以关闭自动订阅和归档功能,编辑~/sos/{headeradd,headerremove}可以发出邮件的邮件头。Ezmlm中还有其他一些应用程序供用户手工检查和管理自己的邮件列表。
Ezmlm的安装
在安装Ezmlm之前,首先要安装Qmail,具体的安装方法参考在《中国计算机报·电脑工作室》2000年第59期的内容及Qmail软件包中的Install等文档。然后下载Ezmlm软件包,开始进行安装。
1. 编译程序:
% make
2. 格式化手册页:
% make man
3. 安装程序和手册页:
# make setup
Ezmlm的默认安装路径为:/usr/local/bin/Ezmlm,可以修改conf-bin来改变安装路径;手册页的默认安装路径为:/usr/local /man,修改文件conf-man来改变它的安装路径。如果Qmail没有安装在默认的路径/var/qmail,需要修改文件conf-qmail指向它的安装路径。安装完成后需进行以下测试:
1. 将ezmlm-make加入你的路径中,建立一个简单的邮件列表:
% ezmlm-make ~/testlist ~/.qmail-testlist me-testlist host
将这里的“me”和“host”换为你的邮件地址。
2.手工将自己的地址加入邮件列表:
% ezmlm-sub ~/testlist me@host
3.发一个邮件到邮件列表:
% echo subject:testing | qmail-inject me-testlist@host
应该在订阅邮件的地址me@host收到一份这个邮件的拷贝。
4.查看邮件列表成员:
% ezmlm-list ~/testlist
应该只有一行,就是你自己刚才订阅时的地址。
5.通过电子邮件将自己从邮件列表中退订:
% qmail-inject me-testlist -unsubscribe@host </dev/null
当你收到要退订的确认时,回答它以便完成退订。再用ezmlm-list 命令查看邮件列表成员是否已为空。
6.从归档文件中查找刚才发出的邮件:
% qmail-inject me-testlist -get.1@host </dev/null
你应该收到刚才发送的主题为testing的邮件。
如果一切正常,说明Ezmlm安装成功了!以上的测试中,我们使用了几条常用的Ezmlm命令,有些主要功能除了可以命令来实现外,也可以通过电子邮件的形式来完成。除了邮件列表的拥有者可以管理自己的邮件列表外,还可以通过设置仲裁人,给仲裁人以较高的权限,让他通过电子邮件来远程管理邮件列表。
Ezmlm的命令
邮件列表服务的提供者可以利用Ezmlm的命令在邮件服务器上自己的目录下建立和管理各种类型的邮件列表,Ezmlm的命令清单见表1。
Ezmlm下的邮件列表的建立和管理
在Qmail下建立邮件列表最大的好处就是每个用户都可以方便地在自己的目录下建立和管理用户级的邮件列表,而不像在Sendmail这类系统下只能由邮件管理员建立系统一级的邮件列表。Qmail下的系统一级的邮件列表是建立在系统别名目录下的,必须由邮件管理员建立:
ezmlm-make ~alias/sos ~alias/.qmail-sos sos isp.net
chown -R alias ~alias/sos
会在/var/qmail/alias目录下建立一个子目录sos,保存关于这个邮件列表的所有文件及配置。用户可以使用前面介绍的方法来使用它,比如:所有发往地址sos- [email protected]的邮件都会自动进行订阅,如果订阅者向地址[email protected]或sos-help@ isp.net发出邮件,Ezmlm会自动给他们回复邮件列表使用说明。
表1 ezmlm的命令清单 命令 功能
ezmlm-make 建立邮件列表目录及相应的文件。
ezmlm-sub和
ezmlm-unsub 进行订阅和退订管理。
ezmlm-manage 自动处理管理请求。
ezmlm-send 向邮件列表的所有用户发一封邮件,如果邮件列表的配置要求,还将保留一份邮件档案和邮件主题索引。
ezmlm-reject 拒绝那些主题为空或只有一个命令字的邮件。
ezmlm-return 处理弹回。
ezmlm-warn 警告那些邮件被弹回的用户,并最终将邮件总是被弹回的用户从邮件列表删除。
ezmlm-idx 从一个已存在的邮件列表档案中产生一个主题索引。
ezmlm-get 邮件管理:从档案中重获索引和线索,建立邮件摘要。
ezmlm-cron 定时运行,生成邮件摘要。
ezmlm-store 排列等待仲裁的邮件,向仲裁人发出仲裁请求。
ezmlm-moderate 处理仲裁请求,队列中的邮件经过批准通过ezmlm-send发到邮件列表,不被批准的邮件退回给发送者。
ezmlm-clean 清除等待仲裁的邮件队列,返回给邮件发送者超时信息。
ezmlm-gate 对于发送者地址在允许直接发送的数据库中的邮件,直接发往邮件列表,其他的邮件则申请仲裁。
ezmlm-check 用于检查、诊断ezmlm邮件列表的配置问题。
ezmlm-issub
ezmlm-issubn 判断一个sender(发信人)是不是本邮件列表的用户,或是某个地址集合的成员。
ezmlm-tstdig 通过邮件的数量和总的大小及上次生成摘要后过的时间来判断是否应该生成新的摘要。
ezmlm-request 可做为与其它mlm的通用接口,可用于方便地移植其他mlm命令。
ezmlm-glmake 建立通用接口。
ezmlm-glconf 为你的邮件队列的通用接口建立一个配置文件。
ezmlm-archive 建立一个线索索引,ezmlm-cgi 可以用来允许通过http服务器访问邮件队列的档案。
对于普通用户来说,使用的是Qmail提供的扩展地址方式,在Qmail中向user-whatever的投递会转向~user/.qmail-whatever进行处理,比如:有一个用户Joe,输入命令:
ezmlm-make ~/sos ~/.qmail-sos joe-sos isp.net
就可以在自己的目录下建立起一个全功能的邮件列表:[email protected],所有有关邮件列表的信息都保存在新建立的子目录(~/sos)之下,用户以扩展地址方式来订阅和访问这个邮件列表,如所有发往地址[email protected]的邮件都会自动进行订阅。
Ezmlm的命令中最重要和灵活的就是ezmlm-make,通过配合不同的参数,可以建立各种不同类型的邮件列表。比如:
ezmlm-make -d ~joe/sos ~joe/.qmail-sos joe-sos isp.net
加上了参数“- d”,可建立一个有自动摘要功能的邮件列表。在默认参数下建立的邮件列表,是完全公开的,大家可以随意地订阅、退订以及访问邮件档案,用户也可以通过ezmlm-make命令随时修改以前建好的邮件列表的类型,比如:加上参数“-m”表示要建立对邮件列表内邮件投递的仲裁;加上参数“-s” 表示只有经过仲裁人批准,新的用户才能加入邮件列表。而这些参数改为大写,则表示相反的意思,如“-M”表示要建立非仲裁型的邮件列表。比如:
ezmlm-make -emrldn ~joe/sos
如果将这个邮件列表改为允许远程管理的仲裁型邮件列表,可以用以下命令为这个邮件列表加入仲裁人:
ezmlm-sub ~joe/sos/mod mod1@host1 mod2@host2 ...
一般用户的使用方法
对于一般的邮件列表用户可以使用不同类型的邮件地址来方便地实现各种功能,只要向特定的地址发一封空的邮件(邮件的内容和主题都被忽略,将实现不同的功能)。
1.mailinglist-subscribe@ example.org
表示我要订阅!Ezmlm会发给你一个确认请求,一旦你回复了确认,就将你的地址加入邮件列表。
2.mailinglist-subscribe- [email protected]
以地址[email protected]来进行订阅。这时是以地址[email protected]来订阅邮件,而非你发送订阅请求的地址,可以在这里使用任意地址来替换[email protected],将地址中的“@” 用“=”号来替换就可以了。当然,Ezmlm会向[email protected]发送确认请求。
3.mailinglist-unsubscribe@ example.org
表示我要退订。Ezmlm会先发给你一个确认请求,一旦你回复了确认,就将你的地址从邮件列表中删除。
4.mailinglist-unsubscribe- [email protected]
退订地址[email protected]。
5.mailinglist-query@ example.org(?)
查询地址是否在邮件列表中。
6.mailinglist-get.123@ example.org
从归档的邮件中取得第123号邮件。如果你指明的邮件序列号大于目前已归档的邮件的最大序列号,你会收到最新的邮件。
[email protected](*)
从归档的邮件中取得最近的30个邮件。对于建立了摘要的邮件列表,则返回最近一次摘要之后的新邮件(最近一次摘要中的最后一个邮件也被返回,所以至少会返回一个邮件)。
8.mailinglist-get.45_67@ example.org(?)
从归档的邮件中取得从第45到第67号的邮件。每次请求返回的邮件数目不超过100个。如果第一个参数大于目前已归档的邮件的最大序列号,会给你返回最近的30个邮件。对于建立了摘要的邮件列表,则返回最近一次摘要之后的新邮件,或者这次摘要之中的最后30个邮件。
9.mailinglist-index@example .org(?)
发送最近100~200条邮件的主题和作者,每次请求的回复不超过2000行。
10.mailinglist-index.300_ [email protected](?)
发送第300~399条邮件的主题和作者。
11.mailinglist-thread.45@ example.org(?)
收到与第45号邮件相同主题的经过组织的邮件集。
12.mailinglist-info@example .org(?)
发给我有关这个邮件列表的有关信息 (邮件列表的的主人决定返回什么样的具体内容)。
13.mailinglist-faq@example .org(?)
发给我有关这个邮件列表的FAQ及回答(邮件列表的的主人决定返回什么样的具体内容)。
14.mailinglist-digest-sub [email protected](?)
订阅[email protected]这个邮件列表的摘要。
15.mailinglist-digest-un [email protected](?)
退订邮件列表摘要。
php爱 好者站 http://www.phpfans.net 文章|教程|下载|源码|论坛.