`
weiqingfei
  • 浏览: 318092 次
  • 性别: Icon_minigender_1
  • 来自: 黑洞
社区版块
存档分类
最新评论

Postfix+Cyrus-imapd+Cyrus-sasl+PostgreSQL如何实现邮件地址变更。

阅读更多
要不怎么说客户都不按照常理出牌。
还头一次听说用户可以自己修改自己的邮件地址的,也许有这样的提供商,不过反正我没有用过这样的邮件。
但是客户就是上帝,就算客户要母猪上树,我们也得给母猪训练出猴子的本领。

环境很简单就是邮件系统经常用的那几大件。
1.Postfix,邮件传送代理
2.Cyrus-imapd,Imap邮件服务器
3.Cyrus-sasl,简单认证安全层
4.PostgreSQL,数据库服务器(好像用MySQL的更多一些)


Cyrus-sasl和PostgreSQL就不用讲了,认证途径使用Cyrus-sasl的auxprop认证模式和sql插件。用户的用户名和密码信息存放在PostgreSQL中。

主要需要考虑的是Cyrus-imapd和Postfix
之所以说这个问题不容易解决是因为cyrus-impad的一个特性,那就是用户的登录用户名必须和存放用户邮件的邮件目录名一样!!!
这就决定着,如果要想修改用户登录名,就必须同时修改邮件目录名,但是这又是cyrus-imapd所禁止的!
问过一些专门的系统管理员,他们一般不会普遍遇到用户需要修改用户名的情况,如果出现个别情况,他们的做法是写个perl脚本,以修改后所用用户名新建一个信箱,然后把原来信箱的所有目录以及邮件都转移到新的信箱内,然后再删除新信箱。
好家伙,这个工程量可真够大的,我们的项目是允许用户自己来修改自己的用户名,我可不敢保证修改用户名的人是个别的。

看来这个方法也必须放弃了,那就只能拿postfix开刀了。

postfix作为邮件传送代理,只负责传送邮件,但是仔细研究一下它的工作流程,发现在传送邮件的过程中可以对邮件做一些改动,包括邮件信封,以及邮件head和body。
既然这样就好办了,既然可以改变邮件信封,也就是说可以改变邮件目的地地址,也就是说虽然我们无法改变用户的最终地址,但是可以变通的把送往别名地址的邮件转到这个地址里,那么当用户修改自己的邮件地址时,其实只是修改的别名。

postfix的配置文件是main.cf,实现这个功能的几个关键参数是:
virtual_alias_domains
virtual_alias_maps

virtual_alias_domains指定发往哪个域名的邮件需要设置别名,virtual_alias_maps是设置别名和真实地址的对应。

举个例子,比如邮件地址的域名为iteye.com,那么virtual_alias_domains的设置就为
virtual_alias_domains = iteye.com


数据库里面有个User表存放用户的真是地址(RealName),别名地址(AliasName)和密码(Password)等其它信息。
那么就可以信件一个映射文件pgsql-virtual-alias.cf,内容为:
query = SELECT "RealName"
  FROM "User"
  WHERE "AliasName"='%u'

result_format = %s@iteye.com
domain = iteye.com

query表示查询,这儿的%u表示邮件地址的用户名部分。
result_format表示对查询结果格式化,上面的查询结果只是一个真是的用户名,自然要格式化成真实的邮件地址格式了(从这儿可以看出,不但可以改变用户名甚至可以改变域名)。
domain表示只有完全匹配这个域名才进行查询(如果不设定domain,不但要查询前面的virtual_alias_domains所指定的主域名,还查询子域名,所以查询的次数很多)

工作原理就很简单了,当有人给一个用户的别名发送邮件时,postfix首先查询数据库并把别名修改成真是用户名,那么邮件自然就能送到正确的邮件箱了。
用户只要修改表User里的Alias字段,就能达到修改自己用户名的目的了。

[i]到这,基本上就完成了,但是突然发现遗漏了一个地方,那就是用户登录认证的SQL也需要该,让用户可以使用别名来登录。
Cyrus-imapd的配置文件为imapd.conf
找到sasl_sql_select参数项
修改前的SQL为:
SELECT "Password" FROM "User" WHERE "RealName" = '%u'

修改后为:
SELECT "Password" FROM "User" WHERE "AliasName" = '%u'


这样,用户可自己修改邮件用户名的功能就实现了。[/i]

由于用户名和邮箱地址必须是一致的,这个功能暂时实现帮不了。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics