前言
最近我们产品上有一个需求,就是可以使用我们的产品域名(xcc.com)给到我们产品的每个注册用户自定义分配一个邮箱地址(比如 lucas@xcc.com),用户可以将该邮箱地址给到他的对手方,对手方通过该自定义邮箱以文件附件的形式发送给用户,我们的产品服务可以解析该文件并能够处理对应的信息,相当于提供用户一种新的的信息获取的渠道。
这里面需要能够自定义邮箱,并且能够接受外部邮箱发来的邮件,这就需要我们搭建一个能够接受邮件的邮件服务器。
查阅了互联网基本上现在比较主流的就是postfix(发送邮件)+dovecot(读取邮件)的方式来搭建,以下为快速搭建的步骤方式。
安装环境
- 一台阿里云云服务器ECS 2C4G
- 操作系统 CentOS 7.9 64位
- 域名 xcc.com
- mail.xcc.com的证书(如果需要走ssl访问的话,明文发送邮件不需要此证书)
测试环境
- MAC M1芯片
- iTerm控制台
搭建步骤
1、ECS服务器端口开放
SMTP 简单邮件传输协议(发邮件)TCP 25端口,加密时使用TCP 465端口
POP3 第三版邮局协议(收邮件)TCP 110 端口,加密时使用 TCP 995端口
IMAP4 第四版互联网邮件访问协议(收邮件)TCP 143端口,加密时使用TCP 993端口
由于以上协议需要,需要将对应的端口打开,首先尝试将无需加密的端口打开。
2、域名解析配置
先加入MX记录(Mail Exchanger记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。例如,当Internet上的某用户要发一封信给lucas@xcc.com 时,该用户的邮件系统通过DNS查找xcc.com这个域名的MX记录,如果MX记录存在,用户计算机就将邮件发送到MX记录(MX优先级数字越小优先级越高)所指定的邮件服务器上。 例子: @ MX 优先级 mail.xcc.com (A记录主机名加域名) )。
主机记录必须填 @ 符号,否则无法接收邮件。
MX记录必须在A记录之前,否则无法接收邮件。
还需要新增pop,imap,mail这些A记录到对应的ECS机器公网IP上
3、安装发件服务器Postfix
- 安装postfix:
yum install postfix
- 配置/etc/postfix/main.cf文件:
[root@localhost ~]# vim /etc/postfix/main.cf
myhostname = mail.xcc.com #解除注释,定义服务器主机名
mydomain = xcc.com #解除注释,指定邮件域
myorigin = $myhostname #解除注释,设置允许发信的用户的邮件域
myorigin = $mydomain #解除注释,例:admin@xcc.com
inet_interfaces = all #解除注释,设置postfix监听的网络端口
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain #解除注释。设置可接收邮件的主机名 或域名。来自其他主机名或域名的邮件将拒绝接收
home_mailbox = Maildir/ #解除注释,用于定义邮件保存位置
mynetworks = 0.0.0.0/0 #指定了本地网络的IP段,默认只包含主机自己
relay_domains = $mydestination #设置可转发来自哪些域名或主机名的邮件
- 设置完成后重启postfix:
service postfix restart
- 测试发信功能:
1.创建账号lucas账号
# useradd lucas //linux创建账号的同时也会创建一个同名邮箱账号,邮箱账号不能有大写字母,否则无法收发邮件
# echo '123456' | passwd --stdin lucas // 创建登录密码为123456
2.使用 telnet 工具进行发信测试
# telnet mail.xcc.com 25
Trying ip地址...
Connected to mail.xcc.com.
Escape character is '^]'.
220 mail.xcc.com ESMTP Postfix
HELO mail.xcc.com //宣告客户地址
250 mail.xcc.com
MAIL FROM:lucas@xcc.com //发件人地址
250 2.1.0 Ok
RCPT TO:lucas@xcc.com //收件人地址
250 2.1.5 Ok
DATA //邮件内容
354 End data with <CR><LF>.<CR><LF>
Subject:test mail //邮件主题
hello! //邮件内容
this is test mail
. //最后这个点 表示结束
250 2.0.0 Ok: queued as 508F0104FA00
quit // 退出
221 2.0.0 Bye
Connection closed by foreign host.
这样你就可以用lucas用户名和密码登录服务器ECS,在目录~/Maildir下就可以看到刚刚发的测试邮件了
4、安装收件服务器dovecot
- 安装dovecot
yum install dovecot -y
- 配置/etc/dovecot/dovecot.conf
protocols = imap pop3 lmtp submission //指定本邮件主机所运行的协议
listen = *, :: //监听本机的所有网络接口
login_trusted_networks = 0.0.0.0/0 //指定允许登录的网段地址
- 配置/etc/dovecot/conf.d/10-mail.conf
mail_location = maildir:~/Maildir //指定邮件存储格式和位置
- 配置/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = no // 暂时允许明文访问
- 配置/etc/dovecot/conf.d/10-ssl.conf
ssl = no // 暂时可以明文访问
- 设置完毕后重启dovecot
service dovecot restart
- 测试收信功能
~ telnet mail.xcc.com 110
Trying ip地址...
Connected to mail.xcc.com.
Escape character is '^]'.
+OK [XCLIENT] Dovecot ready.
user lucas
+OK
pass 123456
+OK Logged in.
list
+OK 1 messages:
1 319
.
retr 1
+OK 319 octets
Return-Path: <lucas@xcc.com>
X-Original-To: lucas@xcc.com
Delivered-To: lucas@xcc.com
Received: from mail.xcc.com
by mail.xcc.work (Postfix) with SMTP id D0FF136E8B45
for <lucas@xcc.com>; Mon, 6 Feb 2023 15:35:47 +0800 (CST)
Subject:test mail
hello!
this is test mail
.
quit
+OK Logging out.
Connection closed by foreign host.
如果走完以上步骤,那么基于明文的邮件收发功能就已经ready了。
5、邮件客户端集成
由于我的是Mac,我就直接使用苹果自带的邮件客户端,来快速的集成我刚刚搭建好的邮件服务器。
「邮件」—>「添加账户」
配置填好后,就可以直接登录到邮件页面,很方便的收邮件了(发邮件由于阿里云将25端口封掉了,所以暂时没法进行明文的邮件发送)
6、配置SSL加密传输
由于上面的过程配置的邮件服务器使用的是明文传输,无法使用在生产环境,需要开启SSL加密模式,让其可以在生产环境中使用。
- 首先我们需要给mail.xcc.com新增证书,可以到阿里云的免费数字证书领取,每年有20个免费证书的创建机会。小伙伴们可以自行搜索下。
创建好数字证书之后,可以下载对应的Nginx服务器类型的证书格式 pem/key
随后将解压后的证书文件,通过scp命令将下载到本地的证书文件传输到ECS服务器上
scp -r /Users/shaoshuai.shao/Downloads/9248035_mail.xcc.com_nginx root@119.88.777.500:/root/cert/
如下图所示将对应的pem和key文件都上传至服务器文件夹下
- 修改Postfix配置文件,将证书对应的文件目录修改掉
vim /etc/postfix/main.cf
将上面证书文件上传的地址配置到下面的参数中,修改内容:
smtpd_tls_cert_file = /root/cert/9248035_mail.xcc.com_nginx/9248035_mail.xcc.com.pem
smtpd_tls_key_file = /root/cert/9248035_mail.xcc.com_nginx/9248035_mail.xcc.com.key
vim /etc/postfix/master.cf
修改内容如下,将如下配置的注释打开
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
- 接着修改dovecot的配置文件,指定开启SSL模式,并指定证书的位置
vim /etc/dovecot/conf.d/10-ssl.conf
修改内容:
ssl = yes
ssl_cert = </root/cert/9248035_mail.xcc.com_nginx/9248035_mail.xcc.com.pem
ssl_key = </root/cert/9248035_mail.xcc.com_nginx/9248035_mail.xcc.com.key
- 配置/etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes // 不允许明文访问
- 重启Postfix和Dovecot服务
systemctl restart postfix
systemctl restart dovecot
可以通过端口号check是否服务发布正常
netstat -tln
- 开放ECS服务器对应的端口号
OK 这样就可以通过SSL的方式收发邮件了。
P.S. 当前只能接受邮件,不能发送邮件(待后面再研究下),估计还是和阿里云的端口封掉有关。不过已经可以满足需求了。
引用
javascript - 从0到1搭建域名邮件服务器 - 前端那些趣事公众号 - SegmentFault 思否