wheezy下配置postfix mysql postfixadmin dovecot roundcube全apt安装
By admin
aptititude install postfix
选择internet 模式
填写 example.com,需要预先设置本机域名 mail.example.com
aptitude install postfixadmin
数据库选择mysql
输入mysql的root密码,然后设置postfixadmin的数据库访问密码
设置postfixadmin
设置setup密码 xxxxxxx
将更新密码生成的hash复制到 /etc/postfixadmin/config.inc.php里的
setup_password 里
新增加管理员 wangfan@example.com 密码xxxxxx
改用dovecot,不用courier
aptitude install dovecot-pop3d dovecot-imapd dovecot-mysql
postfix 的验证可以通过 sasl2-bin所生成的saslauthd来进行验证。
但是与dovecot配合时,通过dovecot来验证,所以不需要sasl2-bin
验证通过/var/spool/postfix/private/auth的socket文件来进行交互。
这是折腾了一天得到的宝贵经验。
第二天
昨天卡在了dovecot的验证上,用数据库验证总是不能通过。log里总是显示auth fail,不能得到详细的登录日志
看dovecot的doc,找到在 /conf.d/10-logging.conf里更改日志记录等级。
增加debug_log_path = /var/log/mail.debug
auth_debug = yes
然后就能在mail.debug文件中查看详细的登录时执行的查询sql。
发现sql没有捕捉到%d参数。原来在客户端用的登录名是user,而不是user@domain.com
用了完整的登录名称,总算是通过了验证。
可以发邮件之后。
不能收是个问题,总是提示status=bounced (unknown user)
需要在postfix的main.cf中加入
local_transport = dovecot
设置roundcube之后登录
用全用户名登录,如 q@domain.com
报错 Class ‘Net_IDNA2’ not found 这个问题
因为是php5-intl这个模块装了之后,php-cgi进程没有重启加载新module,重启php进程之后就好了
以上都是流水帐,以下是正经的总结。
debian wheezy 装好后
装基础包
make gcc g++
curl -L https://get.rvm.io | bash -s stable –ruby
上ruby,这个和配置mail服务器没啥关系,可以跳过。
装mail软件
nginx php5-cgi spawn-fcgi
自行配置nginx或apache什么的,这个不管了。
aptitude install postfix-mysql mysql-server dovecot-mysql dovecot-imapd dovecot-pop3d
顺带来一句,发生了ssh登录问题
之前用key登录一直没问题的主机和新主机,都出现了
Too many authentication failures for username 的问题
key-add -D没用
后来看了这个
http://superuser.com/questions/187779/too-many-authentication-failures-for-username
在.ssh/config里主机设置里得加上IdentitiesOnly yes
装postfixadmin时,输入mysql的root密码自动建立postfixadmin的库,并定义postfixadmin的密码
以下所有关于数据库的sql语句都是基于postfixadmin自动建立数据库而写的,所以一定要先建立好postfixadmin的库并设置好访问权限。
设置好postfixadmin的web访问网址,访问/setup.php
设置setup密码
添加用户之前,必须先设置好加密方式
由于dovecot升级到2.x之后,doveadm pw命令取代了原来的dovecotpw
修改/usr/share/postfixadmin/config.inc.php
以dovecot的加密方式来认证密码
$CONF[‘encrypt’] = ‘dovecot:CRAM-MD5’;
$CONF[‘dovecotpw’] = ‘/usr/bin/doveadm pw’;
修改同路径下的function.php
1244行,大概这么个位置(行位置可能随版本变化而变)
if(!$pipe) {
die(“can’t proc_open $dovecotpw”);
} else {
把$password = fread($pipes[1], “200”);这行和这行以上到else之下都注释了
添加一行
$password = `$dovecotpw ‘-s’ $method -p ‘$pw’`;
}
这要是不改的话,回头加密方式不一样,新加的用户肯定登录不上去。
phper的从业经验发挥了作用。
apt方式装phpmyadmin
添加虚拟用户,该用户所属mail用户组
useradd -g mail -u 500 vmail -d /home/vmail -m -s /bin/false
cd /etc/postfix
vi main.cf
把smtpd_tls_* 的都注释掉
先都不用tls,需要用的教程另写
改好域名信息,其他默认配置都不需要更改
myhostname = mail.example.com
myorigin = example.com
mydomain = $myorigin
mydestination = localhost, example.com, localhost.$mydomain, $mydomain
在最下增加
# virtual config
virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf
virtual_mailbox_base = /home/vmail
virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf
virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf
local_transport = dovecot
virtual_transport = dovecot
#dovecot_destination_recipient_limit = 1
virtual_minimum_uid = 500
virtual_uid_maps = static:500
virtual_gid_maps = static:8
# sasl
smtpd_sasl_auth_enable = yes
smtpd_sasl_exceptions_networks = $mynetworks
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
#smtpd_tls_cert_file = /etc/postfix/smtpd.cert
#smtpd_tls_key_file = /etc/postfix/smtpd.key
smtpd_use_tls = no
smtpd_recipient_restrictions =permit_mynetworks permit_sasl_authenticated reject_unauth_destination permit_auth_destination permit
文件 mysql_virtual_domains_maps.cf 内容如下
user = mail
password = mail
hosts = 127.0.0.1
dbname = postfixadmin
table = domain
select_field = domain
where_field = domain
additional_conditions = AND backupmx = ‘0’ AND active = ‘1’
文件 mysql_virtual_mailbox_maps.cf 内容如下
user = mail
password = mail
hosts = 127.0.0.1
dbname = postfixadmin
table = mailbox
select_field = CONCAT(domain, ‘/’, maildir)
where_field = name
additional_conditions = AND active = ‘1’
文件 mysql_virtual_alias_maps.cf 内容
user = mail
password = mail
hosts = 127.0.0.1
dbname = postfixadmin
table = alias
select_field = goto
where_field = address
additional_conditions = AND active = ‘1’
编辑 master.cf
最下加入
dovecot unix – n n – – pipe
flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -d ${recipient} -f ${sender}
每个文件里的用户名密码和库指向随配置不同自行更改。
dovecot配置
/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no
auth_mechanisms = plain
允许明文密码登录,如果是yes的话,web登录可以配置加密密码,但用foxmail等客户端的没法设置加密密码,所以为no
最下面的 !include auth-*****.conf.ext
的一堆东西
把sql 那个取消注释,其他的都注释掉。
接下来编辑 auth-sql.conf.ext
位置是 /etc/dovecot/conf.d/auth-sql.conf.ext
如果没有就创建一个,内容如下
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
然后编辑 /etc/dovecot/dovecot-sql.conf.ext
初始状态该文件应该是全都注释的
添加内容
driver = mysql
connect = host=127.0.0.1 dbname=postfixadmin user=mail password=mail
default_pass_scheme = CRAM-MD5
user_query = SELECT ‘/home/vmail/%d/%n’ AS home, ‘maildir:/home/vmail/%d/%n’ AS mail, 500 AS uid, 8 AS gid, concat(‘dirsize:storage=’, quota) AS quota FROM mailbox WHERE username = ‘%u’ AND active = ‘1’
password_query = SELECT username, password, ‘/home/vmail/%d/%n’ AS userdb_home, ‘maildir:/home/vmail/%d/%n’ AS userdb_mail, 500 AS userdb_uid, 8 AS userdb_gid, domain FROM mailbox WHERE username = ‘%u’ AND active = ‘1’
iterate_query = SELECT username, domain FROM mailbox
再回到conf.d目录,编辑 10-mail.conf
mail_location = maildir:/home/vmail/%d/%u
mail_uid = 500
mail_gid = 8
这两个id是刚才添加的vmail的uid和系统本身存在的mail用户的gid,可随配置而自行更改。
编辑 10-master.conf
找到 service auth 这个块,里面的
unix_listener auth-userdb {
mode = 0660
user = vmail
group = mail
}
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
这个postfix的更改正好配合了postfix的main.cf里的 private/auth 设置
测试邮件,几乎100%都有些问题,dove的debug在conf.d/10-logging.conf里设置
修改 debug_log_path = /var/log/mail.debug 然后查看该文件的输出
以debug方式运行时会收不到邮件,查看mail.info发现postfix不能写入mail.debug,权限不够
修改mail.debug 所属组
chown root:adm mail.debug
要多看/var/log/mail.info的输出
apt装roundcube
设置roundcube 库密码
由于是apt安装,配置文件在/etc/roundcube里
修改main.inc.php
$rcmail_config[‘default_host’] = ‘mail.example.com’
$rcmail_config[‘smtp_server’] = ‘mail.example.com’
# 以下两行不要设置,一开始看别的教程设置了,web页面不能发送邮件,总是smtp 250验证不能通过错误,其他客户端发送接受都没问题,看mail服务器的log也没问题。
# 不填写的话,会自动以smtp的用户名和密码连接smtp发送邮件。
$rcmail_config[‘smtp_user’] = ‘%u’
$rcmail_config[‘smtp_pass’] = ‘%p’
此次配置主要参考文档
http://library.linode.com/email/postfix/dovecot-mysql-debian-6-squeeze
dovecot官方文档 2版本的哦
postfix官方文档
www.postfix.org/postconf.5.html
邮箱配额
这个主要参考了
10-mail.conf
mail_plugins = $mail_plugins quota
20-imap.conf
mail_plugins = $mail_plugins imap_quota # 这个没其作用,不太清楚
90-quota.conf
plugin {
quota = maildir:User quota
quota_rule = *:storage=100M # 这行也没多大用,主要起作用的是sql里的配置。
quota_rule2 = Trash:storage=+10M # 这行的作用是给回收站增加额外的10M容量或者更多,不然的话,配额满了,会出现邮件不能删除的问题。
}
最后,还是发现最重要的一点
修改dovecot-sql.conf.ext
user_query = SELECT ‘/home/vmail/%d/%n’ AS home, ‘maildir:/home/vmail/%d/%n’ AS mail, 500 AS uid, 8 AS gid, concat(‘*:storage=’, FLOOR(quota/1048576), ‘M’) AS quota FROM mailbox WHERE username = ‘%u’ AND active = ‘1’
password_query = SELECT username, password, ‘/home/vmail/%d/%n’ AS userdb_home, ‘maildir:/home/vmail/%d/%n’ AS userdb_mail, 500 AS userdb_uid, 8 AS userdb_gid, domain, CONCAT(‘*:storage=’, FLOOR(quota/1048576), ‘M’) AS userdb_quota_rule FROM mailbox WHERE username = ‘%u’ AND active = ‘1’
password_query里的userdb_quota_rule好像是没用,在debug里没看到相应的查询。
其中的M可根据需要修改成G什么的单位,不过quota也得变更相应的除数。
还有就是除完了的数得要FLOOR,不能有小数点,要不不认。
因为用postfixadmin编辑生成的配额是按bytes为单位的。
使用postfixadmin显示并管理邮箱配额
http://wenku.baidu.com/view/2530adedaeaad1f346933fe2.html
在postfixadmin中编辑用户配额的时候,会有一个默认配额,和最大配额,这个不是在postfixadmin的配置文件里设置,是在域名清单里,编辑域名设置当前域名的最大配额和邮箱个数时编辑。
后来实际用的时候还发生了nginx不出页面的问题
http://hzcsky.blog.51cto.com/1560073/475574
看这个解决。
后续,用了几天又出新问题。抄送时,收件人是同域人时,收件人和抄送人都收不到邮件,不报错,看日志显示
Aug 22 12:59:04 mail postfix/pipe[11988]: warning: pipe flag `D’ requires dovecot_destination_recipient_limit = 1
Aug 22 12:59:04 mail postfix/pipe[11993]: 659BA446E0: to=me@example.com, relay=dovecot, delay=3416, delays=3416/0.2/0/0.07, dsn=4.3.5, status=deferred (mail system configuration error)
在postfix配置main.cf里加上
dovecot_destination_recipient_limit = 1
因为用的是dovecot配合,所以是这个,如果是配合其他的收件工具,就
xxxx_destination_recipient_limit = 1
后来在同一个postfixadmin中添加了多个域名的时候,dns指向也成功之后,新域名下的邮箱可以发邮件但不能接收,必须在main.cf中的mydestinatino 中把心域名也加上然后reload postfix