Postfix里的POP与Imap介绍(1)


许多用户常误以为收信与寄信是同一套软件在工作,其实不然。让用户能从邮箱取走邮件的协议是IMAPpop,而postfix的职责是将收下的邮件放入邮箱。也就是说,pop/imap服务是由postfix之外的软件所提供的。提供pop/imap服务的软件很多,包括 popper、wu imap kit等。

postfix与pop/imap servers

postfix 与pop/imap server之间得合作相当简单。每当postfix收下本地邮件,就将邮件封存在邮箱里。当pop/imap server收到用户的要求时,只要从同样的邮箱取出邮件即可。postfix与pop/imap server双方都必须同意使用相同得邮箱格式以及相同得锁定机制。postfix可搭配任何使用传统邮箱格式得标准POP/IMAP server。你可能会想要调整mail_spool_directory参数,但是对于大多数得POP/IMAP SERVERS而言,只要按照标准安装指示安装并启动服务器即可。对于不支持传统邮件格式的pop/imap servers而言,postfix扔可以使用“本地邮件传输协议”来投递邮件,由POP/IMAP SERVER自己将邮件存入邮箱。

本地邮件传输协议(LMTP)

某 些pop/imap servers使用非标准的邮箱格式。很显然的,没道理要求postfix之类的MTA必须认识多种不同的专属格式。因此,我们需要一种无关邮件格式的传 输渠道,让邮件能从某个邮件程序传到同机器上的另一个邮件程序,这个渠道便是LMTP。LMTP可说是smtp的精简版。LMTP SERVER同样有权决定是否要收下或拒收邮件,不过,LMTP SERVER不负责处理无法立刻投递的邮件。

当MTA传递一封多收件人的邮件给 SMTP server时,若有部分收件人因故不能收下邮件,则smtp server要负责将邮件排入队列以便下次传送,并对LMTP client宣称投递任务已经成功。然而,LMTP server不承担这样的责任,也就是说,每一位收件人的投递状况都必须个别回复给LMTP client知道。对于无法投递的收件人,他们的邮件是放在LMTP client的队列里,由LMTP client负责后续的处理过程。

LMTP 的对话可能发生在同一机器上的不同邮件子系统之间,或是同一局域网上的不同机器之间。但是,如果对话双方中间隔着广域网路,就不保证LMTP一定可靠,因 为此协议是以响应速度的快慢与否来判断邮件是否顺利送达。SMTP已经被发现其收信与送信系统之间有一个同步化问题,偶尔会导致邮件被重复传递。乳沟 LMTP的对话双方居广域网络的两端,相信问题会更严重。

注意: LMTP除了可让MTA用来将邮件投递到非标准格式的邮箱,其真正的好处是让邮件管理人员可以架设出容易扩展且可靠的邮件系统。比方说,对于邮件量很大的 站点,可以架设一台或多台postfix servers专门接收来自Internet的邮件,然后投递给多个LMTP后台系统。当邮件量提升时,只要多架设几台前台或后台系统即可。

POSTFIX与CYRUS IMAP

Cyrus IMAP是专门提供POP/IMAP服务的服务器,用户不需要系统账户。如果你想要为系统现有的用户架设邮件服务器,或许应该考虑其他比较简单的 POP/IMAP解决方案,像Qualcomm的Qpopper(只有pop功能),或是University of Washington的IMAP Toolkit,这两套软件都不需要你在postfix进行任何特殊设定。

Cyrus IMAP提供两种LMTP投递渠道,分别是Unix-domain socket与TCP socket。你必须知道Cyrus IMAP使用哪一种渠道,才可以适当设定postfix。如果使用Unix-domain socket,则postfix与Cyrus IMAP server两者都必须在同一台机器上;如果使用TCP socket,则postfix与Cyrus IMAP server可以在同一台机器上,也可以分居于局域网络上的不同主机。postfix的LMTP投递参数定义在main.cf配置文件的 transort_maps参数中。

要让postfix收下投递给本地Cyrus IMAP server的邮件,则收件地址的网域名称必须被列在mydestination参数。接着,你必须要求postfix将邮件交给Cyrus IMAP。使用mailbox_transport、local_transport或fallback_transport参数可让postfix知 道,在邮件交给Cyrus之前,要进行多少道本地投递手续。如果你使用了local_transport或fallback_transport,请将 Cyrus的所有用户名称写在local_recipient_maps参数所指的一个查询表里,以免postfix拒收cyrus用户的邮件。

mailbox_transport

邮件先交给local MDA,由local检查别名文件与.forward文件,并展开收件人的邮件地址。经过处理后的邮件会被转交给postfix的LMTP client,由它负责投递道LMTP server。

local_transport

当LMTP用于本地传输时,邮件会被直接交给postfix LMTP client,原本负责处理本地邮件的local MDA完全不插手。因此,别名文件与.forward文件都没有作用。

fallback_transport

当LMTP用于备用传输时,postfix会先将邮件交给local MDA处理,执行别名文件与.forward文件的展开操作。如果收件人有一个正常的系统账户,则邮件会被投递到系统上的适当邮箱;如果收件人没有系统账 户,则邮件会被交给postfix LMTP clenet,由它负责将邮件交给LMTP server。当你的邮件服务器同时以自己的系统账户服务一群用户,而同时又代收另一群Cyrus IMAP server用户的邮件时,就需要以fallback_transport机制来进行LMTP投递操作。

使用下列格式来设定你所选的投递机制:

xxx_transport = service:socket_type[:/path/to/socket]

对于LMTP投递操作而言,service必须为lmtp(代表/etc/postfix/master.cf)所定义的lmtp服务, socket_type必须是unix(代表unix-domain socket)或inet(代表tcp socket)两者之一。默认值为inet,这表示postfix架设你的lmtp server是使用tcp socket来收信。因此,如果默认值符合你的需求,你只要这样设定就可以了:

local_transport = lmtp

如果使用local_transport与unix-domain socket,在/etc/postfix/main.cf中应该做这样的设定:

local_transport = lmtp:unix:/var/imap/sockte/lmtp


相关内容