wangbingbing

整体参考: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端口

常用命令:
查看邮件队列

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

查看日志:

systemctl status postfix
journalctl -u postfix

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

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

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

解决办法:
安装postfix3,并按照官方文档配置。

安装postfix3

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,请使用如下命令:

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

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

配置postfix client tls

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

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

# /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配置是默认时此命令才有效,否则不会更改配置文件。

postfix tls enable-client

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

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

根据官网的说明:

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

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

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

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

按如下配置

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

配置完后执行

postmap hash:/etc/postfix/transport

生成transport.db
重载配置

postfix reload

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

这样配置后,想给哪个邮箱发邮件都得添加transport才行,很麻烦,但是别的办法暂时没找到可行的.......
按理说可以强制全走465端口的...
慢慢再找别的方法吧,现在先凑合着用吧...

465端口最新配置方法

按之前操作成功可以发邮件,但是总不能把所有的邮箱域名都写到transport中,看了官方的transport文档,transport的配置规则是domain transport:nexthop,nexthop要么不写,让它自动去查DNS同时使用25端口;要么就指定域名和端口,无法在指定端口的同时使用DNS查询MX记录。
我想了想,ssl加密和465端口似乎没必然的联系,因为开了加密不指定端口的话还一直用25端口。那只能是在25端口上进行TLS/SMTPS通信。所以,我大胆操作,将25出端口直接映射到465端口,让所有的都按默认走25端口(实际会被转发到465),成功。具体操作如下:
/etc/poostfix/transport修改:

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

更新postfix配置文件:

postmap hash:/etc/postfix/transport
postfix reload

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

yum install iptables-services

配置端口映射

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

启动iptables

systemctl start iptables

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

iptables-save

删除所有规则

iptables -F

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

分类:

技术点:

相关文章:

  • 2022-12-23
  • 2021-11-23
  • 2022-02-08
  • 2021-12-06
  • 2021-06-22
  • 2021-12-04
  • 2021-11-22
  • 2022-01-15
猜你喜欢
  • 2022-12-23
  • 2021-08-11
  • 2022-12-23
  • 2021-11-19
  • 2022-02-12
  • 2022-02-08
  • 2021-08-26
相关资源
相似解决方案