电子邮件基础

电子邮件

  • 快速、便捷、通用、异步的通信方式
  • 1965年最早由MIT发明并开源 (最早用于同主机用户间通信)
  • 1971年确定邮件地址以@符号连接(在不同主机间传递信息)
  • MIME (Multipurpose Internet Mail Extensions 多用途互联网邮件扩展类型) 类型扩展邮件以纯文本到传递文件(文档、图片、媒体)
  • 邮件可被伪造

传统物理邮件和电子邮件比较

传统物理邮件

  • 写信 —-> 到本地邮局 —-> 目的邮局 —-> 收件人

电子邮件

  • client1 —-> server1 ——> server2 ——client2 ,邮件地址通过DNS解析完成邮件路由
  • 无收件人返回报错(不通知),连不上目标服务器周期重发,直至失败

邮件协议

SMTP

  • Simple Mail Transfer Protocol
  • MTA(Mail transfer agents)之间通信协议(SMTPD)
    • 由很多个小程序组合实现MTA所以功能
  • Sendmail、Postfix、Exim、Qmail 等MTA软件包
  • 客户端发邮件MUA ——> MTA 也是用SMTP协议

邮件客户端

Sendmail (功能强大)

  • 处理着绝大多数互联网电子邮件
  • 开源免费版 / 商业版(GUI界面)
  • 配置过于复杂 (默认配置已经可以良好工作)
  • 功能全面但性能不占优势

Postfix

  • 来自于IBM的开源MTA(Ubuntu默认首选的MTA)
  • 速度优于 Sendmail , 配置管理更简单(配置文件、命令)
  • 可以平滑替换Sendmail (模块化)

Qmail

  • Postfix的可替代选择(模块化的MTA,用户、配置分离)
  • 设计初衷是实现取代sendmail的更安全快速的MTA
  • 从sendmail迁移到Qmail过程复杂
  • 众多插件,包含web mail、POP服务

Exim

  • 比Sendmail / Postfix 更安全快速,但配置方式不同
  • 与Qmail都使用maildir格式邮箱储存

MBOX

  • 传统的mbox格式邮箱储存 将所有邮件存于一个文件中,索引定位具体邮件
  • 文件和索引损坏可能造成邮件丢失,故障恢复困难
  • 不适宜存储与NSF 挂载在目录中

MAILDIR

  • Maildir 格式包含三个子目录 /cur、/new、/tmp ,每个邮件分离独立保存
  • 可并行访问,性能更高(mbox不支持并行访问)
  • 可用NFS作为邮箱存储

MTA可直接投递和读取邮件

  • 更多时候邮件投递由MDA完成 MDA就是邮件投递代理

电子邮件架构

基础

MDA(Mail Delivery Agent)

  • MDA比 MTA额外实现自动过滤、回复、规则转存、杀毒等

Mailx

  • MDA + MUA(Ubuntu的默认MDA)
  • 来自MTA的邮件交给Mailx投递到用户邮箱 (/var/mail)
  • 主目录下.forward文件实现自动转发

mail.local

  • 常用于BSD的MDA程序
  • 功能使用与Mailx类似

procmail

  • 最流行的MDA之一
  • Recipes允许用户自定义邮件处理脚本 (.procmailrc)

MUA(Mail User Agent)

  • 读取和展示邮箱中的邮件(不进行邮件传递)
  • 以什么角度区分MUA:在哪读取邮件 / 邮件显示格式(MIME)

Mailx(MUA + MDA)

  • 服务器本地直接读取邮箱mail

Dovecot

  • 远程客户端访问邮箱
  • POP3 (Post Office Protocol version3 )
    • 适合单一客户端,单项通信协议(MUA <—- MDA)
  • IMAP4(Internet Message Access Protocol 4)
    • 适合多邮件客户端,双向同步协议(MUA <—-> MDA)

其他邮箱访问方式

  • web mail
  • MAPI
    • 微软专有邮件协议

Fetchmail

  • 邮件服务器 <——-邮件服务器 (POP3 / IMAP)
  • 适用于没有稳定互联网连接的小公司

邮件结构

  • 信封: 用于邮件路由,对用户透明不可见
  • 邮件头:邮件路由传输过程的记录日志
  • 邮件体:邮件要传递的具体内容

SPAM

  • 垃圾邮件,不请自来的邮件
  • 处理浪费时间、网络带宽、存储空间

邮件规范

  • 收件人为事件直接相关人
  • 次要相关人按职位顺序
  • 主题简洁清晰,高度概括
  • 保证表达清楚的前提下邮件内容尽可能短(避免语法错误)
  • 适当使用表情符
  • 回复、转发完整邮件流(禁止写一封新的邮件作为回复)
  • 压缩附件
  • 附上个人签名

Postfix简单部署

安装配置DNS服务器

1
sudo apt install bind9

配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo vim /etc/bind/named.conf.options

# 配置:
forwarders{
8.8.8.8;
};

sudo vim /etc/bind/named.conf.local

# 配置
zone "qq.com"{
type master;
file "/etc/bind/db.qq.com"
};


cd /etc/bind/
sudo cp db.local db.qq.com

sudo vim db.qq.com

配置:

重启服务:

1
sudo systemctl restart bind9

网络配置

配置成静态ip地址

1
sudo vi /etc/netplan/*.yaml

1
2
3
4
5
# 重启网络
sudo netplan apply

# 查看网络是否生效
sudo networkctl status

修改主机名

1
2
3
sudo vi /etc/cloud/cloud.cfg

# 将preserver_hostname改为true
1
2
3
sudo vi /etc/hostname

# 修改主机名:mail.qq.com

安装Postfix

1
2
3
4
5
6
sudo apt install postfix

# 安装过程选择 Internet Site

sudo apt install mailutils
grep mail /etc/group # 查看,生成了一个mail组

只有mail组的成员可以发邮件

1
2
3
4
5
6
7
sudo usermod -aG mail cwz
grep mail /etc/group

sudo useradd -m -G mail zhangsan

# 为zhangsan用户添加密码
sudo passwd zhangsan

发送邮件:

给zs用户发邮件,并抄送给cwzdzg@163.com

企业部署Postfix

组件:

  • Postfix:MTA
  • Dovecot:POP / IMAP服务
  • SASL:身份认证
  • Postfixadmin:管理邮件、虚拟域、别名等web应用
  • LNMP:postfixadmin的依赖

Postfix的两种域

  • Local Domain:为本系统账号投递邮件(/etc/password)
  • Virtual Domain:为非本账号系统投递邮件

首先是安装DNS服务器

安装LNMP依赖:

1
2
3
4
5
6
7
8
9
10
11
12
13
sudo apt install nginx
sudo apt install mysql-server
sudo mysql_secure_installation # 安全加固
sudo mysql
# 修改mysql登录方式
alter user 'root'@'localhost' identified with mysql_native_password by '12345678';
flush privileges;

sudo apt install php-fpm php-mysql
sudo vi /etc/php/7.2/fpm/php.ini
# 修改配置
cgi.fix_pathinfo=0
date.timezone=Asia/Shanghai

验证是否正常工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sudo vi /etc/nginx/sites-available/default

# 修改配置
index index.php
server_name mail.qq.com;
location ~\.php${
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
location ~/\.ht{
deny all;
}
}


# 验证:
sudo vi /var/www/html/info.php
# 写一句php代码
<?php phpinfo(); ?>

重启服务:

1
2
3
systemctl restart nginx.service
systemctl restart php7.2-fpm.service

安装Postfixadmin

1
2
3
4
5
6
7
8
9
10
11
# 手动下载源码、解压、安装、配置
sudo apt install php-imap php-mbstring php7.2-imap php7.2-mbstring

sudo wget -P /opt https://github.com/postfixadmin/postfixadmin/archive/postfixadmin-3.2.3.tar.gz

cd /opt
tar zxvf postfixadmin3.2.3.tar.gz
mv postfixadmin-postfixadmin-3.2.3/ postfixadmin # 重命名

# 软连接
ln -s /opt/postfixadmin/public/ /var/www/html/pfa

配置数据库

1
2
3
4
5
6
mysql -uroot -p

create database postfix charset utf8;
create user 'postfix'@'localhost' identified by '12345678';
grant all privileges on postfix.* to 'postfix'@'localhost';
flush privileges;

postfixadmin数据库连接文件

1
2
3
4
5
6
7
8
cd /opt/postfixadmin/ && cp config.inc.php config.local.php

sudo vi config.local.php

# 修改配置文件
$CONF['configured'] = true;
$CONF['default_language'] = 'cn';
# 数据库连接信息

创建临时目录

1
2
3
mkdir /opt/postfixadmin/templates_c && chmod 755 -R /opt/postfixadmin/templates_c

chown -R www-data:www-data /opt/postfixadmin/templates_c

WEB安装阶段

1
$CONF['setup_password'] = 'c777a686bbbf8e923e2de9d4c9578e98:77e8853a57fbea31f4bc5365e5bbfb1823650e6a';
  • 创建管理员账号
  • 登录管理员界面

创建虚拟域、创建邮件

安装邮件功能

集成Postfix

1
sudo apt install postfix postfix-mysql sasl2-bin

配置sasl自动启动

1
2
3
4
5
6
7
sudo vi /etc/default/saslauthd

# 更改配置文件
START=yes

# 重启服务
sudo systemctl restart saslauthd

邮箱目录、访问账号、组

1
2
3
groupadd -g 5000 vmail && mkdir -p /var/mail/vmail
useradd -u 5000 vmail -g vmail -s /usr/sbin/nologin -d /var/mail/vmail
chown -R vmail:vmail /var/mail/vmail

数据库配置文件1(共创建3个配置文件)

1
2
3
4
5
6
7
8
9
10
11
mkdir -p /etc/postfix/sql

vi /etc/postfix/sql/mysql_virtual_domains_maps.cf

# 添加配置
user = postfix
password = 12345678
hosts = 127.0.0.1
dbname = postfix
query = SELECT domain FROM domain WHERE domain = '%s' AND active = '1'

配置加入主配置文件/etc/postfix/main.cf

1
2
3
4
postconf -e virtual_mailbox_domains=mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf


postmap -q qq.com mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf # 验证

数据库配置文件2

1
2
3
4
5
6
7
8
vi /etc/postfix/sql/mysql_virtual_mailbox_maps.cf

# 添加配置
user = postfix
password = 12345678
hosts = 127.0.0.1
dbname = postfix
query = SELECT maildir FROM mailbox WHERE username='%s' AND active='1'

配置加入/etc/postfix/main.cf

1
2
3
postconf -e virtual_mailbox_maps=mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf

postmap -q tom@qq.com mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf # 验证

数据库配置文件3

1
2
3
4
5
6
7
8
vi /etc/postfix/sql/mysql_virtual_alias_maps.cf

# 添加配置
user = postfix
password = 12345678
hosts = 127.0.0.1
dbname = postfix
query = SELECT goto FROM alias WHERE address='%s' AND active='1'

配置加入/etc/postfix/main.cf

1
2
3
postconf -e virtual_alias_maps=mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf

postmap -q abuse@qq.com mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf # 验证

权限

1
chgrp postfix /etc/postfix/sql/mysql_*.cf

启用SASL强制Postfix发邮件使用Dovecot进行身份验证

1
2
3
4
5
6
7
8
9
10
vi /etc/postfix/main.cf
# 添加配置
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_tls_security_level = may
smtpd_tls_auth_only = no
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

启用安全SMTP端口

1
2
3
vi /etc/postfix/master.cf

# 修改配置,取消注释

添加一条配置

1
-o smtpd_client_restrictions=permit_sasl_authenticated.reject

添加一条配置

1
-o smtpd_client_restrictions=permit_sasl_authenticated.reject

验证配置

1
postconf -n

重启服务

1
systemctl restart postfix

安装Dovecot(IMAP、POP3)

1
sudo apt install dovecot-imapd dovecot-mysql dovecot-managesieved dovecot-pop3d

配置Dovecot(多配置文件)

1
2
3
4
5
cd /etc/dovecot/conf.d && vim 10-auth.conf    # 系统账号/SQL账号
# 配置
auth_mechanisms=plain login
#!include auth-system.conf.ext
!include auth-sql.conf.ext

配置SQL账号

1
2
3
4
5
6
7
8
9
10
vi auth-sql.conf.ext

passdb{
driver = sql
args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb{
driver = static
args = uid=vmail gid=vmail home=/var/mail/vmail/%d/%n
}

连接数据库

1
2
3
4
5
6
vi /etc/dovecot/dovecot-sql.conf.ext
# 配置
driver = mysql
connect = host=127.0.0.1 dbname=postfix user=postfix password=12345678
password_query=select username.domain.password from mailbox where username='%u';
default_pass_scheme = MD5-CRYPT

指定邮箱存储位置

1
2
3
4
vi 10-mail.conf
# 配置
mail_location = maildir:/var/mail/vmail/%d/%n/Maildir
mail_privileged_group = mail

配置服务器连接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
vi 10-master.conf
# 配置
service auth{
unix_listener auth-userdb{
mode = 0600
user = vmail
}
unix_listener /var/spool/postfix/private/auth{
mode = 0660
user = postfix
group = postfix
}
user = dovecot
}

配置sieve

1
2
3
4
5
6
7
vi 15-lda.conf
# 配置
protocol lda{
mail_plugins = $mail_plugins sieve
}

chgrp vmail /etc/dovecot/dovecot.conf

重启服务

1
systemctl restart dovecot

查看日志

1
tail -n 20 -f /var/log/mail.log

集成Postfix / Dovecot

1
2
3
4
5
6
7
8
9
vi /etc/postfix/master.cf
# 配置
dovecot unix -n n -- pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

vi /etc/posfix/main.cf
# 配置
virtual_transport = dovecot
dovecot_destination_recipient_limit = 1

重启服务

1
2
3
systemctl restart postfix

tail -n 20 -f /var/log/mail.log

测试

  • postfixadmin 发送邮件
  • apt install mailutils
  • echo "Hello Alain" | mail -s "test mail" tom@qq.com

查看结果

1
2
tail -n 20 -f /var/log/mail.log
ls -l /var/mail/vmail

增加其他虚拟域、邮箱

1
echo "Hello ZS, it's tom" | mail -s "Subject" -aFrom:tom\<tom@qq.com\>zs@taobao.com

WEB MAIL

web mail安装

  • 各大邮件服务商全部提供webmail
  • 基于浏览器的统一使用体验,无需配置客户端
  • Roundcube 非常流行且稳定的 web mail应用
  • 安装依赖包
    • apt install php7.2-intl php-imagick php7.2-ldap

下载rounducbe

1
2
3
4
cd /var/www/html
wget https://github.com/rounducbe/roundcubemail/releases/download/1.3.6/roundcubemail-1.3.6-complete.tar.gz
tar zxvf
mv roundcubemail-1.3.6 webmail && cd webmail

创建数据库

1
2
3
4
5
6
create database roundcubedb;
create database roundcubemail;
create user'roundcube'@'localhost' identified by 'password';
grant all privileges on roundcubedb.* to 'roundcube'@'localhost';
grant all privileges on roundcubemail.* to 'roundcube'@'localhost';
flush privileges;

导入数据

1
mysql -u roundcube -p roundcubedb < SQL/mysql.initial.sql

配置站点文件

检查配置

1
nginx -t

重启服务

1
systemctl restart nginx

权限

1
2
chown -R www-data:www-data /var/www/html/webmail/
chmod 755 /var/www/html/webmail/temp/ /var/www/html/webmail/logs/

web安装阶段

删除installer目录

登录web mail