你好,游客 登录 注册 搜索
背景:
阅读新闻

权威指南:构建个人私有云,拿回你的数据隐私的控制权!

[日期:2015-03-26] 来源:Linux中国  作者:Linux [字体: ]

设置postfix和dovecot来收发电子邮件

 

postfix

  1. apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-mysql mysql-server dovecot-lmtpd postgrey

Postfix的配置菜单里,选择Internet Site,设置这个系统的邮件名称为linuxidc.net

现在开始添加一个数据库用于保存主机上管理的域名列表,和每个域名下的用户列表(同时也包括他们各自的密码),以及邮件别名列表(用于从一个地址往另一个地址转发邮件)。

  1. mysqladmin -p create mailserver
  2. mysql -p mailserver
  3. mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'localhost' IDENTIFIED BY 'mailuserpass';
  4. mysql> FLUSH PRIVILEGES;
  5. mysql> CREATE TABLE `virtual_domains`(
  6. `id`int(11) NOT NULL auto_increment,
  7. `name` varchar(50) NOT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  10. mysql> CREATE TABLE `virtual_users`(
  11. `id`int(11) NOT NULL auto_increment,
  12. `domain_id`int(11) NOT NULL,
  13. `password` varchar(106) NOT NULL,
  14. `email` varchar(100) NOT NULL,
  15. PRIMARY KEY (`id`),
  16. UNIQUE KEY `email`(`email`),
  17. FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  18. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  19. mysql> CREATE TABLE `virtual_aliases`(
  20. `id`int(11) NOT NULL auto_increment,
  21. `domain_id`int(11) NOT NULL,
  22. `source` varchar(100) NOT NULL,
  23. `destination` varchar(100) NOT NULL,
  24. PRIMARY KEY (`id`),
  25. FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE
  26. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里我们为linuxidc.net域名提供邮件服务。如果还需要加入其他域名,也没问题。我们也会为每个域名设置一个邮件管理地址(postmaster),转寄给roudy@linuxidc.net

  1. mysql> INSERT INTO virtual_domains (`name`) VALUES ('linuxidc.net');
  2. mysql> INSERT INTO virtual_domains (`name`) VALUES ('otherdomain.net');
  3. mysql> INSERT INTO virtual_aliases (`domain_id`,`source`,`destination`) VALUES ('1','postmaster','roudy@linuxidc.net');
  4. mysql> INSERT INTO virtual_aliases (`domain_id`,`source`,`destination`) VALUES ('2','postmaster','roudy@linuxidc.net');

现在已经添加了一个本地邮件账号roudy@linuxidc.net。首先,为它生成一个密码的哈希串:

  1. doveadm pw -s SHA512-CRYPT

然后把哈希值加入到数据库中:

  1. mysql> INSERT INTO `mailserver`.`virtual_users`(`domain_id`,`password`,`email`) VALUES ('1','$6$YOURPASSWORDHASH','roudy@linuxidc.net');

现在我们的域名、别名和用户列表都设置好了,然后开始设置postfix(这是一个SMTP服务器,用来发送邮件)。把文件/etc/postfix/main.cf替换为下面的内容:

  1. myhostname = cloud.linuxidc.net
  2. myorigin =/etc/mailname
  3. mydestination = localhost.localdomain, localhost
  4. mynetworks_style = host
  5. # We disable relaying in the general case
  6. smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
  7. # Requirements on servers that contact us: we verify the client is not a
  8. # known spammer (reject_rbl_client) and use a graylist mechanism
  9. # (postgrey) to help reducing spam (check_policy_service)
  10. smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023
  11. disable_vrfy_command = yes
  12. inet_interfaces = all
  13. smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
  14. biff =no
  15. append_dot_mydomain =no
  16. readme_directory =no
  17. # TLS parameters
  18. smtpd_tls_cert_file=/etc/ssl/certs/cloud.crt
  19. smtpd_tls_key_file=/etc/ssl/private/cloud.key
  20. smtpd_use_tls=yes
  21. smtpd_tls_auth_only = yes
  22. smtp_tls_security_level=may
  23. smtp_tls_loglevel =1
  24. smtpd_tls_loglevel =1
  25. smtpd_tls_received_header = yes
  26. smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
  27. smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
  28. # Delivery
  29. alias_maps = hash:/etc/aliases
  30. alias_database = hash:/etc/aliases
  31. message_size_limit =50000000
  32. recipient_delimiter =+
  33. # The next lines are useful to set up a backup MX for myfriendsdomain.org
  34. # relay_domains = myfriendsdomain.org
  35. # relay_recipient_maps =
  36. # Virtual domains
  37. virtual_transport = lmtp:unix:private/dovecot-lmtp
  38. virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  39. virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  40. virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  41. local_recipient_maps = $virtual_mailbox_maps

现在我们要让postfix知道如何从我们设定的数据库里找出需要接收邮件的域名。建立一个新文件/etc/postfix/mysql-virtual-mailbox-domains.cf并添加以下内容:

  1. user = mailuser
  2. password = mailuserpass
  3. hosts =127.0.0.1
  4. dbname = mailserver
  5. query = SELECT 1 FROM virtual_domains WHERE name='%s'

我们可以让postfix判断给定的电子邮件账号是否存在,创建文件/etc/postfix/mysql-virtual-mailbox-maps.cf并写入以下内容:

  1. user = mailuser
  2. password = mailuserpass
  3. hosts =127.0.0.1
  4. dbname = mailserver
  5. query = SELECT 1 FROM virtual_users WHERE email='%s'

最后,postfix会根据文件/etc/postfix/mysql-virtual-alias-maps.cf的内容来查找邮件别名

  1. user = mailuser
  2. password = mailuserpass
  3. hosts =127.0.0.1
  4. dbname = mailserver
  5. query = SELECT virtual_aliases.destination as destination FROM virtual_aliases, virtual_domains WHERE virtual_aliases.source='%u' AND virtual_aliases.domain_id = virtual_domains.id AND virtual_domains.name='%d'

在配置好这些后,现在要测试一下postfix是否能正常查询数据库。我们可以用postmap命令测试:

  1. postmap -q linuxidc.net mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
  2. postmap -q roudy@linuxidc.net mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
  3. postmap -q postmaster@linuxidc.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf
  4. postmap -q bob@linuxidc.net mysql:/etc/postfix/mysql-virtual-alias-maps.cf

如果一切都正常配置了的话,头两个查询应该输出1,第3个查询应该输出roudy@linuxidc.net,而最后一个应该什么都不输出。

linux
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款