提醒:本文最后更新于 1555 天前,文中所描述的信息可能已发生改变,请仔细核实。
如题,最近给服务器搬新家时发现,邮件系统收信时,postfix回显了下面内容,并以内部错误拒绝了对方邮件(对方服务器将会自动按照规定时间重试发送)。
需要先声明一点的是,本文章内容Python环境建立在Python 3基础上;policyd-spf在系统包管理中不存在,在pip中包名为pypolicyd-spf。
policyd-spf[627530]: Traceback (most recent call last):
policyd-spf[627530]: File "/usr/local/bin/policyd-spf", line 809, in
policyd-spf[627530]: instance_dict, configData, peruser, peruserconfigData)
policyd-spf[627530]: File "/usr/local/bin/policyd-spf", line 525, in _spfcheck
policyd-spf[627530]: res = heloquery.check()
policyd-spf[627530]: File "/usr/local/lib/python3.6/site-packages/spf.py", line 595, in check
policyd-spf[627530]: spf = self.dns_spf(self.d)
policyd-spf[627530]: File "/usr/local/lib/python3.6/site-packages/spf.py", line 1164, in dns_spf
policyd-spf[627530]: a = [t for t in self.dns_txt(domain) if RE_SPF.match(t)]
policyd-spf[627530]: File "/usr/local/lib/python3.6/site-packages/spf.py", line 1214, in dns_txt
policyd-spf[627530]: dns_list = self.dns(domainname, rr,ignore_void=ignore_void)
policyd-spf[627530]: File "/usr/local/lib/python3.6/site-packages/spf.py, line 1358, in dns
policyd-spf[627530]: for k, v in DNSLookup(name, qtype, self.strict, timeout):
policyd-spf[627530]: File "/usr/local/lib/python3.6/site-packages/spf.py", line 131, in DNSLookup_dnspython
policyd-spf[627530]: answers = dns.resolver.query(name, qtype, lifetime=timeout)
policyd-spf[627530]: TypeError: query() got an unexpected keyword argument 'lifetime'
postfix/spawn[627529]: warning: command /usr/local/bin/policyd-spf exit status 1
postfix/smtpd[627523): warning: premature end-of-input on private/policyd-spf while reading input attribute name
通过policyd-spf本身代码及错误得知可能是依赖的python3-pyspf(pip包名为pyspf)出问题。
排查后,在pyspf快速开始的“安装”一章中,找到了原因。
虽然pyspf支持dnspython/Py3DNS,但实际用起来是优先使用了dnspython,而最新版本的pyspf需要本地dnspython版本至少是1.16.0及以上。
而在CentOS 8系统包管理中dnspython名为python3-dns,通过dnf检查,可知最新版本为1.15.0-10,不及pyspf最低要求。
所以我们只要通过如下命令更新dnspython即可解决该问题。
pip3 install --upgrade dnspython
当然你也可以卸载dnspython,通过系统包管理安装python3-py3dns包(pip包名为py3dns)来解决这个问题。但万一有其他依赖于dnspython的python脚本就傻眼了。
转载请注明转自:kn007的个人博客的《解决CentOS 8下pypolicyd-spf出错》
CentOS 7 来坐个沙发~
@老杨: 该升级了
更新至 dnspython 1.16
@更新小助手: 怎么老是你。
看到站点活了
差点看错以为你把博客迁移用python了
@World: 这。。。可还行
好久没来了。。~~
@郑永: 欢迎