我希望能够使用 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
轮询您的邮箱并阅读任何新消息并将其交给您的脚本。