金融AIGC研究
优质  高效     
优质的技术交付服务 迅捷的办事效率
我们专注品质与服务   决胜制高点  细节决定成败
Runoff commanding heights Detail decides success or failure
The commanding heights of
the details determine success or failure
技术动态
DETAIL
[技术升级]dovecot postfix mysql 架构赏析
来源: | 作者:business-101 | 发布时间: 2014-09-01 | 961 次浏览 | 分享到:

https://darkin.cn/archives/564/




CREATE DATABASE mailserver;

GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass';

FLUSH PRIVILEGES;

USE mailserver;

 


CREATE TABLE `virtual_domains` (

  `id` int(11) NOT NULL auto_increment,

  `name` varchar(50) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 


CREATE TABLE `virtual_users` (

  `id` int(11) NOT NULL auto_increment,

  `domain_id` int(11) NOT NULL,

  `password` varchar(106) NOT NULL,

  `email` varchar(100) NOT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `email` (`email`),

  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 


CREATE TABLE `virtual_aliases` (

  `id` int(11) NOT NULL auto_increment,

  `domain_id` int(11) NOT NULL,

  `source` varchar(100) NOT NULL,

  `destination` varchar(100) NOT NULL,

  PRIMARY KEY (`id`),

  FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 


INSERT INTO `mailserver`.`virtual_domains`

  (`name`)

VALUES

  ('haiyun.me');

INSERT INTO `mailserver`.`virtual_users`

  (`domain_id`, `password` , `email`)

VALUES

  ('1', ENCRYPT('password', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'user@haiyun.me');

INSERT INTO `mailserver`.`virtual_aliases`

  (`domain_id`, `source`, `destination`)

VALUES

  ('1', 'alias@haiyun.me', 'user@haiyun.me');




virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf

virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

#使用dovecot lmtp交付虚拟域邮件,省却postfix配置用户邮件目录及权限问题

virtual_transport = lmtp:unix:private/dovecot-lmtp 

#使用dovecot验证,后面dovecot配置

smtpd_sasl_type = dovecot

smtpd_sasl_path = private/auth

smtpd_sasl_auth_enable = yes

 

smtpd_recipient_restrictions =

        permit_sasl_authenticated,

        permit_mynetworks,

        reject_unauth_destination


一。域:

user = mailuser

password = mailuserpass

hosts = 127.0.0.1

dbname = mailserver

query = SELECT 1 FROM virtual_domains WHERE name='%s'


二。用户

user = mailuser

password = mailuserpass

hosts = 127.0.0.1

dbname = mailserver

query = SELECT 1 FROM virtual_users WHERE email='%s'

三。群组

user = mailuser

password = mailuserpass

hosts = 127.0.0.1

dbname = mailserver

query = SELECT destination FROM virtual_aliases WHERE source='%s'



10-mail_location, authentication mechanism:

mail_location = maildir:/var/mail/vhosts/%d/%n

 

/etc/dovecot/conf.d/10-auth.conf

auth_verbose = yes  # 认证详细日志  

auth_debug = yes    # 认证debug

disable_plaintext_auth = no #开启明文验证

auth_mechanisms = plain login #支持验证方法

#!include auth-system.conf.ext #取消默认系统验证

!include auth-sql.conf.ext #使用mysql验证

userDB static: 

/etc/dovecot/conf.d/auth-sql.conf.ext


#用户验证

passdb {

  driver = sql

  args = /etc/dovecot/dovecot-sql.conf.ext

}

#用户邮箱目录 %d为domain,%n为user

userdb {

  driver = static

  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n

}


mysql connection string: 


/etc/dovecot/dovecot-sql.conf.ext


driver = mysql

connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass

default_pass_scheme = SHA512-CRYPT

password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';


/etc/dovecot/conf.d/10-master.conf


#lmtp服务,postfix通过lmtp交付邮件

service lmtp {

 unix_listener /var/spool/postfix/private/dovecot-lmtp {

   mode = 0600

   user = postfix

   group = postfix

  }

}

#验证服务,postfix也通过此验证用户

service auth {

  unix_listener /var/spool/postfix/private/auth {

    mode = 0666

    user = postfix

    group = postfix

  }

  unix_listener auth-userdb {

    mode = 0600

    user = vmail

    #group =

  }

  user = dovecot

}

service auth-worker {

  user = vmail

}

添加系统账户

useradd -M -u 5000 vmail -d /var/mail -s /sbin/nologin