设为首页 收藏本站
查看: 1853|回复: 0

[经验分享] Postfix+Cyrus-imapd+Cyrus-sasl+PostgreSQL如何实现邮件地址变更。

[复制链接]
发表于 2016-11-21 06:44:53 | 显示全部楼层 |阅读模式
要不怎么说客户都不按照常理出牌。
还头一次听说用户可以自己修改自己的邮件地址的,也许有这样的提供商,不过反正我没有用过这样的邮件。
但是客户就是上帝,就算客户要母猪上树,我们也得给母猪训练出猴子的本领。
环境很简单就是邮件系统经常用的那几大件。

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是设置别名和真实地址的对应。
举个例子,比如邮件地址的域名为iyunv.com,那么virtual_alias_domains的设置就为

virtual_alias_domains = iyunv.com


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

query = SELECT "RealName"
FROM "User"
WHERE "AliasName"='%u'
result_format = %s@iyunv.com
domain = iyunv.com

query表示查询,这儿的%u表示邮件地址的用户名部分。
result_format表示对查询结果格式化,上面的查询结果只是一个真是的用户名,自然要格式化成真实的邮件地址格式了(从这儿可以看出,不但可以改变用户名甚至可以改变域名)。
domain表示只有完全匹配这个域名才进行查询(如果不设定domain,不但要查询前面的virtual_alias_domains所指定的主域名,还查询子域名,所以查询的次数很多)
工作原理就很简单了,当有人给一个用户的别名发送邮件时,postfix首先查询数据库并把别名修改成真是用户名,那么邮件自然就能送到正确的邮件箱了。
用户只要修改表User里的Alias字段,就能达到修改自己用户名的目的了。
到这,基本上就完成了,但是突然发现遗漏了一个地方,那就是用户登录认证的SQL也需要该,让用户可以使用别名来登录。
Cyrus-imapd的配置文件为imapd.conf
找到sasl_sql_select参数项
修改前的SQL为:

SELECT "Password" FROM "User" WHERE "RealName" = '%u'

修改后为:

SELECT "Password" FROM "User" WHERE "AliasName" = '%u'


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

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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-303076-1-1.html 上篇帖子: PostgreSQL: 如何获取一维数组的相同元素并根据相似度排序 下篇帖子: 数据库各厂商发展历史(结束, MS, PostgreSQL及其它)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表