linux搭建邮件服务器 - postifx + SSL + 465端口配置

整体参考:https://www.cnblogs.com/chris-cp/p/4843407.html

建议先看上文,照着配置完再看本文。关于25端口被封无法发邮件的解决办法在本文后半部分。

做几点补充:

  1. /etc/dovecot/conf.d/10-ssl.conf中把 ssl = required改成ssl = no

  2. 注意设置/etc/postfix/main.cf中的mynetworks时,注意本地子网的IP格式,比如172.21.0.1/28就是错的,要写成172.21.0.0/28。网段计算器

安全组开放25,110,143端口

常用命令:

查看邮件队列

1
postqueue -p # 另一个相似命令:mailq
NGINX

查看日志:

1
2
3
4
systemctl status postfix
journalctl -u postfix
# 下面这个查看的日志详细
journalctl -u postfix@-
MIPSASM

如果你只图能收邮件,不需要往外发邮件的话,到这里已经可以结束了。

解决云服务器封了25端口导致的不能发送邮件的问题

网上说开放465端口,用SSL,我照着postfix+dovecot+SSL 搭建邮件服务器做了,但是发送邮件一直还是用25端口。

最后看了半天官方的文档,升级到了postfix3,按照官方给的说明捣鼓了半天终于是解决了。接下来是正文。

本文提供两种方法,一种是设置transport_maps,对特定地址的邮件指定端口,另一种是用iptables把25端口NAT到465端口。第一种方法测试后不太现实,推荐第二种方法。

1. 安装postfix3

1
2
3
systemctl stop postfix
yum remove postfix
yum install https://mirror.ghettoforge.org/distributions/gf/el/7/plus/x86_64/postfix3-3.6.2-1.gf.el7.x86_64.rpm
BASH

注意,我是Centos 7,如果你是Centos8,请使用如下命令:

1
yum install https://mirror.ghettoforge.org/distributions/gf/el/8/plus/x86_64/postfix3-3.6.2-1.gf.el8.x86_64.rpm
BASH

如果有版本更新,上面链接失效了,自己去网站看下最新版链接。

2. 配置postfix client tls

这里科普一点小知识,postfix分为client和server,client是往外发邮件的,server是接收邮件的。我们发邮件要用465,所以设置的是client,配置项以smtp_开头。smtpd_是服务器配置。

先跟着上文中提到的postfix+dovecot+SSL 搭建邮件服务器生成SSL证书和key,并配置好smtp-server端。

上述操作后部分配置如下:

1
2
3
4
5
6
7
8
9
10
# /etc/dovecot/conf.d/10-ssl.conf
ssl = yes
ssl_cert = </etc/pki/tls/certs/server.crt
ssl_key = </etc/pki/tls/certs/server.key

# /etc/postfix/main.cf
smtpd_use_tls = yes
smtpd_tls_cert_file = /etc/pki/tls/certs/server.crt
smtpd_tls_key_file = /etc/pki/tls/certs/server.key
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_scache
INI

到这里,在邮件客户端开启SSL收件应该已经不成问题,但是还无法发邮件。

然后参看官网的指导:

http://www.postfix.org/TLS_README.html#quick-client

http://www.postfix.org/TLS_README.html#client_smtps

先来自动生成tls client端的配置项。只有tls配置是默认时此命令才有效,否则不会更改配置文件。

1
postfix tls enable-client
BASH

执行结束后/etc/postfix/main.cf中应当添加了

1
2
3
4
smtp_tls_session_cache_database = btree:/var/lib/postfix/smtp_scache
smtp_tls_security_level = may
tls_random_source = dev:/dev/urandom
smtp_tls_loglevel = 1
INI

3. 方法一、设置transport_maps 走465端口

根据官网的说明:

Postfix ≥ 3.0: Sending all remote mail to an SMTPS server

The first example will send all remote mail over SMTPS through a provider's server called "mail.example.com":

1
2
3
4
5
6
7
8
9
10
11
12
13

/etc/postfix/main.cf:

# Client-side SMTPS requires "encrypt" or stronger.

smtp_tls_security_level = encrypt

smtp_tls_wrappermode = yes

# The [] suppress MX lookups.

relayhost = [mail.example.com]:465

MARKDOWN

Use postfix reload to make the change effective.

See SOHO_README for additional information about SASL authentication.

Postfix ≥ 3.0: Sending only mail for a specific destination via SMTPS

The second example will send only mail for "example.com" via SMTPS. This time, Postfix uses a transport map to deliver only mail for "example.com" via SMTPS:

1
2
3
4
5

/etc/postfix/main.cf:

transport_maps = hash:/etc/postfix/transport

SWIFT
1
2
3
4
5

/etc/postfix/transport:

example.com relay-smtps:example.com:465

MAXIMA
1
2
3
4
5
6
7
8
9
10
11

/etc/postfix/master.cf:

relay-smtps unix - - n - - smtp

# Client-side SMTPS requires "encrypt" or stronger.

-o smtp_tls_security_level=encrypt

-o smtp_tls_wrappermode=yes

ROUTEROS

Use "postmap hash:/etc/postfix/transport" and "postfix reload" to make the change effective.

See SOHO_README for additional information about SASL authentication.

提供了两种方法:

  1. 所有的外发邮件全部发送到一个特定的smtps服务器

  2. 根据不同的邮件地址转发到不同的smtps服务器

我使用了我校校园邮箱(网易的企业邮箱)进行测试,(很遗憾QQ似乎没有开465端口)。经过测试,发现方法一会被当成垃圾邮件,而且显然不适用我们现在的情况(毕竟你不可能拿网易的服务器给别的邮箱做中转),方法二正常发送。

PS. 建议先用telnet看下你的目的邮箱服务器开了哪个端口,别压根没开465...

获取邮箱的交换服务器域名,即MX记录。

假定我的校园邮箱是abcabcabc@xyz.edu.cn,查询MX记录

1
nslookup -qt=MX xyz.edu.cn
BASH
1
2
3
xyz.edu.cn      MX preference = 10, mail exchanger = hzmx02.mxmail.netease.com
xyz.edu.cn MX preference = 5, mail exchanger = hzmx01.mxmail.netease.com
xyz.edu.cn MX preference = 15, mail exchanger = mxhm.qiye.163.com
STYLUS

随便记下来一个,比如hzmx01.mxmail.netease.com

按如下配置

1
2
/etc/postfix/main.cf:
transport_maps = hash:/etc/postfix/transport
SWIFT
1
2
/etc/postfix/transport:
xyz.edu.cn relay-smtps:hzmx01.mxmail.netease.com:465
STYLUS
1
2
3
4
5
/etc/postfix/master.cf:
relay-smtps unix - - n - - smtp
# Client-side SMTPS requires "encrypt" or stronger.
-o smtp_tls_security_level=encrypt
-o smtp_tls_wrappermode=yes
ROUTEROS

配置完后执行

1
postmap hash:/etc/postfix/transport
ARCADE

生成transport.db

重载配置

1
postfix reload
EBNF

向xyz.edu.cn邮箱发送邮件,成功。

这样配置后,想给哪个邮箱发邮件都得添加transport才行,很麻烦,但是别的办法暂时没找到可行的.......

按理说可以强制全走465端口的...

慢慢再找别的方法吧,现在先凑合着用吧...

3. 方法二 465端口最新配置方法(iptables)

按之前操作成功可以发邮件,但是总不能把所有的邮箱域名都写到transport中,看了官方的transport文档,transport的配置规则是domain transport:nexthop,nexthop要么不写,让它自动去查DNS同时使用25端口;要么就指定域名和端口,无法在指定端口的同时使用DNS查询MX记录。

我想了想,ssl加密和465端口似乎没必然的联系,因为开了加密不指定端口的话还一直用25端口。那只能是在25端口上进行TLS/SMTPS通信。所以,我大胆操作,将25出端口直接映射到465端口,让所有的都按默认走25端口(实际会被转发到465),成功。具体操作如下:

/etc/poostfix/transport修改:

1
2
3
youdomain.com :
.youdomain.com :
* relay-smtps:
NESTEDTEXT

更新postfix配置文件:

1
2
postmap hash:/etc/postfix/transport
postfix reload
SWIFT

设置端口映射,将出的25端口映射到465,我是centos7,以iptables为例。

安装iptables.services,不然systemctl无法启动iptables。

1
yum install iptables-services
CMAKE

配置端口映射

1
iptables -t nat -A OUTPUT -p tcp --dport 25 -j DNAT --to-destination :465
CSS

启动iptables

1
systemctl start iptables
CRMSH

注意:启动iptables后一定不要断开ssh连接,先开另一个终端测试一下能否ssh连到服务器,因为iptables可能有预定义规则拦截,导致连不上新的ssh终端,不要问我为什么知道!如果发现无法登录新的ssh终端,请立刻systemctl stop iptables,把里面的规则删了再重来。

查看所有的iptables规则

1
iptables-save
EBNF

删除所有规则

1
iptables -F
EBNF

这样配置后,只要是在465端口开了SSL的邮箱就都能发,很多企业邮箱都开了,但是遭天谴的QQ邮箱只开了25端口...这就很遗憾,不能给QQ邮箱发邮件了。transport文件也可以灵活配置,对于有的不使用465端口的,可以手动添加到transport中走自己的端口。

方法二补充

时隔一年,又配了一次postfix,发现方法二完全不需要设置transport_maps和relay-smtps ,只要修改master.cf中的

1
smtp      unix  -       -       y       -       -       smtp
EBNF

这是默认的发邮件服务,在这行下面启用tls即可,如下

1
2
3
4
smtp      unix  -       -       y       -       -       smtp
-o smtp_tls_security_level=encrypt
-o smtp_tls_wrappermode=yes
-o smtp_tls_loglevel=1
ROUTEROS

然后同上设置iptables

番外篇

添加DNS记录,让邮件客户端自动配置邮件服务器。主要是配置一些SRV记录,在RFC6186中对这些记录做出了规定,主要可以配置以下几个:

1
2
3
4
5
6
_imap._tcp.         IN      SRV     10 10 143 mail.example.net.
_imaps._tcp. IN SRV 10 10 993 mail.example.net.
_pop3._tcp. IN SRV 10 10 110 mail.example.net.
_pop3s._tcp. IN SRV 10 10 995 mail.example.net.
_smtps._tcp. IN SRV 10 10 465 mail.example.net.
_submission._tcp. IN SRV 10 10 587 mail.example.net.
SHELL

除了这些,也可以添加常见的子域名A记录解析,如smtp./mail./pop3./imap./..... ,虽然邮件客户端不一定去查,但是有些会去查,可以添加上。

更多关于自动配置的可参考

关于windows 10 mail APP无法登录dovecot pop3邮箱的解决办法:

假如你的邮箱地址是apple@goodmail.com,在windows 10 邮件app添加账户时有个“用户名”,这里只写apple,而不能带@goodmail.com。

可以使用openssl测试能否登录:

1
2
3
4
5
6
7
openssl s_client -connect goodmail.com:995
....
+OK Dovecot (Ubuntu) ready.
user apple
+OK
pass yourpassword
+OK Logged in
SHELL

密码是明文密码。


linux搭建邮件服务器 - postifx + SSL + 465端口配置
https://jcdu.top/2021/10/18/linux搭建邮件服务器 - postifx + SSL + 465端口配置/
作者
horizon86
发布于
2021年10月18日
许可协议