- 如果出现错误,很多应用程序(例如 cron 等)都会向 root 发送邮件。
- 我看过一些教程,其中涉及安装 postfix + 相当多的配置,以便将它们转发到 gmail 或其他替代方案。配置工作太多了。
- Postfix 如何检测是否有新邮件发送给 root?检查某个文件夹?还是?
- 在全新安装的 Ubuntu 上,cron 仍然可以向 root 发送邮件。它是如何工作的?
- 我希望知道这一点并拦截这些发送给 root 的邮件,然后将它们转发到 telegram/webhook 或其他地方。
可能吗?我的意思是,Postfix 到底是如何做到的?
答案1
Postfix 不会“拦截”电子邮件。它提供sendmail
本地系统调用来发送邮件root
以用于 cronjobs 和其他本地邮件传递任务。深入了解 Postfix 如何处理电子邮件另一方面,对于您的一个问题至关重要,因此请继续阅读。
- 如果出现错误,很多应用程序(例如 cron 等)都会向 root 发送邮件。
- 我看过一些教程,其中涉及安装 postfix + 相当多的配置,以便将它们转发到 gmail 或其他替代方案。配置工作太多了。
这些不是问题,所以我将忽略这些部分。
- 我希望知道这一点并拦截这些发送给 root 的邮件,然后将它们转发到 telegram/webhook 或其他地方。
首先,正如我所说,您不会“拦截”这些消息。您可以在系统上配置 Postfix 或 MTA(邮件服务器)以相应地处理消息。在这种情况下,您需要配置 Postfix,以便将消息root
或类似消息导入自定义代码,然后调用该代码将消息处理为项目,然后放入 webhook 或类似内容中,然后传送到 Telegram 或您想要使用的任何进程。这是实现该功能的唯一方法。
- 在全新安装的 Ubuntu 上,cron 仍然可以向 root 发送邮件。它是如何工作的?
全新安装的 Ubuntu 会在系统中安装基本的邮件功能只是用于将电子邮件传送到root
cronjob 任务。通常,这是一些提供sendmail
本地服务的应用程序。实际的内部流程因以下因素而异:哪个脚本/二进制文件的提供程序sendmail
已经存在,但是对于 Postfix 如何操作,请继续。
- Postfix 如何检测是否有新邮件发送给 root?检查某个文件夹?还是?
无需深入探讨,Postfix 的设计和架构中有多个组件可以处理一般的邮件。Postfix 主站点对此进行了更详细的描述和展示:https://www.postfix.org/OVERVIEW.html-如果您真的想了解内部工作原理,我会从该页面开始并通读整个页面,因为它确实深入解释了所有内容。
但我会尽力将其中的一些内容纳入其中。
首先,邮件在进入传入队列之前会通过几种机制进行传递,这些机制均作为 Postfix 进程的“实时”组件进行处理。如 Postfix 页面中的这张“图表”所示:
来自互联网等的电子邮件消息均被传送到“清理”进程。本地传送的消息通常使用调用sendmail
(cron 实际上会调用!)并被放入进程中postdrop
,进程又将其放入进程中maildrop
,然后进入拾取进程,然后清理消息(包括识别重写、根据 Postfix 配置重定向帐户等)。然后它进入传入队列,然后由 Postfix 的传送机制内部处理。
然后,清理处理器会提醒 Postfix 的队列管理器有东西需要拾取,然后队列管理器会处理这些项目。但是,这是 Postfix 的内部组件,无论邮件来自互联网还是本地,都会发生这种情况。
最终,对于任何邮件投递,Postfix 都会将所有内容投递到incoming
队列,然后提醒 Postfix 的内部系统管理员队列中有需要审查的项目。不过,这一切都是透明的。
一旦进入传入队列,它就会经过更多流程才能被送达:
最终,通过local
、virtual
或pipe
调用处理本地邮件传递 - 本地是直接传递到 Postfix 配置的收件箱位置中的邮箱(/var/mail/USER/INBOX
我相信默认会进入,但不要引用我的话),这就是本地邮件传递到root
cronjobs 等的情况。
答案2
感谢您添加了哪个邮件代理。请参阅“man aliases”以了解 postfix 对邮件别名的说明。
/etc/aliases 是一个文件,其中包含 sendmail 用于重定向邮件的用户别名列表。
例如
root: mouser
将为发送给用户“root”的所有电子邮件创建一个别名给用户“mouser”。
答案3
Postfix 不会“拦截”邮件。为了让系统能够处理任何邮件,您需要安装邮件服务器。Postfix 就是这样的邮件服务器之一(其他邮件服务器包括 Exim 或 sendmail)。
当 cron(或任何其他应用程序)想要发送邮件时,它会调用邮件服务器来执行此操作(从技术上讲,它调用/usr/sbin/sendmail
二进制文件,它是邮件服务器的一部分)。这就是 Postfix(或任何其他邮件服务器)“检测”有电子邮件需要处理的方式 - 它是明确询问通过应用程序来传送该电子邮件。
如果没有邮件服务器,cron 将无法发送任何邮件,只会在日志文件中记录这一事实。在全新安装的 Ubuntu 中,默认情况下没有安装邮件服务器,并且 cron 不会向 root 发送任何邮件(在我安装了各种 Ubuntu 版本的多台机器上证实了这一点)——当然,只要我们谈论的是桌面Ubuntu 版本(如果您只是提到“Ubuntu”而没有任何特定的形容词,则假定它是标准桌面版本)。
在 Ubuntu 上服务器,可能默认安装了某个邮件服务器,因此 cron 能够向 root 发送邮件。由于我不使用 Ubuntu Server,所以我不知道它是哪个邮件服务器。您必须通过查看已安装软件包的列表自行确定它是哪一个。
如果要安装 Postfix,则应卸载当前安装的邮件服务器(Postfix 的安装可能会自动卸载它,但我不确定),因为两个不同的邮件服务器不能共存于同一台计算机上。Postfix 安装将用Postfix 的一部分的/usr/sbin/sendmail
新二进制文件替换当前邮件服务器中的当前二进制/usr/sbin/sendmail
文件。但是,您不需要用 Postfix 替换当前邮件服务器来将邮件转发到其他任何地方,因为几乎每个邮件服务器都具有类似的转发功能。无论/etc/aliases
使用哪个邮件服务器,另一个答案中描述的文件都应该以相同的方式工作。
如果你在文件中放入以下行/etc/aliases
:
root: [email protected]
它会将 root 的邮件转发到 Gmail,但 Gmail 可能由于各种原因而不接受该邮件,我在此不再赘述(但这些原因正是您在网上找到的教程如此复杂的原因)。转发到其他服务可能会产生更好的效果。
如果您希望 root 的邮件由某些脚本处理(例如,将其发布到 Telegram 的脚本),请在中使用以下行/etc/aliases
:
root: |/path/to/your/script
最后,你应该考虑到,通常强烈反对转发 root 的邮件(它甚至写在标准默认/etc/aliases
文件的注释中)。邮件服务器将 root 帐户视为“最后的手段”邮件目的地:如果由于任何原因邮件无法送达收件人或退回发件人,则将其发送到 root 帐户。如果您转发 root 的邮件并在转发过程中发生错误,您将不会获得任何“最后的手段”目的地,并且邮件将丢失。