当 postfix 需要 TLS 时自动通知?

当 postfix 需要 TLS 时自动通知?

我已经在 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_sessionintosmtpd_recipient_restrictions并设置plaintext_reject_code530。例如:

# /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发送本地消息。如果发生这种情况,请通过发出命令将其配置为在宽松模式下运行。sendmailmailxrsyslogsemanage permissive -a syslogd_t

答案2

您可以使用一些后缀日志解析器并检测此错误,然后向发件人发送自动回复电子邮件。

考虑加密作为一种选择,最好不要通过设置来强制执行smtpd_enforce_tls = yes

仅供注意,在公共 SMTP 服务器上强制执行该规则违反了规定RFC 3207

相关内容