我配置了 OpenDkim 以与 postfix 配合使用,但当我尝试发送邮件时出现以下错误:
postfix/cleanup[11542]: 40F271A291A: milter-reject: END-OF-MESSAGE from ***[***]: 4.7.1 Service unavailable - try again later; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<[192.168.1.10]>
我已将 opendkim 配置为使用 unix 套接字,并且它正在运行:
[chazy@mail ~]$ sudo netstat -nalp | grep dkim
unix 2 [ ACC ] STREAM LISTENING 144135 11267/opendkim /run/opendkim/opendkim.sock
unix 3 [ ] STREAM CONNECTED 147626 11267/opendkim /run/opendkim/opendkim.sock
unix 2 [ ] DGRAM 144137 11267/opendkim
Opendkim 由其自己的用户启动,正如 Arch wiki 所建议的那样(以及其他安全建议)。这些文件夹也归 opendkim:mail 所有。
我对所有域使用相同的选择器和签名密钥,这有问题吗?
Postfix配置如下:
# DKIM
milter_default_action = accept
smtpd_milters = unix:/run/opendkim/opendkim.sock
non_smtpd_milters = unix:/run/opendkim/opendkim.sock
目前没有安装反垃圾邮件服务,只安装基本的 postfix/dovecot/opendkim 配置来测试服务器。
Opendkim 配置:
# /etc/opendkim/opendkim.conf
BaseDirectory /var/lib/opendkim
Canonicalization relaxed/simple
Domain domain1.com domain2.com
ExternalIgnoreList refile:/etc/opendkim/TrustedHosts
InternalHosts refile:/etc/opendkim/TrustedHosts
KeyFile /etc/opendkim/201704.private
KeyTable refile:/etc/opendkim/KeyTable
Selector 201704
SigningTable refile:/etc/opendkim/SigningTable
Socket local:/run/opendkim/opendkim.sock
Syslog Yes
TemporaryDirectory /run/opendkim
UMask 002
UserID opendkim:mail
TrustedHosts 配置:
# /etc/opendkim/TrustedHosts
# Trusted Hosts List
127.0.0.1
::1
x.x.x.x # Server IP
mail.maindomain.com
# Domains
maindomain.com
domain2.com
答案1
就我而言,问题在于签名密钥文件具有 root 所有者,因此执行以下操作:
sudo chown opendkim:mail /etc/opendkim/selector.private
已解决问题。
如果这不是你的问题,不要忘记查看日志!postfix 和 opendkim(我忘了查找 opendkim,那里有错误):
journalctl --follow --unit postfix.service --unit opendkim.service
答案2
问题:
还有另外一件事也会导致这个错误,这是我刚刚痛苦地发现的:
BaseDirectory /run/opendkim
您可能会认为您正在将 opendkim 指向 PID 所在的位置......
解决方案:
#BaseDirectory /run/opendkim
这就是指令实际上做什么以及为什么提供服务”milter-reject:来自...的消息结束:4.7.1 服务不可用“
基本目录(字符串)
如果设置,则指示过滤器在执行其他任何操作之前使用 chdir(2) 更改为指定目录。这意味着配置文件中其他地方引用的任何文件都可以相对于此目录指定。它对于安排将任何崩溃转储保存到特定位置也很有用。
参考:http://www.opendkim.org/opendkim.conf.5.html
当我将其注释掉后,一切都开始正常工作。
这是我正在使用的默认值,并且看到其他样本配置也使用该值,因此最初没有给予它权重并寻求与不正确的权限相关的解决方案。
确保此指令的值正确,否则您将花费数小时来追寻目标。日志记录至少毫无帮助。
答案3
尝试从您用作签名表的文件中删除“*@”是否可行。这就是导致我出现此问题的原因,尽管我已经
SigningTable refile:<directory to signing table file>
在我的 opendkim.conf 中。
答案4
就我的情况而言,发出的消息实在太大了。
修复该问题后,我得到:
Sep 24 20:05:20 va1my postfix/smtp[23682]: C553B48F30: to=<XXX>, relay=XXXXX:25, delay=2979299, delays=2979298/0.01/0.13/0.72, dsn=5.2.3, status=bounced (host XXXXXX said: 552-5.2.3 Your message exceeded message size limits. Please visit 552-5.2.3 XXXX to view our size 552 5.2.3 guidelines. (in reply to end of DATA command))
为了修复它,我添加了/etc/opendkim.conf
:
MaximumHeaders 0
并重新启动 opendkim service opendkim restart
(或systemctl restart opendkim
)。
设置 256k 的限制没有帮助,因为标题更大,所以我设置了 0 来禁用限制。我可以再次注释该行,因为根本原因已经消失。
旁注,真正的原因
由于将日志的输出通过管道传输到 sendmail 而没有添加报头,因此报头可能太大。
我是这样实现的,但没有意识到这封邮件被卡住了:
grep FILTER FILE | sendmail [email protected]
为了正确使用“sendmail”编写脚本,我做了如下操作:
#!/bin/bash
# TMP_FILE and SUBJECT are set somewhere in the script.
# Prepend the $SUBJECT to the script output sent by mail.
( echo "Subject: $SUBJECT" \
&& cat $TMP_FILE \
) | \
/usr/sbin/sendmail $1