自己有域名的话,就可以搭建自己的邮件服务器。当然,一般来说,许多人或者公司都会把邮件服务通过smtp代理解析的形式挂靠在163,126,网易,腾讯企业邮箱的服务器上,自己只需提供域名即可使用邮件服务.这样通常邮件收发的稳定性和一些功能,如账号管理,附件上传缓存等服务都有比较大的优势,缺点也很明显,可以使用的免费的邮箱账号通常很少,不超过50个,如果想要开设更多账号,则需要交纳一定费用
此教程在于搭建一个多域名隔离,虚拟用户的邮箱系统。
网上许多教程都说只搭建postfix和dovecot即可,但是事实上,如果只使用默认的postfix,dovecot的配置,是极其不方便的,一方面,邮箱用户严格和linux下的用户挂钩,想多创建用户,则需要不停的新建linux用户,维护成本极高,而且,用户和所有email域名关联,假如解析了2个mx域名到同一个服务器,则一个用户等于同时拥有2个域名的邮箱,且内部的存储空间共享,会导致邮件混作一团,不能有效区分隔离。
不多说,进入正题:
先安装lamp环境 sudo apt-get install php7.2 mysql apache2 libapache2-mod-php7(支持apache解析php的模块)
sudo service start apache2 mysql 启动apache,mysql(apache,mysql本地初始化配置自行百度)
sudo apt-get install postfix postfix-mysql dovecot-pop3d dovecot-imapd dovecot-mysql dovecot-core 安装postfix, dovecot
注意 postfix会让你选择邮件服务的类型,选择 internet site
说明:
No configuration 表示不要做任何配置;
Internet Site 表示直接使用本地SMTP服务器发送和接收邮件;
Internet with smarthost 表示使用本地SMTP服务器接收邮件,但发送邮件时不直接使用本地SMTP服务器,而是使用第三方smart host来转发邮件;
Local only 表示邮件只能在本机用户之间发送和接收。
一般ubuntu下可能会默认以sendmail作为邮件发送的内置服务,我们要用postfix代替它
netstat -tunlp | grep 25 查看25端口是否被sendmail占用,如果是,则kill掉,然后
sudo service start postfix ,dovecot分别启动postfix(占用25端口,用来发邮件),dovecot(占用110端口,用来收邮件)
安装 postfixadmin web管理工具
wget http://nchc.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.93/postfixadmin-2.93.tar.gz
解压
tar -zxvf postfixadmin-2.93.tar.gz
然后移到
mv postfixadmin-2.93 /var/www/postfixadmin
配置apache
vim /etc/apache2/sites-enabled/000-default.conf
<VirtualHost *>
ServerName postfix.你的域名
ServerAlias postfix.你的域名
DocumentRoot /var/www/postfixadmin/
Alias / /var/www/postfixadmin/
<Directory "/var/www/postfixadmin/">
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php
Require all granted
</Directory>
ErrorLog /data/logs/apache/postfix.你的域名-error_log
</VirtualHost>
cd /var/www/postfixadmin/
vim config.inc.php 编辑
$CONF['configured'] = true; //已配置 $CONF['default_language'] = 'cn'; //语言 $CONF['database_type'] = 'mysql'; //数据库类型 $CONF['database_host'] = 'localhost'; //数据库地址 $CONF['database_user'] = 'postfix'; //数据库用户 $CONF['database_password'] = 'postfix'; //数据库密码 $CONF['database_name'] = 'postfix'; //数据表名 $CONF['encrypt'] = 'dovecot:CRAM-MD5'; //邮箱密码加密方式 $CONF['dovecotpw'] = "/usr/bin/doveadm pw"; //加密脚本路径 $CONF['domain_path'] = 'YES'; //域名路径 $CONF['domain_in_mailbox'] = 'NO'; $CONF['aliases'] = '1000'; // 别名数 $CONF['mailboxes'] = '1000'; // 邮箱数 $CONF['maxquota'] = '1000'; // 最大邮件空间容量 $CONF['fetchmail'] = 'NO'; $CONF['quota'] = 'YES'; $CONF['used_quotas'] = 'YES'; $CONF['new_quota_table'] = 'YES';
:wq 保存
mkdir templates_c # 创建缓存目录 chown -R apache:apache templates_c 如果有了,则忽略此步骤
sudo service apache2 restart 重启apache
然后chrome访问 postfix.你的域名/setup 进入初始化安装目录
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160133175-777220720-1024x529.png)
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160146133-302204375.png)
如果出错了,请查看apache error log,排查问题原因,如权限,配置问题
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160200195-1471351647.png)
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160222487-609032788.png)
添加域名
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160243944-1803015005-1.png)
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160257323-552055053.png)
添加邮箱地址
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160309730-234785477-1024x679.png)
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160335312-487778904.png)
![](https://blogs.guomaoye.com/wp-content/uploads/2021/03/1641240-20190727160345816-1739841425.png)
到这里,postfix admin就配置好了
注意: 以上创建域 和 用户 等 其实都是存储在数据库当中,并非真是存在的用户。 所以我们需要通过配置postfix 和 dovecot 通过读取数据库中的信息来完成配置。
由于dns解析我直接使用的阿里云,则无需搭建dns域名解析服务器。配置一个a 记录来解析 mail 前缀到你的服务器ip,然后配置一个mx记录解析到 mail.你的域名 即可,不懂可以自行百度
配置postfix
必须要有一个linux用户来作为邮件用户,且uid,gid 必须大于等于1000.
- groupadd -o -g 1000 vmail
- useradd -r -u 1000 -g 1000 -d /var/spool/mail/vmail -c “Virtual mail user” vmail
配置/etc/postfix/main.cf
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
mail_owner = postfix
# 配置主机名等信息
myhostname = mail.你的域名
mydomain = 你的域名
myorigin = $mydomain
# 配置监听端口
inet_interfaces = all
inet_protocols = ipv4
# 配置接受的域列表。 注意这里绝对不能添加与虚拟域相同的域名。否则会导致邮件无法发送。
# mydestination = $myhostname, localhost.$mydomain, localhost 这个需要注释掉,否则无法支持虚拟用户
unknown_local_recipient_reject_code = 550 # 拦截邮件的返回状态码
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
home_mailbox = Maildir/
smtpd_banner = $myhostname ESMTP $mail_name
debug_peer_level = 2
debugger_command =
PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
ddd $daemon_directory/$process_name $process_id & sleep 5
sendmail_path = /usr/sbin/sendmail.postfix
newaliases_path = /usr/bin/newaliases.postfix
mailq_path = /usr/bin/mailq.postfix
setgid_group = postdrop
html_directory = no
manpage_directory = /usr/share/man
sample_directory = /usr/share/doc/postfix-2.10.1/samples
readme_directory = /usr/share/doc/postfix-2.10.1/README_FILES
# 以下是虚拟用户配置
# 设置postfix 读取和写入是的uid 和 gid
virtual_gid_maps = static:1000
virtual_uid_maps = static:1000
# 虚拟域, 这里配置通过mysql来实现。 这里指定的文件 后面就会创建
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
# 虚拟域中,的别名设置
virtual_alias_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
# 虚拟域中,用户邮箱设置
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
# 设置基本路径。 上面查询到的邮箱地址是相对的。所以需要设置基本路径来确认邮箱位置。
virtual_mailbox_base = /var/mail/vmail
# 以上的这些虚拟化配置其实还可以简化为如下。同样可以使用,但是缺少了别名的功能
#virtual_gid_maps = static:1000
#virtual_uid_maps = static:1000
#virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
#virtual_mailbox_maps = proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf
#virtual_mailbox_base = /var/mail/vmail
# 用户认证配置。 smtp 可以不用设置用户认证。也能使用
# 拒绝非正常的客户端
broken_sasl_auth_clients = yes
# 启用sasl认证
smtpd_sasl_auth_enable = yes
# 配置认证方式为dovecot
smtpd_sasl_type = dovecot
# 配置认证套接字的相对路径
smtpd_sasl_path = private/auth
# 配置拒绝规则
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_unknown_sender_domain
# permit_mynetworks 允许本地网络发送邮件
# permit_sasl_authenticated 允许通过认证的用户发送邮件
# reject_unauth_destination 拒绝不是发往本地的邮件
# reject_unknown_sender_domain 拒绝未知发件域名
然后我们通过postfixadmin提供的脚本生成以上虚拟域所需要的文件
切换到postfix的安装目录,执行如下命令
sudo -s
/bin/bash -c ‘bash POSTFIX_CONF.txt’
会有提示 输入信息,如数据库,用户名,密码,输入后会生成配置文件,在/tmp/下 ,如/tmp/postfixadmin-D4SIxG
将配置文件拷贝到postfix安装目录下
mkdir -p /etc/postfix/sql
cp /tm/postfixadmin-D4SIxG/* /etc/postfix/sql/
配置dovecot
postfixadmin 也提供了的 dovecot的配置方法:DOCUMENTS/DOVECOT.txt 如果我的配置没有看懂可以选择查看
先配置第一个文件dovecot.conf
protocols = pop3 imap # 开启pop3 和 imap 服务
listen = * # 监听ipv4端口
然后配置第二个文件conf.d/10-auth.conf
disable_plaintext_auth = no # 设置关闭强制加密认证
auth_mechanisms = plain login # 设置认证方法
#!include auth-system.conf.ext # 注释使用auth-system的认证方式
!include auth-sql.conf.ext # 使用auth-sql的认证方式
配置第三个文件conf.d/10-mail.conf
mail_location = maildir:/var/mail/vmail/%d/%n # 设置邮箱格式
first_valid_uid = 2000 # 设置读取和写入的uid 下面使gid
first_valid_gid = 2000
配置第三个文件conf.d/10-ssl.conf
ssl = no # 取消ssl加密 注释下面内容
#ssl_cert = #ssl_key = 配置第四个文件conf.d/10-master.conf
unix_listener /var/spool/postfix/private/auth { # 为postfix 提供认证服务套接字
mode = 0666 # 设置权限
user = postfix # 设置属主
group = postfix # 设置属组
}
配置第五个文件dovecot-sql.conf.ext
driver = mysql # 设置驱动为mysql
default_pass_scheme = MD5-CRYPT # 设置加密方法为MD5
connect = host=localhost dbname=postfix user=postfix password=postfixadmin # 设置连接参数
password_query = SELECT username AS user,password FROM mailbox WHERE username = ‘%u’ AND active=’1′ # 设置查询密码的sql语句
user_query = SELECT CONCAT(‘/var/mail/vmail/’, maildir) AS home, 1000 AS uid, 1000 AS gid, CONCAT(‘*:bytes=’, quota) AS quota_rule FROM mailbox WHERE username = ‘%u’ AND active=’1′ # 设置查询用户和邮箱的sql语句
重启postfix,dovecot,如果没成功,则sudo tail -f /var/log/mail.err mail.log 查看报错信息。排除错误即可
常见的错误:
1, /etc/postfix/mian.cf 里面有重复配置的属性,需要去掉多余的 重启postfix
2,warning:hash:/etc/aliases is unavailable.open database /etc/aliases.db:NO such file or directory.
则 vim /etc/aliases 添加一行abc:ABC 保存,然后执行newaliases,就会生成/etc/aliases.db 这个文件,重启postfix
3,error: unsupported dictionary type: mysql ,需要安装postfix-mysql sudo apt-get install postfix-mysql 即可
4,can’t encrypt password with dovecotpw, see error log for details,安装dovecot-mysql dovecot-core, 则/usr/bin/doveadm 可执行文件就会存在了,路径要写对
5,fatal: bind 0.0.0.0 port 25: Address already in use 因为sendmail占用了25端口,杀掉sendmail的进程即可
通过分析mysql中postfix库的结构,发现只要往表mailbox插入记录,就相当于后台添加邮箱,所有insert into 批量插入即可。
收件箱的邮件默认存储在服务器的 /var/mail/vmail/email.域名/邮箱名/ 下
使用自己的邮箱发送1条邮件到postfix邮箱,然后 sudo cat /var/mail/vmail/email.域名/邮箱名/new/时间戳-jalfhlah 就能看到邮件内容