电子邮件FreeBSD支持在Internet上收发电子邮件,也能被用作一台功能强大的邮件服务器,为众多使用不同操作系统的客户机服务。
邮件服务器Internet上与电子邮件相关的协议主要有SMTP、POP3和IMAP,其中SMTP是邮件传输协议,用于计算机之间交换电子邮件,POP3和IMAP是用于客户计算机远程访问邮件主机上时使用的。
FreeBSD系统缺省即包括了sendmail程序,它按照SMTP协议在Internet上接收和发送E mail。sendmail在缺省设置下就已经能够正常工作,一般情况不需要进行改动。如果更改sendmail的配置,就需要更改sendmail的配置文件sendmail.cf,这个文件相当复杂、难于设置。因此如果希望设置邮件服务器的一些特殊属性,就需要小心更改sendmail,讨论sendmail的设置不在本书的范围之内,并且,还有其他的邮件服务器能用来代替sendmail,来完成接收和发送Internet邮件的任务。通常这些sendmail的代替者具备更高的性能、易于更改设置,并且没有sendmail中经常报告的安全漏洞,因此如果需要定制邮件服务器,推荐使用这些sendmail的代替产品,例如qmail或postfix。
如果系统的用户经常使用其他计算机,如运行Windows9x的个人计算机,来访问自己的电子邮件,可以在服务器端安装支持POP3或IMAP4的服务程序,这样Windows9x中的电子邮件客户软件就能访问服务器中的邮件。pop3协议比较简单,因此Windows下一般的电子邮件处理软件都支持pop3协议,相对而言IMAP协议更复杂一些,对电子邮件的支持能力更强,但支持imap协议的软件就较少。比较流行的电子邮件软件可以支持这两种协议,如netscape messager、Eudro等。因此服务器可以有选择的支持这两种协议。
如果仅需要提供POP3支持,可以使用qpopper,而要同时支持POP3和IMAP,就可以安装imap-uw(uw指 University of Washington,IMAP协议和这个服务器程序的开发者)。安装imap-uw之后,还需要更改 inetd.conf,增加以下行:
pop3streamtcpnowaitroot/usr/local/libexec/ipop3dipop3d
imap4streamtcpnowaitroot/usr/local/libexec/imapdimapd 重起inetd,则远程用户就能在其客户软件中处理电子邮件了。
在FreeBSD上查看邮件FreeBSD上的用户可以通过mail程序来查看自己的Email,mail是一个最基本的交互式Unix 命令,可以运行在任何类型的终端上,然而使用它来处理邮件也很不方便。使用者常常安装其他更为便利的电子邮件客户程序来处理自己的邮件,这些软件有elm、mutt、pine,以及只用于X下的 netscape messager、kmail等。
虽然基于X的邮件处理软件比较方便和易于学习,然而通过网络远程直接使用这些X程序比较麻烦,不是任何计算机上都运行了X服务器的。而几乎所有的计算机系统中都支持telnet等字符终端连接软件,使用支持字符终端的邮件处理程序就使得使用者无论身在何处,只要连接到自己的主机上就能处理自己的电子邮件。
在远端访问自己的电子邮件的另一种方式是:首先在远端的客户机上安装、配置电子邮件软件,再使用这些软件访问自己主机上的邮件。这些远程访问邮件服务器的软件使用POP3协议或者 IMAP协议,让用户查看远程计算机上的邮件。
这两种方式的不同在于邮件处理软件的安装位置,安装在主机上的邮件处理程序基于X或字符终端,不需要改动客户计算机上的任何配置,因此适用于经常改变客户机的使用者。安装在客户机上的用户可以充分发挥客户计算机的优势,例如MS Windows的用户界面,这种方式适用于拥有固定个人用计算机的使用者。这两种方式并不相互冲突,而是相互补充的,适合不同情况的使用者。
邮件处理程序pine 由于基于字符终端的邮件软件启动快捷,能通过telnet等防真终端使用,而不需改变客户计算机的任何配置。因此Unix的使用者至少都会选择安装一种基于字符终端的邮件处理软件,以作为最基本的邮件处理软件。pine就是其中之一,它提供了简洁的字符菜单界面,功能强大且易于操作,易用性超过很多图形接口的邮件处理程序。
在Pine的主菜单下,可以执行发送电子邮件(Compose message),查看当前文件夹的内容(Message index),选择不同的文件夹(Folder list),使用和维护地址簿(Address Book),使用S(Setup)用于设置Pine,使用Q(Quit)退出pine回到shell提示下。正常情况下,不需要对 pine进行任何设置,就能正常使用pine阅读和发送电子邮件。
然而当使用pine来发送中文邮件时,pine会对中文进行重新编码,以适应7位传输,虽然大部分电子邮件客户都会识别这些标准的编码格式,但还是有一些电子邮件程序不能识别出这些编码,造成阅读问题。此时就可以重新设置pine直接使用8位编码。
在主菜单下选择Setup,当出现提示时,使用Config进入配置部分。就可以搜寻包含enable-8-bits 的两个选项,配置自己使用的字符集(由于pine中不直接支持中文字符集,可以设置为ISO-8858-1),以支持8位字符。
还可以在这里设置Pine来阅读Usenet新闻,这就要在nntp-server的选项中填写本地新闻服务器的域名,并配置news-collections选项,例如本地新闻服务器的名字为news,那么news-collections 就应设为 ”*{news/nntp}/[]”。也可以设置远程文件夹,使得Pine能访问远程主机上的邮件。
Pine缺省支持使用IMAP协议访问远程主机上的邮箱,但它对POP3的支持未在其文档中公布,不能使用设置程序来完成。可以手工更改用户个人目录下的配置文件.pinerc中的选项incoming-folders,以支持POP3,下面为一个例子:
incoming-folders="imapfolder" {imaphost}INBOX,
"pop3folder"{pop3host/pop3/user=wb}INBOX 这个例子中配置了两个远程帐户,一个为imaphost上的邮箱,使用IMAP协议进行访问,在 pine中的文件夹名为imapfolder,第二个为pop3host上的邮箱,后面使用/pop3指明使用pop3协议,/user=wb指明使用wb作帐户名,其文件夹的名字为pop3folder。使用这样的格式就能使pine来管理多个计算机上的多个邮箱。
那么再次启动pine就能有位于不同主机上的相应incoming和nntp文件夹,用户打开相应的文件夹就能使用imap、pop3或nntp等不同协议,访问相应的邮件或新闻了。
使用fetchmail管理多邮件帐户 尽管使用pine能非常方便的管理多个POP3或IMAP邮箱,但是如果邮箱主机与当前FreeBSD系统的网络连接很慢,使用pine来阅读这些邮箱中的邮件就非常迟缓。此时更好的办法是先在后台将邮件取到回本地邮箱中,然后使用pine或其他邮件处理程序进行处理。
fetchmail就是一个非常方便的从远程邮件主机下载邮件的应用软件,它支持pop3、imap,以及对pop3的一些扩展协议。当安装好fetchmail之后,使用者可以直接启动fetchmail,来取得邮件的方法为:
$ fetchmail -p pop3 -u wangb email.online.ha.cn
passWord for wangb@email.online.ha.cn: 在输入正确的口令之后,fetchmail将使用pop3协议访问主机email.online.ha.cn,并取回用户wangb的电子邮件,取回的电子邮件将发送到本地邮箱中。也可以用更复杂的方式在后台运行 fetchmail,则需要设置个人目录下的.fetchmailrc文件。
$ cat ~/.fetchmailrc
poll email-wangb via email.online.ha.cn
PRotocol pop3
authenticate password
username wb here is wangb there
password "1111"
smtphost localhost
pass8bits
stripcr
fetchall
$ chmod 700 ~/.fetchmailrc
设置文件中第一行poll email-wangb via email.online.ha.cn中设置了要下载邮件的邮件服务器为email.online.ha.cn,其中email-wangb为对应这一个帐号的标签名字,用于区分多个不同的邮箱。然后指定使用的协议为pop3,认证方式为标准的Unix口令认证,然后,定义了远端主机上的邮件帐户名为wangb(用there表示远端主机设置),邮件下载到本地用户wb的邮箱中(使用here 指明本地主机设置)。
smtphost定义了fetchmail用来转发邮件时使用的smtp主机,passsword定义了远程邮件服务器中帐户的口令,在口令中使用了数字或特殊字符时,就需要使用双引号将口令括起来。pass8bits 允许下载邮件中存在8位字符,stripcr用于过滤额外回车字符,由于DOS和Unix在文本定义上的不同,这一项用于兼容一些不识别这个差异之处的Windows系统的邮件服务器,fetchall表示取回全部邮件,否则就只取回最新的邮件。
此外,这个文件因为包括了远端服务器的口令,因此必须具备属性700,以避免其他用户能读取这个文件,否则fetchmail不会运行。
这样,就可以不使用任何命令行参数,直接在后台运行fetchmail了。每个用户可以使用cron来运行自己的fetchmail命令,来管理自己的邮件,而拨号用户可以在拨号后,使用ppp.linkup启动fetchmail ,取回自己的邮件。
使用Procmail设置邮件过滤 由于Internet的使用者不但使用电子邮件和朋友、同事联系,而且还通过maillist与Internet 上的其他使用者讨论共同感兴趣的话题,用户收到的电子邮件越来越多,并且还会受到广告、宣传品等垃圾邮件的骚扰。使用Promail、maildrop等邮件过滤程序就能帮助使用者阻挡这些广告和宣传品,并帮助管理用户接收到的邮件。Procmail就是一个用于过滤用户接收到的电子邮件,并能对其自动分类、处理的一个应用软件。对于每天都会收到大量电子邮件的Internet使用者,这是一个非常有用的工具。
为了使用Procmail,必须在用户接收到Email时,启动Procmail进行处理。这个任务可以使用两种不同的方式来完成,一个是将Procmail配置为系统的邮件分发代理(Mail Deliery Agent),系统的邮件服务器使用porcmail代替其本身原有的邮件分发功能,来分发用户的邮件。这种方式需要由系统管理员根据邮件服务器的不同,而进行不同的设置。
另一种方法是使用个人目录下的.forward文件,系统邮件服务器在给某个用户分发邮件的时候,如果发现他的个人目录中存在.forward文件,那么就会按照这个文件中的内容来进行处理。因此就可以在.forward文件中启动procmail处理用户接收到的邮件,与更改系统MDA的设置方式相比,这种方式更为灵活,并且可以由每个用户来决定是否使用这个过滤处理能力。
.forward文件可以按照需要设置三种不同的处理方式:定义存储邮件的邮箱文件名、进行转发的目的地址或者对电子邮件进行处理的外部应用程序,显然启动Procmail是应使用第三种方法。
.forward文件应该属于这个用户(或root),并且其权限设置应该为不能被其他或同组用户可写。
$ cat ~/.forward
"|IFS=' '%26amp;%26amp;exec /usr/local/bin/procmail -f-||exit 75 wb" 这个.forward的例子里,使用"|"字符设置括号内的参数为一个执行命令,这样 sendmail就能启动一个shell执行设置的命令,并使用管道的方式读取sendail的输出。执行命令中首先定义了IFS环境变量(用于分隔不同的域),然后执行procmail,如果procmail执行失败就执行 exit 75 wb告诉sendmail,邮件分发失败,需要更改wb为使用者自己的登录名。
procmail使用用户个人目录下的.procmailrc文件,来设置对收到的Email进行处理的过滤规则。最简单的.procmailrc文件为:
:0c:
* ^FROM.*@freebsd.org
$HOME/mail.backup 第一行首先使用冒号开始定义一个过滤规则,紧随其后的应该是一个数字,这个数字规定了这个规则占用的配置行数,一般使用0表示没有限制配置行,此后的c表示复制(copy),表示下面的规则只是用于处理邮件的副本,而邮件本身仍然会被其他的过滤处理规则处理。这一行最后的冒号,用于表示在处理过程中进行加锁,防止同另一个procmail进程处理同一个文件时发生冲突,通常这个机制在存储邮件文件时非常有帮助。
第二行就开始了一个过滤规则的定义,过滤规则使用*字符开头。一个规则中使用模式匹配来匹配电子邮件信头或内容中的特定行。上面例子里的这个规则匹配所有来自于freebsd.org的电子邮件。在第三行定义了对符合上面规则的邮件的处理方法,由于给出了一个文件名mail.backup,因此将所有来自于freebsd.org的电子邮件添加到mail.backup文件中保存。如果使用!开头定义规则处理办法,表示进行转发处理,!后面就为进行转发的电子邮件的地址,或者以|开头,表示启动后面的命令进行邮件处理。
procmail不区分大小写,它使用Unix最常用的模式匹配方式进行匹配特定的邮件。因此使用这些匹配模式和procmail规则,可以定义一个更复杂的.procmailrc:
PATH=$HOME/bin: /usr/bin: /usr/ucb: /bin: /usr/local/bin:.
SHELL=/bin/sh
MAILDIR=$HOME/mail
DEFAULT=$MAILDIR/mailbox
LOGFILE=/dev/null
SENDMAIL=/usr/lib/sendmail
:0:
* ^From.*badguy
/dev/null/
:0c:
* ^(From|Cc|To).*freebsd.org
| gzip freebsdmail.gz
:0:
* ^From.*@hotmail.com
* ^Subject:.*(joke|funny)
{
:0 c
! friend1@hotmail.com friend2@usa.net
:0
joke
}
:0
* ^Subject:.*order
* !^FROM_DAEMON
* !^X-Loop: marketing@company.com
{
:0 h c
| (formail -r -A"X-Loop: marketing@company.com " ; \
cat /market/acknowlegement.txt ) | $SENDMAIL -t
:0 c
! market2@company.com
:0
market
} 这个配置文件的第一部分中设置了几个环境变量,用于设置procmail的运行环境,其中将 MAILDIR设置为~/mail,与pine使用的目录相同,因此这将使pine能直接读取procmail处理过的邮件。
第二部分中为邮件定义了三个不同的过滤规则及相应的处理操作,第一个规则将来自badguy 的邮件滤掉(输出到/dev/null);第二个规则将与freebsd.org的通信使用gzip保存到freebsdmail.gz 中,用于保存相应maillist的邮件;第三个规则将某个使用hotmail帐号的朋友,并使用joke或funny标题给自己发送笑话的邮件同时转给其他几个朋友,并同时保存在joke文件夹中;最后一个规则是设置了一个自动回复邮件系统,对于使用order做标题,并且没有FROM_DAEMON行(自动邮件回复程序使用FROM_DAEMON 作标记,通常不需要回复这些的邮件,否则会造成回复循环),并且没有包括X-Loop行的邮件进行处理:
首先将X-Loop行添加到邮件中(使用formail将它们添加到mail的信封上),以免造成对同一个邮件的循环处理,然后将文件/market/acknowlegement.txt发回给发送者;并以及转发邮件,在market中保存邮件。
根据这些规则,使用Procmail就能完整的处理各种邮件,减轻电子邮件不断增多而造成的困扰。