免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 38177 | 回复: 11

[Mail] POSTFIX+DOVECOT+MYSQL实现简单功能的邮局系统,使用DOVECOT来SASL和LDA [复制链接]

论坛徽章:
7
双子座
日期:2013-09-09 15:55:31CU大牛徽章
日期:2013-09-18 15:22:06CU大牛徽章
日期:2013-09-18 15:22:20CU大牛徽章
日期:2013-09-18 15:22:26CU大牛徽章
日期:2013-09-18 15:22:31CU大牛徽章
日期:2013-09-18 15:22:37CU大牛徽章
日期:2013-09-18 15:22:46
发表于 2010-05-23 16:11 |显示全部楼层
本帖最后由 milujite 于 2010-05-23 18:20 编辑

环境:CentOS 5.4,MySQL,Apache,PHP
主要是觉得用CYRUS-SASL,courier-imap,courier-authlib,maildrop太麻烦了。一大堆组件,邮件系统本来就很杂。能简单则简单,DOVECOT目前已经实现了SASL,而且DOVECOT的SASL能够自动CACHE查询结果,这个是比较棒的。并且DOVECOT可以当LDA使用。而POSTFIX也支持DOVECOT的SASL验证。
先不考虑使用源代码来编译,能用系统包的尽量使用这些包。

1、安装Postfix和Dovecot:

Dovecot直接使用系统yum去安装,而由于默认的Postfix是不支持MySQL查询的,所以需要重新编译Postfix来支持MySQL查询,这里使

用CentOS提供的src包来安装源代码,重新编译打包Postfix。

rpm -Uvh postfix-2.3.x-1.src.rpm

修改/usr/src目录下Postfix的打包文件postfix.spec,修改开头的MySQL字段为:%define MYSQL 1

重新打包Postfix:

rpmbuild -ba postfix.spec

安装完成后使用以下名来来检查Postfix是否支持MySQL查询:

postconf -m | grep mysql

并且使用以下命令来检查是否支持Dovecot的SASL验证:

postconf -a | grep dovecot


2.配置MySQL

cp /usr/share/doc/mysql-server-*/my-large.cnf /etc/my.cnf

设置MySQL默认使用UTF-8编码

[mysqld]

default-character-set = utf8

default-collation = utf8_general_ci

初始化启动数据库:

mysql_install_db --user=mysql

service mysqld start

创建Postfix查询用的数据库:

mysql> CREATE DATABASE postfix;

mysql> CREATE USER postfix@localhost IDENTIFIED BY 'postfix';

mysql> GRANT ALL PRIVILEGES ON postfix.* TO postfix;

mysql> exit

3.配置Dovecot创建虚拟邮箱目录:

mkdir -p /mail

chmod 770 /mail

增加系统用户:

useradd -r -u 101 -g mail -d /mail -s /sbin/nologin -c "Virtual mailbox" vmail

chown vmail.mail /mail

修改/etc/dovecot.conf配置文件:

  1. #ssl_cert_file = /etc/pki/dovecot/certs/myserver.example.com.crt

  2. #ssl_key_file = /etc/pki/dovecot/private/myserver.example.com.key

  3. #ssl_ca_file = /etc/pki/dovecot/certs/ca-bundle.crt

  4. #暂时不想使用SSL加密连接

  5. mail_location = maildir:/mail/%d/%u

  6. first_valid_uid = 101

  7. last_valid_uid = 101

  8. maildir_copy_with_hardlinks = yes

  9. protocol imap {

  10.   mail_plugins = quota imap_quota

  11.   imap_client_workarounds = outlook-idle delay-newmail

  12. }

  13. protocol pop3 {

  14.   mail_plugins = quota

  15.   pop3_client_workarounds = outlook-no-nuls oe-ns-eoh

  16. }

  17. protocol lda {

  18.   postmaster_address = [email]postmaster@example.com[/email]

  19.   mail_plugins = quota

  20.   #log_path = /var/log/dovecot-deliver.log

  21.   #info_log_path = /var/log/dovecot-deliver.log  #这两行可以注释掉,避免写入日志出现权限错误

  22. }

  23. auth default {

  24. # Having "login" also as a mechanism make sure outlook can use the auth smtpd as well

  25. # [url]http://wiki.dovecot.org/Authentication/Mechanisms[/url]

  26.   mechanisms = plain login

  27.   passdb sql {

  28.     args = /etc/dovecot/sql.conf

  29.   }

  30.   userdb sql {

  31.     args = /etc/dovecot/sql.conf

  32.   }

  33.   userdb prefetch {

  34.   }

  35.   user = nobody

  36.   socket listen {

  37.     master {

  38.       path = /var/run/dovecot/auth-master

  39.       mode = 0660

  40.       user = vmail

  41.       group = mail

  42.     }

  43.     client {

  44.       path = /var/spool/postfix/private/auth

  45.       mode = 0660

  46.       user = postfix

  47.       group = mail

  48.     }

  49.   }

  50. }

  51. dict {

  52. }

  53. plugin {

  54.   quota = maildir:storage=10240:messages=1000

  55.   acl = vfile:/etc/dovecot/acls

  56.   trash = /etc/dovecot/trash.conf

  57. }
复制代码
修改Dovecot的SQL连接查询文件/etc/dovecot/sql.conf:
  1. driver = mysql

  2. default_pass_scheme=MD5 #加上这行,解决Postfixadmin添加的帐号验证不正确

  3. connect = host=localhost dbname=postfix user=postfix password=postfix

  4. user_query = SELECT concat('/mail/', maildir) as home, concat('maildir:/mail/', maildir) as mail, 101 AS uid, 12 AS gid, concat('maildir:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'

  5. password_query = SELECT username as user, password, concat('/mail/', maildir) as userdb_home, concat('maildir:/mail/', maildir) as userdb_mail, 101 as userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

  6. # fast but now so nice:-)

  7. #user_query = SELECT '/var/vmail/%d/%n' as home, 'maildir:/mail/%d/%n' as mail, 101 AS uid, 12 AS gid, concat ('dirsize:storage=', quota) AS quota FROM mailbox WHERE username = '%u' AND active = '1'

  8. # Just in case you are using postfix the delimiter char "+", the above query will probably fail for the username '%

  9. n' or '%u' and result in a "5.5.1 user unknown" error

  10. #in this case, you will probalby want to use a separate user and domain part, whilst searching only for the

  11. destination user part (user_query only):

  12. # SELECT ... WHERE username = substring_index('%n','+',1) AND userrealm = '%d'

  13. password_query = SELECT username as user, password, concat('/mail/', maildir) as userdb_home, concat

  14. ('maildir:/mail/', maildir) as userdb_mail, 101 as userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'

  15. # fast but now so nice:-)

  16. #password_query = SELECT username as user, password, '/mail/%d/%n' as userdb_home, 'maildir:/mail/%d/%n' as userdb_mail, 101 as userdb_uid, 12 as userdb_gid FROM mailbox WHERE username = '%u' AND active = '1'
复制代码
修改Dovecot的Trash插件配置文件/etc/dovecot/trash.conf:
  1. 1 Spam

  2. 2 Trash
复制代码

评分

参与人数 1可用积分 +10 信誉积分 +2 收起 理由
scyzxp + 10 + 2 支持原创

查看全部评分

论坛徽章:
7
双子座
日期:2013-09-09 15:55:31CU大牛徽章
日期:2013-09-18 15:22:06CU大牛徽章
日期:2013-09-18 15:22:20CU大牛徽章
日期:2013-09-18 15:22:26CU大牛徽章
日期:2013-09-18 15:22:31CU大牛徽章
日期:2013-09-18 15:22:37CU大牛徽章
日期:2013-09-18 15:22:46
发表于 2010-05-23 16:12 |显示全部楼层
本帖最后由 milujite 于 2010-05-23 18:21 编辑

配置Postfix:

1、增加Dovecot LDA服务:

修改/etc/postfix/master.cf:
  1. # Dovecot LDA
  2. dovecot   unix  -       n       n       -       -       pipe
  3.   flags=DRhu user=vmail:mail argv=/usr/libexec/dovecot/deliver –f ${sender} -d ${recipient}
复制代码
2、修改Postfix配置文件/etc/postfix/main.cf:

  1. # --------------- local settings ------------------
  2. myhostname                      = server.example.com
  3. inet_interfaces                 = localhost, $myhostname
  4. mynetworks                      = $config_directory/mynetworks
  5. mydestination                   = localhost.$mydomain, localhost, $myhostname
  6. #uncomment if you need relay_domains... do not list domains in both relay and virtual
  7. #relay_domains                   = mysql:$config_directory/mysql_relay_domains_maps.cf
  8. # ---------------------- VIRTUAL DOMAINS START ----------------------
  9. virtual_mailbox_domains         = mysql:$config_directory/mysql_virtual_domains_maps.cf


  10. virtual_mailbox_base            = /mail
  11. virtual_mailbox_maps            = mysql:$config_directory/mysql_virtual_mailbox_maps.cf
  12. virtual_alias_maps              = mysql:$config_directory/mysql_virtual_alias_maps.cf
  13. virtual_mailbox_limit_maps      = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
  14. virtual_minimum_uid             = 101
  15. virtual_uid_maps                = static:101
  16. virtual_gid_maps                = static:12
  17. virtual_transport               = dovecot
  18. dovecot_destination_recipient_limit = 1
  19. # ---------------------- VIRTUAL DOMAINS END ----------------------
  20. # ---------------------- SASL PART START ----------------------
  21. smtpd_sasl_auth_enable          = yes
  22. #smtpd_sasl_local_domain        = $myhostname
  23. smtpd_sasl_exceptions_networks  = $mynetworks
  24. smtpd_sasl_security_options     = noanonymous
  25. broken_sasl_auth_clients        = yes
  26. smtpd_sasl_type                 = dovecot
  27. # Can be an absolute path, or relative to $queue_directory
  28. smtpd_sasl_path                 = private/auth
  29. # ---------------------- SASL PART END ----------------------
  30. # ---------------------- TLS PART START ----------------------
  31. #smtp_tls_CAfile                 = /etc/pki/tls/certs/cert.pem
  32. #smtp_tls_cert_file              = /etc/pki/tls/certs/myserver.example.com.crt
  33. #smtp_tls_key_file               = /etc/pki/tls/private/myserver.example.com.key
  34. #Postfix 2.5 or greater must use:
  35. #smtp_tls_session_cache_database = btree:$data_directory/smtp_tls_session_cache
  36. #smtp_tls_session_cache_database = btree:/var/spool/postfix/smtp_tls_session_cache
  37. #smtp_tls_security_level = may
  38. #smtpd_tls_CAfile                = /etc/pki/tls/certs/cert.pem
  39. #smtpd_tls_cert_file             = /etc/pki/tls/certs/myserver.example.com.crt
  40. #smtpd_tls_key_file              = /etc/pki/tls/private/myserver.example.com.key
  41. #Postfix 2.5 or greater must use:
  42. #smtpd_tls_session_cache_database = btree:$data_directory/smtpd_tls_session_cache
  43. #smtpd_tls_session_cache_database = btree:/var/spool/postfix/smtpd_tls_session_cache
  44. #smtpd_tls_dh1024_param_file     = $config_directory/dh_1024.pem
  45. #smtpd_tls_dh512_param_file      = $config_directory/dh_512.pem
  46. #smtpd_tls_security_level        = may
  47. #smtpd_tls_received_header       = yes
  48. #smtpd_tls_ask_ccert             = yes
  49. #smtpd_tls_loglevel              = 1
  50. #tls_random_source               = dev:/dev/urandom
  51. # ---------------------- TLS PART END ----------------------
  52. smtpd_helo_required             = yes
  53. disable_vrfy_command            = yes
  54. non_fqdn_reject_code            = 450
  55. invalid_hostname_reject_code    = 450
  56. maps_rbl_reject_code            = 450
  57. #unverified_sender_reject_code  = 550
  58. #header_checks                  = pcre:$config_directory/header_checks
  59. #body_checks                    = pcre:$config_directory/body_checks
  60. #warning: the restrictions reject_unknown_(sender|recipient)_domain
  61. #will trigger if your DNS becomes unavailable
  62. smtpd_recipient_restrictions =
  63.         permit_mynetworks
  64.         permit_sasl_authenticated
  65.         reject_unauth_destination
  66.         reject_invalid_helo_hostname
  67.         warn_if_reject reject_non_fqdn_helo_hostname
  68.         warn_if_reject reject_unknown_helo_hostname
  69.         warn_if_reject reject_unknown_client
  70.         reject_non_fqdn_sender
  71.         reject_non_fqdn_recipient
  72.         reject_unknown_sender_domain
  73.         reject_unknown_recipient_domain
  74.         reject_rbl_client zen.spamhaus.org
  75.         reject_rbl_client bl.spamcop.net
  76.         permit
  77. smtpd_data_restrictions =
  78.         reject_unauth_pipelining,
  79.         reject_multi_recipient_bounce,
  80.         permit
复制代码
3、增加MySQL查询表:

/etc/postfix/mysql_virtual_alias_maps.cf:
  1. user            = postfix
  2. password        = postfix
  3. hosts           = localhost
  4. dbname          = postfix
  5. query           = SELECT goto FROM alias WHERE address='%s' AND active = '1'
复制代码
/etc/postfix/mysql_virtual_domains_maps.cf:
  1. user            = postfix
  2. password        = postfix
  3. hosts           = localhost
  4. dbname          = postfix
  5. #query          = SELECT domain FROM domain WHERE domain='%s'
  6. #optional query to use when relaying for backup MX
  7. query           = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
复制代码
/etc/postfix/mysql_relay_domains_maps.cf:
  1. user            = postfix
  2. password        = postfix
  3. hosts           = localhost
  4. dbname          = postfix
  5. #query          = SELECT domain FROM domain WHERE domain='%s'
  6. #optional query to use when relaying for backup MX
  7. query           = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'
复制代码
/etc/postfix/mysql_relay_domains_maps.cf:
  1. user            = postfix
  2. password        = postfix
  3. hosts           = localhost
  4. dbname          = postfix
  5. query           = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
复制代码
/etc/postfix/mysql_virtual_mailbox_limit_maps.cf:
  1. user            = postfix
  2. password        = postfix
  3. hosts           = localhost
  4. dbname          = postfix
  5. query           = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'
复制代码
/etc/postfix/mysql_virtual_mailbox_maps.cf:
  1. user            = postfix
  2. password        = postfix
  3. hosts           = localhost
  4. dbname          = postfix
  5. query           = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1'
复制代码
/etc/postfix/mynetworks:
  1. 192.168.0.250 #替换成自己服务器IP

  2. 127.0.0.0/8
复制代码

论坛徽章:
7
双子座
日期:2013-09-09 15:55:31CU大牛徽章
日期:2013-09-18 15:22:06CU大牛徽章
日期:2013-09-18 15:22:20CU大牛徽章
日期:2013-09-18 15:22:26CU大牛徽章
日期:2013-09-18 15:22:31CU大牛徽章
日期:2013-09-18 15:22:37CU大牛徽章
日期:2013-09-18 15:22:46
发表于 2010-05-23 16:12 |显示全部楼层
本帖最后由 milujite 于 2010-05-23 18:22 编辑

安装配置Postfixadmin

修改Postfixadmin的配置文件config.inc.php:
  1. $CONF['configured'] = true;

  2. $CONF['setup_password'] = 'changeme';

  3. //访问setup.php页面计算setup_password的Hash值,填到这里。

  4. $CONF['default_language'] = 'en';

  5. //语言环境,locale文件在postfixadmin的languages目录下,改为自己想要的语言环境。


  6. $CONF['database_type'] = 'mysqli';

  7. //mysqli = MySQL 4.1+,4.1以上版本的mysql要改为mysqli

  8. $CONF['database_host'] = 'localhost';

  9. $CONF['database_user'] = 'postfix';

  10. $CONF['database_password'] = 'postfix';

  11. $CONF['database_name'] = 'postfix';

  12. $CONF['database_prefix'] = '';

  13. $CONF['admin_email'] = 'postmaster@change-this-to-your.domain.tld';

  14. //设置为邮局管理员

  15. $CONF['min_password_length'] = 5;

  16. //密码长度,可以改长些,8位以上吧

  17. $CONF['default_aliases'] = array (

  18. //定义系统邮箱的别名,可以把杂七杂八的管理用邮箱统一到一个中去

  19. 'abuse' => 'abuse@change-this-to-your.domain.tld',

  20. 'hostmaster' => 'hostmaster@change-this-to-your.domain.tld',

  21. 'postmaster' => 'postmaster@change-this-to-your.domain.tld',

  22. 'webmaster' => 'webmaster@change-this-to-your.domain.tld'

  23. );

  24. //使用/mail/domain/user这种格式的目录

  25. $CONF['domain_path'] = 'NO';  //改为YES,效果如下说明

  26. //   YES: /usr/local/virtual/domain.tld/username@domain.tld

  27. //   NO:  /usr/local/virtual/username@domain.tld

  28. $CONF['domain_in_mailbox'] = 'YES';   //改为NO,效果如下说明

  29. //   YES: /usr/local/virtual/domain.tld/username@domain.tld

  30. //   NO:  /usr/local/virtual/domain.tld/username

  31. //新建邮局的默认参数,第一个是别名数,第二个是邮箱数,第三个是限额,以MB为单位

  32. $CONF['aliases'] = '10';

  33. $CONF['mailboxes'] = '10';

  34. $CONF['maxquota'] = '10';
复制代码
Webmail安装配置比较容易就不介绍了。

Dovecot目前已经自带SASL了,而且可以当LDA使用,而且Dovecot可以自动cache查询的结果,所以只要使用Postfix+Dovecot+MySQL就可以基本上实现Postfix+Cyrus-SASL+Courier-IMAP+Courier-authlib+Memcached和MySQL的功能。目前只是照着官方的HOWTO文档,用Dovecot的SASL和LDA功能来配置邮局。下一步会考虑如何修改他们代码包的spec文件,精简掉不需要的模块。以及在这基础上加入amavis,spamassassin,clamv等反垃圾引擎。

有问题欢迎拍砖,本人菜鸟一个~学习学习

参考文档:http://wiki.dovecot.org/HowTo/DovecotLDAPostfixAdminMySQL

我的BLOG:www.cntux.org大家多多支持。谢谢

论坛徽章:
7
双子座
日期:2013-09-09 15:55:31CU大牛徽章
日期:2013-09-18 15:22:06CU大牛徽章
日期:2013-09-18 15:22:20CU大牛徽章
日期:2013-09-18 15:22:26CU大牛徽章
日期:2013-09-18 15:22:31CU大牛徽章
日期:2013-09-18 15:22:37CU大牛徽章
日期:2013-09-18 15:22:46
发表于 2010-05-23 16:33 |显示全部楼层
补上几个CACHE的调优选项:
auth_cache_size   #cache的大小,设置为0则关闭cache,具体设置多大还需要参考自己的环境,内存大的就设置大点吧。反正也占不了多少内存。官方文档的设置才几十到几百个byte。
auth_cache_ttl  #cache的TTL,以秒为单位,邮局系统一般很少更新数据,最多更改的就是密码了。可以设置长些。
auth_cache_negative_ttl   #要求DOVECOT版本为1.1以上,当验证过程没查询到任何东西的时候,也cache这次查询。

cache的淘汰策略大家可以翻
http://wiki.dovecot.org/Authentication/Caching

另请教如何关闭论坛的表情,文章内容都被替换为表情了

论坛徽章:
0
发表于 2010-05-23 18:03 |显示全部楼层
支持原创!


另请教如何关闭论坛的表情,文章内容都被替换为表情了


在发帖时候将配置文件或者代码部分以代码形式插入就不会有表情符号了,工具栏的倒数第三个就是。

论坛徽章:
7
双子座
日期:2013-09-09 15:55:31CU大牛徽章
日期:2013-09-18 15:22:06CU大牛徽章
日期:2013-09-18 15:22:20CU大牛徽章
日期:2013-09-18 15:22:26CU大牛徽章
日期:2013-09-18 15:22:31CU大牛徽章
日期:2013-09-18 15:22:37CU大牛徽章
日期:2013-09-18 15:22:46
发表于 2010-05-23 18:25 |显示全部楼层
本帖最后由 milujite 于 2010-05-23 18:28 编辑
支持原创!




在发帖时候将配置文件或者代码部分以代码形式插入就不会有表情符号了,工具栏的倒数第 ...
zlj2208 发表于 2010-05-23 18:03



    用CODE标记,OK了。常年论坛不发帖的后果。
    其实不算原创,参考那篇HOWTO自己折腾了一遍,解决了些小问题。主要是想让大家知道其实Dovecot目前也能SASL和LDA,多一些选择。看了些官方文档才发现,英语才是搞技术最需要的。

论坛徽章:
0
发表于 2010-05-24 15:45 |显示全部楼层
centos+ postfix + Dovecot 是黄金搭档,配置简单,易上手,便于推广!

论坛徽章:
8
综合交流区版块每周发帖之星
日期:2015-12-02 15:03:53数据库技术版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-10-02 06:20:00IT运维版块每日发帖之星
日期:2015-09-14 06:20:00金牛座
日期:2014-10-10 11:23:34CU十二周年纪念徽章
日期:2013-10-24 15:41:34酉鸡
日期:2013-10-19 10:17:1315-16赛季CBA联赛之北京
日期:2017-03-06 15:12:44
发表于 2010-05-24 16:53 |显示全部楼层
centos+ postfix + Dovecot 是黄金搭档,配置简单,易上手,便于推广!
大麻 发表于 2010-05-24 15:45



    确实

论坛徽章:
0
发表于 2010-06-10 10:18 |显示全部楼层
非常好的文章

论坛徽章:
0
发表于 2011-11-09 18:42 |显示全部楼层
您好,原创的东西支持

另请教一下,

我配dovecot的lda,一直不成功, 不知道什么地方配置错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP