由于腾讯企业邮箱不能随意添加子账号了,考虑利用自己的服务器搭建一个邮件收发系统。
首先得搞清楚互联网邮件投递的几个概念
- MUA:Mail User Agent,
邮件用户代理
Outlook
,Foxmail
等用户实际面对的收发管理软件 - MTA:Mail Transfer Agent,
邮件传输代理代为传递
发信是使用,一般STMP协议
,这里使用Postfix
MUA
并非直接将邮件发送至收件人手中,邮件传输代理代为传递,Sendmail
和Postfix
就是扮演MTA
的角色。 - MDA:Mail Delivery Agent,
邮件投递代理
从服务器读取邮件时使用,一般是POP3
、IMAP
协议,这里使用Dovecot
一封邮件从MUA
发出后,可能通过一个或多个MTA
传递,最终到达,邮件到达MDA
后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。
一旦邮件到达邮箱,就原地不动了,等用户再通过MUA
将其取走,就是用Outlook
,Foxmail
等软件收信的过程。
所以一封邮件的流程是:发件人
:MUA发送
–> MTA
-> MDA
<–MUA收取
:收件人
用于搭建的服务器信息
- Docker里运行的alpine:3.9容器
- Postfix-2.8.12.tar.gz Postfix MTA(邮件传输代理)
- Dovecot-2.1.8.tar.gz IMAP 和 POP3 邮件服务器
- Postfixadmin-2.3.5.tar.gz 采用PHP编写的开源WEB邮箱及域名账号管理工具
- Roundcubemail-0.8.1.tar.gz 采用PHP编写的开源IMAP邮件WEB客户端
端口映射,需要用到的端口,通过docker映射到主机
- POP3收邮件:
POP3: 110
POP3 SSL: 995 - IMAP收邮件:
IMAP: 143
IMAP SSL: 993 - SMTP发邮件:
SMTP: 25
SMTP SSL: 465
SMTP TLS: 587
第1步:配置服务器主机名称,
需要保证服务器主机名称与发信域名保持一致
echo "mail.pch18.cn" > /etc/hostname
第2步:安装需要的软件
apk update
apk add postfix
apk add dovecot
第3步:修改 postfix
配置,
路径为 /etc/postfix/main.cf
#第1处 服务器的主机名称
myhostname = mail.pch18.cn
#第2处 邮件域的名称
mydomain = pch18.cn
#第3处 调用前面的mydomain变量,用来定义发出邮件的域
myorigin = $mydomain
#第4处 定义网卡监听地址。可以指定要使用服务器的哪些IP地址对外提供电子邮件服务;也可以干脆写成all,代表所有IP地址都能提供电子邮件服务:
inet_interfaces = all
#第5处 定义可接收邮件的主机名或域名列表(第二条应该也行)
mydestination = $myhostname , $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
第4步:创建电子邮件系统的登录账户。
Postfix
与vsftpd
服务程序一样,都可以调用本地系统的账户和密码,因此在本地系统创建常规账户即可
adduser pch18
echo "password" | passwd pch18
第5步:修改 dovecot
配置,
路径为 /etc/dovecot/dovecot.conf
#把Dovecot服务程序支持的电子邮件协议修改为imap、pop3和lmtp。
protocols = imap pop3 lmtp
#允许用户使用明文进行密码验证。
disable_plaintext_auth = no
第6步:配置邮件格式与存储路径,
路径为 /etc/dovecot/conf.d/10-mail.conf
mail_location = mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%n
踩个大坑,vps服务器貌似封了25端口,telnet jp.pch18.cn 25
也不提示拒绝,一直是trying
。然而在vps上就能连接成功。以为是防火墙的问题,怎么检查都是关闭状态。配置文件也检查好几遍。服务商也没任何提示,反而在端口转发列表里有25端口的例子。新建个别的应用,25端口就是连不上,26端口就可以。
看了下国内阿里云和腾讯云也都普遍封25端口,不一样的是,
国内封的是25出口,防止发送大量垃圾邮件。日本这边封的是25入口,防止私自建邮件服务器妨碍运营商邮件服务器的利益,服务器20块钱一个月,邮件服务器最低也要300一个月。上述是rmb
刚刚发现,其实不是vps封了25端口入网。
转移阿里云测试后发现,依然不能连接阿里云的25端口。
其实是本地网络提供商封了25出口,我们把25端口换成26端口进行测试。
我们搭建好 postfix
后尝试用 telnet
发信
最后的 <换行符> . <换行符>
不能少,那是结束标志
不能一次性全部复制 一行一行 输入。
telnet mail.pch18.cn 26
mail from:<i@pch18.cn>
rcpt to:<pch18@qq.com>
data
From:i@pch18.cn
To:pch18@qq.com
Subject:test
test
.
当我们输入到rcpt to:<pch18@qq.com>
时报错454 4.7.1 <pch18@qq.com>: Relay access denied
查资料不是relay
的问题呗拒绝,如果时relay
的问题,错误代码应该是554
经测试,设置mynetworks = 0.0.0.0/0
后,不会报错可以正常发信,完整过程如下
telnet mail.pch18.cn 26
Trying 140.227.203.131...
Connected to jp.pch18.cn.
Escape character is '^]'.
220 mail.pch18.cn ESMTP Postfix
mail from:<i@pch18.cn>
250 2.1.0 Ok
rcpt to:<pch18@qq.com>
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
From:i@pch18.cn
To:pch18@qq.com
Subject:test
test
.
250 2.0.0 Ok: queued as 771031C001A7
登录qq邮箱查看,终于。。感动落泪。第一封邮件终于发送成功。
关于伪造邮件
尝试不存在的域名地址
mail from:<admin@pch188.cn>
rcpt to:<pch18@qq.com>
data
From:admin@pch188.cn
To:pch18@qq.com
Subject:test
test
.
对方能成功收信,但是邮件在垃圾箱中
尝试发件人使用163.com
mail from:<admin@163.cn>
rcpt to:<pch18@qq.com>
data
From:admin@163.com
To:pch18@qq.com
Subject:test
test
.
对方收不到邮件,可能对常用域名有自动识别来源ip机制
尝试From使用163.com
mail from:<admin@pch18.cn>
rcpt to:<pch18@qq.com>
data
From:admin@163.com
To:pch18@qq.com
Subject:test
test
.
对方能收到邮件但是显示 admin admin@163.com (由 admin@pch18.cn 代发)
协议详解
研究到这里,没有继续的必要了,大概摸清楚了邮件收发协议,现在把协议重新整理一下
网上关于stmp协议介绍都是客户端和postfix之间的通信。
在上面也有详细介绍。这里我们要直接访问对方服务器,把邮件送过去。
其实这个协议和我们上一篇文章发信协议完全一致。
只不过多了一个需要解析对方mx服务器地址的步骤。
具体再整理一下,以 A(admin@pch18.cn)
向 B(pch18@qq.com)
发信为例。nslookup -q=mx qq.com
获取qq.com
的mx记录
。
获取到3条分别是,
- mx1.qq.com
- mx2.qq.com
- mx3.qq.com
优先级分别是30,20,10我们取优先级最高的mx1.qq.com 去连接对方25端口。
模拟发信客户端
第1步先发送问好表明自己身份。helo pch18.cn
对方回复250 OK
第2步自报来源mail from:<admin@pch18.cn>
对方回复250 OK.
第3步告诉对方要发给谁rcpt to:<pch18@qq.com>
对方回复250 OK 1
第4步告诉对方 我要开始发正文啦data
对方提醒你发送完后要<回车> . <回车>
来结束 354 End data with <CR><LF>.<CR><LF>.
第5步发送邮件内容 开头要包括From,To,Subject 两个换行符后是 正文 最后按第4步提示收尾
From:admin@pch18.cn
To:pch18@qq.com
Subject:test
test
.
对方回复 接收成功250 Ok: queued as
这样子一个收发流程就跑完了。我们来尝试一下发送。
>> telnet mx1.qq.com 25
<< 220 newxmmxszc10.qq.com-100.77.2.85-59078166 MX QQ Mail Server.
>> helo pch18.cn
<< 250-newxmmxszc10.qq.com-100.77.2.85-59078166
<< 250-SIZE 73400320
<< 250 OK
>> mail from:<admin@pch18.cn>
<< 250 OK.
>> rcpt to:<pch18@qq.com>
<< 250 OK 1
>> data
<< 354 End data with <CR><LF>.<CR><LF>.
>> From:admin@pch18.cn
>> To:pch18@qq.com
>> Subject:test
>>
>> test
.
<< 250 Ok: queued as
模拟收信服务器
利用npm i -g @pch18-run/telnetserver 25
监听端口模仿客户端telnetserver 25
服务启动成功, 监听 25 端口中...
客户端已连接 ::ffff:59.36.132.32:47547 => ::ffff:172.17.0.4:25
>> 220 OK
EHLO qq.com
>> 250 OK
MAIL FROM: <pch18@qq.com>
>> 250 OK
RCPT TO: <admin@pch18.cn>
>> 250 OK
DATA
>> 354 End data with <CR><LF>.<CR><LF>
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;
t=1557056265; bh=VXg0/kZuPX0CJVYPQEtLPQa9+LaCQbQ9IZqXy+HSOv4=;
h=From:To:Subject:Mime-Version:Date:Message-ID;
b=BFUrDBG5JiHFF/J56KEqgAt2FmrtBEML+9ypMb9x8m8RizpHLVluund82QyzC6K61
S2TUZx6N2tJdVgQbEoo4tYJeziWqcNEGyDn940Y05cG0idOQEsh4aF4elc7PvZGVjp
qJeV1K27WEY+P4ZJ3V7NN+1i1ZcVo/CnfVaTb7Js=
X-QQ-FEAT: 4YfUFR6LTbUqa1E5QF3pQ4K7hf8C4lnPb0QaZr7oL8ITxTjltoOTfvv/b8OzF
FIfyOSIklANA8WcsXmUrWoogyIn1dajA8QQJ0iNyBju7IF0ouOsbcu6mF+FYvRwj5EyZTch
yy5IUShhDnKtBg7DqEdzcMHuR+7C5jTLQQEAZ9iks1MyMlZhZrsagvUcB7PXlQ69NOp5Js7
SNKK/Ny/vBuBPMRYvRzX8uqsXcqtrKtr1K0Cen58Ak5VWZlhbZkYDLDM/t0taNTJ5UrA/Vq
7iLDGyEn5jIXHuoD3692XIzEUFVbvAIHuJng==
X-QQ-SSF: 000100000000005000000000000000Z
X-HAS-ATTACH: no
X-QQ-BUSINESS-ORIGIN: 2
X-Originating-IP: 217.178.171.24
X-QQ-STYLE:
X-QQ-mid: webmail251t1557056264t4977472
From: "=?utf-8?B?cGNoMTg=?=" <pch18@qq.com>
To: "=?utf-8?B?YWRtaW4=?=" <admin@pch18.cn>
Subject: =?utf-8?B?5Zue5aSN77yadGVzdA==?=
Mime-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_NextPart_5CCECB08_0BB1A9D8_240AFF64"
Content-Transfer-Encoding: 8Bit
Date: Sun, 5 May 2019 19:37:44 +0800
X-Priority: 3
Message-ID: <tencent_FC21309D69F95739F5EE858AA79B8DD4A105@qq.com>
X-QQ-MIME: TCMime 1.0 by Tencent
X-Mailer: QQMail 2.x
X-QQ-Mailer: QQMail 2.x
X-QQ-SENDSIZE: 520
Received: from qq.com (unknown [127.0.0.1])
by smtp.qq.com (ESMTP) with SMTP
id ; Sun, 05 May 2019 19:37:45 +0800 (CST)
Feedback-ID: webmail:qq.com:bgweb:bgweb10
This is a multi-part message in MIME format.
------=_NextPart_5CCECB08_0BB1A9D8_240AFF64
Content-Type: text/plain;
charset="utf-8"
Content-Transfer-Encoding: base64
5Zue5aSN5L2g5LiA5LiLDQpyZXBheSB5b3UgaGFoYQ0KDQoNCg0KDQotLS0tLS0tLS0tLS0t
LS0tLS0g5Y6f5aeL6YKu5Lu2IC0tLS0tLS0tLS0tLS0tLS0tLQ0K5Y+R5Lu25Lq6OiAiYWRt
aW4iPGFkbWluQHBjaDE4LmNuPjsNCuWPkemAgeaXtumXtDogMjAxOeW5tDXmnIg15pelKOaY
n+acn+WkqSkg5LiL5Y2INTo0NQ0K5pS25Lu25Lq6OiAicGNoMTgiPHBjaDE4QHFxLmNvbT47
DQoNCuS4u+mimDogdGVzdA0KDQoNCg0KdGVzdA==
------=_NextPart_5CCECB08_0BB1A9D8_240AFF64
Content-Type: text/html;
charset="utf-8"
Content-Transfer-Encoding: base64
PGRpdj7lm57lpI3kvaDkuIDkuIs8L2Rpdj48ZGl2PnJlcGF5IHlvdSBoYWhhPC9kaXY+PGRp
dj48ZGl2Pjxicj48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2IHN0eWxlPSJmb250LXNpemU6
IDEycHg7Zm9udC1mYW1pbHk6IEFyaWFsIE5hcnJvdztwYWRkaW5nOjJweCAwIDJweCAwOyI+
LS0tLS0tLS0tLS0tLS0tLS0tJm5ic3A75Y6f5aeL6YKu5Lu2Jm5ic3A7LS0tLS0tLS0tLS0t
LS0tLS0tPC9kaXY+PGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMnB4O2JhY2tncm91bmQ6I2Vm
ZWZlZjtwYWRkaW5nOjhweDsiPjxkaXY+PGI+5Y+R5Lu25Lq6OjwvYj4mbmJzcDsiYWRtaW4i
Jmx0O2FkbWluQHBjaDE4LmNuJmd0Ozs8L2Rpdj48ZGl2PjxiPuWPkemAgeaXtumXtDo8L2I+
Jm5ic3A7MjAxOeW5tDXmnIg15pelKOaYn+acn+WkqSkg5LiL5Y2INTo0NTwvZGl2PjxkaXY+
PGI+5pS25Lu25Lq6OjwvYj4mbmJzcDsicGNoMTgiJmx0O3BjaDE4QHFxLmNvbSZndDs7PHdi
cj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PGI+5Li76aKYOjwvYj4mbmJzcDt0ZXN0PC9kaXY+
PC9kaXY+PGRpdj48YnI+PC9kaXY+dGVzdDxicj48YnI+PC9kaXY+
------=_NextPart_5CCECB08_0BB1A9D8_240AFF64--
.
250 Ok: queued as
QUIT
客户端已断开连接
但是有一个问题,如果对面服务器没有开25端口,而只开了587端口呢,程序怎么去枚举对方的端口,这是我最近比较疑惑的地方,没有文章描述 postfix 是如何探测目标MTA的端口的,希望博主能解答一下