Linux 版 (精华区)

发信人: lizhenguo (椿棉布绝小), 信区: Linux
标  题: 通过exim建立家庭网络的邮件系统
发信站: 哈工大紫丁香 (Thu May 13 14:54:57 2004), 转信

 2000-10-10 13:46:00 

1 简介
通过Samba,IP Masqerading,和 diald等创建一个Linux和Win95混合的家庭网络的技巧,已经有包括Linux公报在内的很多文章提到.但是到目前为止,我还没有找到一个在小型网络上通过一个拨号电子邮件账号创建Mail服务的解决方案. 这篇文章中, 我就来阐述以下我是如何实现的, 实现的功能包括: 
网络中的用户可以实现本地邮件的发送和转发. 
发往子网范围以外的邮件有正确From:<邮件地址>. 以使外部的邮件能够正确的回复. 
电子邮件账号是所有本地子网用户所共享,但是要实现每个用户仅仅能够收到自己的邮件. 
在我的机器上(基于Debian Linux 2.1),我是通过以下程序实现的: 
exim作为邮件的收发代理(它比sendmail好配置的多). 
fetchmail 用来从ISP一端收取邮件. 
pine作为linux端的邮件客户程序(当然象mail之类的程序也可以使用). 
Microsoft Internet Mail 作为Windows端的邮件客户程序(同样你也可以使用其它的类似工具). 
qpopper 作为POP3服务器, 用来把邮件从Linux系统中转移到Win95机器上. 
我在两台机器上(分别安装linux和win95系统)架设了这个系统, 但是无疑这种方案可以在更大一些规模的网络中运行, 而且应付一个小型的办公室应该绰绰有余. 注意: 我所写的这篇文章是基于Debain的. 如果你使用的是别的发行版本, 有些地方需要作适当的改动. 
2 网络和命名
在这篇文章中我假定以下的名字(您实际应用时应该做写修改,以适应您的实际情况): 
拥有者和系统管理员的名称 Joe Bloggs. 
Linux机器名为 heaven. 
Win95 机器名为 earth. 通常使用者为 Emily Bloggs. 
Joe 在 heaven 机器上的注册用户名为 joe. 
Emily 在 heaven 机器上的注册用户名为 emi. 
Emily 在 earth 机器上的注册用户名也为 emi. 她的在linux下的heaven机器和 Microsoft 网络下的口令也相同. 
Joe在一家域名为isp.com的ISP,拥有一个拨号账号(动态的IP地址),来自ISP的邮件可以通过POP3接收. 
Joe在ISP的注册名为jbloggs. 
Joe 和 Emily 都使用电子邮件地址:joe.bloggs@isp.com. 
Joe到POP3收信的口令为zaphod. 
ISP的发送邮件的邮件服务器为smtp.isp.com. 
ISP的接受邮件的邮件服务器为pop3.isp.com. 
机器heaven和earth都属于一个域,域名为home. 这个域名表示使用范围局限于一个内部家庭网络之内. Joe并没有注册这个域名, 因而对于外部网络来说, 并不能直接识别这个域名. 
此外,我还假设内部网络已经正常工作, 并且已经拥有使用daild实现的非永久拨号连接. 在haven机器上也不起DNS服务. /etc/resolv.conf中只是加入了ISP提供的两个DNS服务器的地址. 同样的设置也要加在earth机器上的TCP/IP设置中. 
heaven机器上的/etc/hosts文件内容如下: 

127.0.0.1 localhost 
192.168.1.1 heaven.home heaven 
192.168.1.2 earth.home earth 

在earth机器上的c:\windows\hosts文件中的内容跟heaven机器中的/etc/hosts文件的内容一样. 

3、邮件地址
在"To:"和"From:"中指定邮件地址是一封邮件的基本组成部分, 此外还有更多的内容. 举例来说: 
To: Emily Bloggs 

'Emily Bloggs'是一个"real-name part"(真实姓名部分). 这是通过撰写电子邮件的程序加上的. 这个部分就是将邮件发送给Emily本人的依据. 注意:如果在real-name part中有句点存在, 邮件地址必须用"符号包围起来(例如:"Joe C. Bloggs"). 您可以用man mailaddr参考一下相关的帮助页. 

4 配置exim
在Debian linux下, 这一切都是由eximconfig程序来完成的. 程序将问到一些问题,你可以参考下面的回答: 
你的系统是一个使用smarthost的Internet主机. 
'显示的邮件域名'为home. 
home 和 heaven.home其他的名称部分:你可以回答 heaven:localhost 
你不想转发任何非本地域的邮件. 
你想转发的本地域地址为192.168.1.0/16 
RBL(spam的过滤库): 随便你制定, 我回答的n 
处理向外转发的邮件的smarthost 地址为 smtp.isp.com. 
系统管理员的邮件为joe(非root). 
在Microsoft Internet Mail(或者你在Win 95使用的其他此类的邮件客户程序). 必须都将heaven输入作为SMTP 邮件服务器和POP3服务器. 在"POP3账号名"和"POP3口令"输入框, 输入用户名emi和她在linux下的口令. 输入姓名为Emily Bloggs; 电子邮件地址为 emi@home. 注意电子邮件地址必须以本地域做后面的地址. 
在Linux机器上, 无需设置什么特别的选项. /etc/pine/conf 和用户自身的~/.pinerc可以直接拿来用.邮件程序pine是用主机名和/etc/passwd中的用户信息来构成本地的邮件地址. 

通过上述的设置,本地的用户之间应该已经可以实现相互的发送和回复信件了. 举例来说, 在机器heaven上, joe可以通过pine发一封邮件给emi. pine 就会自动的把地址解释成: 

To: Emily Bloggs 

邮件马上就做了投递(如果你使用eximon你就可以看到, eximon是exim的一个监视工具).emi(登录到heaven机器以后)就可以看到一封来自下面地址的邮件: 

From: Joe Bloggs 

现在home已经真正成为了一个具有邮件转发功能的本地域. 接下来的问题是如何将邮件投递到本地域以外. 一个joe@home格式的From:地址显然是无法被外部用户回复的, 因为对于外部网络来说, home是一个不存在的(因而不合法)的域名. 

5、修改 From: 的地址
我们必须把本地的From:地址格式改变成为一个合法的电子邮件地址(来自ISP的邮件账号),但是只是在往外界发信件的情形. 借助于exim的"传送过滤器", 我们可以实现这一功能. 往外部转发的邮件经过这个传送过滤器以后, From: 中的地址就会被改变, 而对于本地邮件则没有什么影响. 
下面的过滤器将实现这个恶作剧式的技巧, 首先我们确定我们要改变的地址永远包含在"<>"符号之内. 虽然不能完全保证, 但是通常的邮件程序:pine, mutt 以及mail 甚至Microsoft Internet Mail都是生成这种格式的电子邮件地址. 

#!/usr/bin/perl
while () {
        if (/^From: /) {
                s/<.*>/<'joe.bloggs@isp.com'>/;
                print "$_"; last;
                }
        print "$_";
        }
while () { print "$_"; }
不要忘记把上面的电子邮件地址换成你自己的电子邮件地址! 把这个文件命名为outfit, 并且通过chmod +x outfit加上可执行的权限, 并把这个文件放到/usr/bin目录中. 现在我们必须在/etc/exim.conf文件中加入1行, 修改以后的TRANSPORTS CONFIGURATION小节的后面的行如下: 
remote_smtp:
   driver = smtp
   headers_remove = "sender"
   transport_filter = "/usr/bin/outfilt"
end
实际上我们加入了两个新的行, headers_remove这一行也是新加入的. 这一行防止 exim 加入一个Sender:行到邮件中(在你使用pine的时候就会这样做)而Sender:行可能会在一些(配置很糟糕的)邮件目的地址. 
通过上述对/etc/exim.conf文件的修改, 无论何时发送一封电子邮件到本地域以外时, 都可以被exim正确的投递了. Exim(通过daild)每发送一次, 就会向外拨一次号. 在家庭网络的环境下, 或许这正是你想要的. 而对于一个邮件传送量更大一些的小型办公室而言,你可能希望推迟邮件的发送, 而在特定的时间做为一个批量作业一次发送出去,从而节省话费开销. 这是可以实现的, 但是由于我不需要这个特性所以也就没有具体的研究. 你可以通过阅读Linux Mail-Queue mini-HOWTO得到有关内容. 

6、Fetchmail的配置
fetch命令通过diald建立的连接从ISP的邮件服务器上取回邮件(并转交给exim再做本地投递). 用户可以运行fetchmail的前提是在自己的主目录中有一个.fetchmailrc文件, 并且是该文件的所有者. 这个文件可以通过一个fetchmail的配置工具fetchmailconfig来创建. 你可以得到如下内容: 
# Configuration created Sun Mar 28 03:15:20 1999 by fetchmailconf
set postmaster "postmaster"
poll pop3.isp.com with proto POP3
       user "jbloggs" there with password "zaphod" is joe here options fetchall warnings 3600
.fetchmail文件对于不用的用户来说可以相互拷贝, 只要把文件的属主设置成相关的用户即可. 不过把用户的邮件密码用明码写在这个文件中显然是一种不明智的方式. 或许应该有更好的方法, 不过在家庭网络的情况下是无所谓的. 
综上所述的主旨就是:无论是谁运行fetchmail, 邮件必须一直接收到同一个用户的信箱中(在本文中是joe的信箱) 

7、取消exim的投递限制
Exim 缺省的一次投递邮件的最大数量为10封. 我承认在某些场合下这的确是一参数的确非常有意义. 但是对于拨号网络来说, 显然不适用.为了取消这个限制, 你必须在/etc/exim.conf文件中的MAIN CONFIGURATION小节中, 的END语句以前,加入一行: 
smtp_accept_queue_per_connection = 0 

8、投递邮件给私人
通过fetchmail和exim,所有来自外部网络的邮件都投递到了heaven机器的joe的信箱中(/var/spool/mail/joe).在joe的主目录下,有一个文件.forward, 其中有以下的行: 
# Exim filter 
if $header_to: contains Emily then deliver emi endif 

如果邮件的To:地址部分包含Emily(真实姓名部分, 通常所有Emily的朋友发邮件给Emily时都会有这部分地址内容). 这封邮件就会进入到Emily在heaven机器上的信箱中, 而不是Joe的信箱. Emily就可以通过POP3(参见后面的信息)把邮件转到自己的机器上. 

9、通过qpopper传送邮件
为了让heaven机器作为earth机器的POP3邮件服务器,可以安装qpopper。 我安装了qpopper的Debian发行包 qpopper_2.3-4.deb. 安装过程是自动的; 不需要任何配置. 如果Emily在Ms Internet Mail中按下[发送和接收]按键,她的在heaven机器上的邮箱中的邮件就会转到earth机器上(还有她写的其它邮件,本地域的还有外部网络的都会被投递) 
10、手工检查邮件
得益于earth机器上的Win95桌面上的telnet快捷方式, Emily可以登录到heaven机器上, 以手工的方式方式执行fetchmail. 这就是说, 她可以不必等到运行fetchmail的cront作业所设定的时间, 而随时的查收邮件, 一旦来自ISP的邮件传输过来以后, 她就可以通过按下[发送和接收]按健把heaven机器上的邮件都收到earth机器上来了.  

--
不滞於物,草木竹石均可为剑。自此精修,渐进於无剑胜有剑之境。


※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.239.*]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.901毫秒