我已经设置了一个 postfix 邮件服务器,现在我可以通过“localhost”、端口 25 连接到 smtp 服务器发送电子邮件。
但我不知道如何检查邮件是以哪个用户的身份发送的。我可以不验证身份就发送,尽管这不是开放中继:它似乎仅适用于本地主机。
我希望被强制进行身份验证,或者至少知道哪个用户正在发送邮件,这样我就可以为他设置配额,以及允许的“发件人”(现在,当通过 php 脚本发送时,我可以选择任何可用的域作为发件人)
除了 /var/log/maillog 中的邮件“发件人”和“收件人”之外,我找不到任何其他内容。
有任何想法吗?
答案1
您所问的问题有相当多的要点。
首先,“发件人:”行的概念并不直观,因为当您发送邮件时,您可以在邮件上写上您想要的任何信封地址(sendmail 命令上的 -f 标志)。这就是您可以从不存在的域/帐户(noreply@ 等)发送邮件的方式。
然而本质上你的服务器总是会本地信任自己(因此能够发送邮件而无需身份验证)。这是关键点,也是垃圾邮件发送者在利用服务器时最大程度利用的一点。
在后缀配置中它可能看起来像这样:
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks
这一行基本上是这样的:允许经过身份验证的用户,允许本地用户。
然而值得指出的是,当您在本地生成邮件时,它通常不会使用 SMTP 发送,而是使用 sendmail(或同等程序)直接注入本地邮箱的邮件队列,这样它可以绕过许多为外部用户设置的系统。
因此,假设您的用户只是使用 PHP 中的 mail() 函数,您需要禁用本地邮件注入,并让所有邮件通过 SMTP 通过邮箱(或另一个邮箱,如果您愿意)进行“中继”(而不是注入)。我猜这可以在您的 php.ini 中完成(虽然我自己没有这样做)。
这样,您就可以在邮件服务器上设置限制来限制帐户,并且他们不能通过将邮件转储到本地队列来绕过这些限制。
答案2
该电子邮件中的“发件人”地址是什么/var/log/maillog
?“发件人”地址的第一部分是本地用户的名称。我敢打赌,apache
如果您使用的是 CentOS 或www-data
Debian,那么它就是本地用户的名称。