我已经在 CentOS 7 上设置了 postfix,并将其配置为需要 STARTTLS 来接受传入的邮件。我遇到过一些情况,其中服务器出于某种原因不支持 TLS 加密,因此永远不会发出 STARTTLS 并且电子邮件会被退回。就像应该的那样。但发件人通常只是从他们的邮件服务器收到“无法送达”的消息,并且通常无法知道发生了什么,更不用说采取任何措施了。
由于发送服务器通常FROM
在发送Must issue a STARTTLS command first
响应之前发出消息,因此发送者的地址可能在某处可用。是否有任何实用程序可以抓取该信息并发送带有解释和备用地址或联系表格链接的自动回复?
答案1
正如 @F.sb 所说,您可以通过解析 Postfix 日志来发现提交未加密电子邮件的发件人地址。但是,在我的测试环境中,我发现如果smtpd_tls_security_level
设置为encrypt
(或者以等效方式smtpd_enforce_tls
设置为yes
),Postfix 不会记录发件人地址。因此,为了从日志中获取发件人地址,smtpd_tls_security_level
必须设置为may
,并且在此步骤中必须拒绝未加密的消息RCPT TO
。为了实现这一点,请包含reject_plaintext_session
intosmtpd_recipient_restrictions
并设置plaintext_reject_code
为530
。例如:
# /etc/postfix/main.cf
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/postfix/postfix.crt
smtpd_recipient_restrictions = reject_unauth_destination,reject_plaintext_session,permit
plaintext_reject_code = 530
然后,您可以配置rsyslog
运行自定义可执行文件并通过STDIN
.例如:
# /etc/rsyslog.d/postfix-logs.conf
module(load="omprog")
template(name="PostfixLogs" type="string" string="%syslogtag% %msg%\n")
:syslogfacility-text, isequal, "mail" action(type="omprog"
binary="/usr/local/bin/postfix-tls-notify.sh"
template="PostfixLogs")
在该自定义可执行文件中,您将能够捕获发件人地址sed
并发送自动回复:
# /usr/local/bin/postfix-tls-notify.sh
/usr/bin/sed -run 's/^postfix\/smtpd(|\[[0-9]+\]):\s+noqueue:\s+reject:\s+rcpt\s+from\s+[^;]+session\s+encryption\s+is\s+required;\s+from=<([^>; ]+)>.*$/\2/ip' | while read sender; do
/usr/bin/mailx -s 'Automatic notification' "${sender}" <<'MESSAGE'
Please, send your inquiries by using https://www.example.com/contact.html
MESSAGE
done
注意:SELinux 可能会阻止通过(由 调用)rsyslog
发送本地消息。如果发生这种情况,请通过发出命令将其配置为在宽松模式下运行。sendmail
mailx
rsyslog
semanage permissive -a syslogd_t
答案2
您可以使用一些后缀日志解析器并检测此错误,然后向发件人发送自动回复电子邮件。
考虑加密作为一种选择,最好不要通过设置来强制执行smtpd_enforce_tls = yes
仅供注意,在公共 SMTP 服务器上强制执行该规则违反了规定RFC 3207