邮件收发服务器搭建(协议详解)

本文共有8816个字,关键词:POP3IMAPSMTP

由于腾讯企业邮箱不能随意添加子账号了,考虑利用自己的服务器搭建一个邮件收发系统。

首先得搞清楚互联网邮件投递的几个概念

  1. MUA:Mail User Agent,邮件用户代理
    OutlookFoxmail等用户实际面对的收发管理软件
  2. MTA:Mail Transfer Agent,邮件传输代理代为传递
    发信是使用,一般STMP协议,这里使用Postfix
    MUA并非直接将邮件发送至收件人手中,邮件传输代理代为传递,SendmailPostfix就是扮演MTA的角色。
  3. MDA:Mail Delivery Agent,邮件投递代理
    从服务器读取邮件时使用,一般是POP3IMAP协议,这里使用Dovecot
    一封邮件从MUA发出后,可能通过一个或多个MTA传递,最终到达,邮件到达MDA后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。

一旦邮件到达邮箱,就原地不动了,等用户再通过MUA将其取走,就是用OutlookFoxmail等软件收信的过程。

所以一封邮件的流程是:
发件人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映射到主机

  1. POP3收邮件:
    POP3: 110
    POP3 SSL: 995
  2. IMAP收邮件:
    IMAP: 143
    IMAP SSL: 993
  3. 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步:创建电子邮件系统的登录账户。

Postfixvsftpd服务程序一样,都可以调用本地系统的账户和密码,因此在本地系统创建常规账户即可

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邮箱查看,终于。。感动落泪。第一封邮件终于发送成功。
发送邮件成功.png

关于伪造邮件

尝试不存在的域名地址

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.commx记录
获取到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
客户端已断开连接

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

pch18

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

版权声明:如无特别说明,本文为作者原创,转载请在首行注明来源:https://pch18.cn/archives/107.html
添加新评论
仅有一条评论
  1. Ray:

    但是有一个问题,如果对面服务器没有开25端口,而只开了587端口呢,程序怎么去枚举对方的端口,这是我最近比较疑惑的地方,没有文章描述 postfix 是如何探测目标MTA的端口的,希望博主能解答一下