许多用户常误以为收信与寄信是同一套软件在工作,其实不然。让用户能从邮箱取走邮件的协议是IMAP与pop,而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
#p#
postfix与cyrus imap的搭配实例
cyrus imap使用春雨如丝sasl函数库来验证用户的身份,所以,你必须先构建、安装cyrus sasl函数库,然后才可以顺利构建cyrus imap server。此外,cyrus软件至少需要berkeley db 3以上的版本,如果你系统
上的Berkeley DB比第三版还旧,你可能需要全面更新整个系统。在同一个系统上混用不同版本的Berkeley DB,可能会引发难以追查的问题。如果你必须升级DB函数库,建议你重建所有需要用到的Berkeley DB的软件,让系统上的所有软件都使用同版函数库。
为了举例说明,架设我们已经架设好一个能接收example.com网域邮件的postfix server,并以同一台机器来运行Cyrus IMAP server。假设所有邮件用户的账户都已经建在Cyrus SASL的数据库里,但是这台机器上仍有少数几个shell账户。虽然这些账户不会被用来收信,但是我们希望仍然能够使用.foward文件与别名文件, 以便系统产生给root的邮件以及外界寄给postmaster别名的邮件,都可以被转寄到正确的地方。
很显然的,我们不能直接将所有邮件都直接交付给Cyrus IMAP server(所以应该排除local_transport),因为我们扔需要local MDA的别名文件与.forward文件的展开功能(所以只剩下mailbox_transport与fallback_transport可以选择)。 但由于shell账户不是用来收信的,所以,最理想的选择是mailbox_transport。我们应该将此参数指向lmtp MDA,并确定master.cf里的lmtp服务能将邮件投递给Cyrus IMAP server。以下是我们的设定步骤:
1、将Cyrus IMAP安装到系统上。检查Cyrus的配置文件(通常是/etc/cyrus.conf),确定它的服务渠道是Unix-domain socket,并记下socket文件的位置。你应该会看到类似下面这样的内容:
SERVICES {
# add or remove based on preferences
imap cmd="imapd" listen="imap" prefork=0
pop3 cmd="pop3d" listen="pop3" prefork=0
# LMTP is required for delivery
lmtpunix cmd="lmtpd" listen="/var/imap/socket/lmtp" prefork=0
}
其中,“lmtpunix”那一行就是socket文件的正确位置。
2、依照Cyrus随附文件的指示,在服务器上设置一个供Cyrus IMAP server使用的系统账户。
3、检查/etc/postfix/master.cf的内容,确定lmtp服务的配置符合你的系统环境。一般而言,你应该像这样设定:
lmtp unix - - n - - lmtp
如果你的postfix是以默认模式安装的,上面这一行应该已经出现在你的/etc/postfix/master.cf配置文件里了。要注意的是第五 栏,它代表lmtp MDA是否要处于chroot环境下。在本例中,由于它必须要能够读取Cyrus IMAP server的socket文件,所以此栏设定为n
4、检查main.cf,确定mydestination参数所列的网域包含了你要的收信网域。你可以直接列出。
5、要求mailbox_transport使用master.cf所指定的lmtp服务,并指向你先前记下的Cyrus IMAP socket文件
6、重新加载postfix
通过上文我们知道了一些postfix 与pop/imap的知识,希望对大家有所帮助!
【编辑推荐】
- 如何安装PostfixAdmin
- Postfix的邮件队列管理
- Postfix中的地址操作大全
- Sendmail 配置E-Mail服务器开启SMTP、POP端口
- 分析PHP函数array_pop()的具体使用方式
- Perl Pop和Perl Push操作异同之处
- Courier imap 安装指南
- Thunderbird设置IMAP接收gmail过程
- COURIER-imap安装并创建rpm环境