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端口

常用命令:
查看邮件队列

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

查看日志:

copy
systemctl status postfix journalctl -u postfix # 下面这个查看的日志详细 journalctl -u postfix@-

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

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

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

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

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

1. 安装postfix3

copy
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

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

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

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

2. 配置postfix client tls

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

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

copy
# /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

到这里,在邮件客户端开启SSL收件应该已经不成问题,但是还无法发邮件。
然后参看官网的指导:
http://www.postfix.org/TLS_README.html#quick-client
http://www.postfix.org/TLS_README.html#client_smtps
先来自动生成tls client端的配置项。只有tls配置是默认时此命令才有效,否则不会更改配置文件。

copy
postfix tls enable-client

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

copy
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

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":

copy
/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

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:

copy
/etc/postfix/main.cf: transport_maps = hash:/etc/postfix/transport
copy
/etc/postfix/transport: example.com relay-smtps:example.com:465
copy
/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

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记录

copy
nslookup -qt=MX xyz.edu.cn
copy
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

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

按如下配置

copy
/etc/postfix/main.cf: transport_maps = hash:/etc/postfix/transport
copy
/etc/postfix/transport: xyz.edu.cn relay-smtps:hzmx01.mxmail.netease.com:465
copy
/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

配置完后执行

copy
postmap hash:/etc/postfix/transport

生成transport.db
重载配置

copy
postfix reload

向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修改:

copy
youdomain.com : .youdomain.com : * relay-smtps:

更新postfix配置文件:

copy
postmap hash:/etc/postfix/transport postfix reload

设置端口映射,将出的25端口映射到465,我是centos7,以iptables为例。
安装iptables.services,不然systemctl无法启动iptables。

copy
yum install iptables-services

配置端口映射

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

启动iptables

copy
systemctl start iptables

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

copy
iptables-save

删除所有规则

copy
iptables -F

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

方法二补充

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

copy
smtp unix - - y - - smtp

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

copy
smtp unix - - y - - smtp -o smtp_tls_security_level=encrypt -o smtp_tls_wrappermode=yes -o smtp_tls_loglevel=1

然后同上设置iptables

番外篇

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

copy
_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.

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

关于windows 10 mail APP无法登录dovecot pop3邮箱的解决办法:
假如你的邮箱地址是apple@goodmail.com,在windows 10 邮件app添加账户时有个“用户名”,这里只写apple,而不能带@goodmail.com。
可以使用openssl测试能否登录:

copy
openssl s_client -connect goodmail.com:995 .... +OK Dovecot (Ubuntu) ready. user apple +OK pass yourpassword +OK Logged in

密码是明文密码。

posted @   王冰冰  阅读(8751)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起