使用shell脚本从Postfix读取邮件

使用shell脚本从Postfix读取邮件

我希望能够使用 shell 脚本读取来自 Postfix MTA 的传入邮件。shell 脚本应该能够检索邮件头、主题、正文、附件等,然后将邮件标记为已读。邮件以 Maildir/ 格式存储。在 Postfix 中读取邮件时,邮件会从 Maildir/new 文件夹移动到 Maildir/cur 文件夹,这有助于保留该文件夹作为备份,以防需要重新处理邮件。

我已经在 Google 上搜索了很久,但没找到任何有用的东西,有很多关于如何发送邮件的示例,但没有通过脚本读取邮件的有用信息。mail/mailx 命令似乎只允许交互式访问,似乎没有通过 shell 脚本使用它的选项。这只需要对一个用户起作用,因为我正在使用 catchall 配置将所有传入邮件捕获到单个邮箱中,以便脚本进行后续处理。

总是可以选择使用 cronjob 或 incron 轮询 Maildir/new 文件夹以查找传入消息,但我认为使用 Postfix 的邮件管理功能比手动管理 msg 文件更好。我的脚本将位于 Postfix 服务器本地。

有什么建议或想法吗?谢谢。

编辑:也许我应该提到我不是在寻求有关脚本的帮助。我正在寻找一些命令行工具,可以访问 Postfix Maildir/msg 存储并读取/处理消息,并且可以以非交互方式调用。换句话说,邮件工具的基本功能是非交互式的。

答案1

我发现了以下内容:

http://notes-cs.blogspot.in/2013/04/use-command-line-to-read-linux-local.html

这个人准确地描述了我所寻找的东西。纯粹的天才!抓住了本质(以下所有内容均来自上面的链接):

将所有电子邮件打印到 STDOUT:

$ echo "type *" | mail

$ echo "type 1" | mail   # print the first email to stdout

$ echo "type 3-5" | mail # print the emails from 3 to 5

检查邮箱是否为空(即“未找到 [用户名] 的邮件”):

$ echo q | mail 2>&1 | grep "No mail for [username]"

清空邮箱:

$ echo "d *" | mail

$ echo "d 3" | mail     # Delete the 3rd email

将所有电子邮件保存在文本文件中:

$ echo "s * test.txt" | mail

将一定范围内的电子邮件保存在文件中:

$ echo "s 3-6 test.txt" | mail # this will save email from #3 to #6 to the file test.txt

从邮箱中读取一封电子邮件:

$ echo 1 | mail # Read the first mail from mail box:

$ echo 5 | mail # Read the 5th email from mail box: 

$ echo 6 | mail

如果邮箱里没有第6封邮件,会提示如下错误:

6: Invalid message number

错误消息“无效的消息编号”告诉您邮箱中没有第 6 封电子邮件。如果成功返回第 5 封电子邮件。您可以将错误消息“无效的消息编号”视为邮箱的结尾,就像文件的 EOF 一样。将其与循环结合,您可以浏览邮箱内的所有电子邮件。

答案2

你的 Google Fu 不够。

一个简单的解决方案是 sendmail 风格~/.forward文件中,您将|直接将邮件传送到脚本,然后才将其写入邮箱。然后,脚本将执行其操作,并将邮件消息写入磁盘。

类似地,但当你配置 procmail作为邮件传递代理并设置~/.procmailrc将消息转发到您的脚本。

另一种方法是安装 IMAP 或 POP3 守护程序并使用fetchmail轮询您的邮箱并阅读任何新消息并将其交给您的脚本。

相关内容