现在的位置: 首页 > 综合 > 正文

postfix+cyrus奇怪的需求。

2013年08月09日 ⁄ 综合 ⁄ 共 1285字 ⁄ 字号 评论关闭
最近在做一个项目,设计到给用户创建信箱。

具体流程是这样的, 给系统创建一个新用户的时候,同时给用户创建一个Imap 的邮件箱。
imap server用的是 cyrus
smtp server用的是 postfox

postfox接受到邮件,并不是直接投送到cyrus的本地邮件目录里,(好像是因为cyrus的maildir不是标准格式),而是通过cyrus的lmtp服务再投递给cyrus的本地目录,所以在postfix的设置文件main.cf里有以下的设置
mailbox_transport  = lmtp:unix:/var/spool/postfix/socket/lmtp
fallback_transport = lmtp:unix:/var/spool/postfix/socket/lmtp

现在的问题是,客户有了需求,由于给用户创建Imap邮件箱时,使用的是自动生成的用户名(16个随机字符),用起来很不方便,所以客户要求用户可以自己改信箱的用户名。

经过调查,cyrus的登录用户名和maildir的目录名是同样的,由于cyrus使用的是ssl的db认证,所以很好改动登录用户名,但是cyrus无法直接变更maildir的目录,通常的做法是先创建新的信箱,然后把旧信箱里的所有目录和邮件都复制到新邮件箱,然后删除旧邮件箱,这个操作用程序很难完成。

所以,放弃了改变用户邮件箱的打算。

另辟新途径,那就是,更改postfix的设置,在数据库里建一个虚拟邮件表,可以把邮件通过虚拟邮件表投送的真正的邮箱里。

比如说有一个用户邮箱为 asdfasdfasdfasdfasdf@example.com, 如果给这个用户送信的话,必须把送到这个地址上,如果用户想把自己的信箱改成 flyforlove@example.com,那么可以把送到flyforlove@example.com的邮件转送到asdfasdfasdfasdfasdf@example.com。

主要的设置如下
postfix的main.cf文件设定(使用postgres数据库)
virtual_alias_maps = pgsql:/etc/postfix/pgsql-virtual-alias.cf

文件/etc/postfix/pgsql-virtual-alias.cf的设定
hosts = dbhost
user = dbuserid

dbname = DBName
table = "T_Table_Name"

select_field = "Real_Name"
where_field = "Alias_Name"
#添加的查询条件
additional_conditions = and "DELETE_FLAG"=FALSE

由于cyrus本身不支持,登录用户名和其邮件信箱的mapping,所以不可能做到,用flyforlove登录,可以查看到asdfasdfasdfasdfasdf邮件箱的邮件。

还好,系统是不运行用户自己用客户端登录Imap server的,所以这个问题在现在的系统里不是问题。

不过还是希望能够实现,cyrus的用户名和其邮件箱的任意mapping。

抱歉!评论已关闭.