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