bash - 将电子邮件文本从 procmail 重定向到 bash 脚本

标签 bash redirect input procmail

我正在尝试将与特定模式匹配的电子邮件重定向到 shell 脚本,该脚本将创建包含文本的文件,并带有日期标记的文件名。

首先,这是 .procmailrc 中的例程,它将电子邮件交给脚本:

:0c:
* Subject: ^Ingest_q.*
| /home/myname/procmail/process

这是脚本“进程”:

#!/bin/bash

DATE=`date +%F_%N`
FILE=/home/myname/procmail/${DATE}_email.txt

while read line
        do
            echo "$line" 1>>"$FILE";
        done

我对此感到非常沮丧,因为我可以在命令行上将文本通过管道传输到此脚本,并且它工作正常:

mybox-248: echo 'foo' | process
mybox-249: ls
2013-07-31_856743000_email.txt  process

该文件包含单词“foo”。

几个小时以来,我一直在尝试获取电子邮件文本以将其输出为带日期标记的文件,但没有任何效果。

(我还在我的 .procmailrc 中打开了登录功能,但这也不起作用——我并不是想通过提及这一点来提出第二个问题,只是想知道这是否可以提供一些关于我的内容的提示可能做错了......)。

谢谢

GB

最佳答案

引用您的尝试:

:0c:
* Subject: ^Ingest_q.*
| /home/myname/procmail/process

正则表达式错误,^ 仅匹配行首,因此不能出现在 Subject: 之后。试试这个。

:0c:process.lock
* ^Subject: Ingest_q
| /home/myname/procmail/process

我还指定了一个命名的锁定文件;我不相信 Procmail 可以仅从脚本名称推断出锁定文件名。由于您可能同时发送多封电子邮件,并且您不希望它们的日志记录混合在日志文件中,因此此处需要使用锁定文件。

最后,正则表达式中的尾随 .* 完全是多余的,所以我将其删除。

(旧的 Procmail mini-FAQ 还解决了这些 both 中的 issues 。)

我意识到你的食谱可能只是在开始更大的事情之前的快速测试,但是调用 process 脚本的整个食谱可以完全替换为类似的内容

MAILDIR=/home/myname/procmail
DATE=`date +%F_%N`
:0c:
${DATE}_email.txt

这将生成 Berkeley mbox 格式,即每条消息在真正的 header 之前应该有一个 From_ 伪 header ;如果您不确定这是否已经是这种情况,您可能应该使用 procmail -Yf- 来确保做到这一点(否则确实无法判断一条消息在哪里结束而另一条消息在哪里开始;这既适用于您的原始解决方案,也适用于此替代方案)。

因为 Procmail 会看到您要发送到的文件名,所以它现在可以推断出锁定文件名,这是一个小好处。

使用 MAILDIR 指定目录是执行此操作的传统方法,但当然,如果您愿意,也可以指定 mbox 文件的完整路径。

关于bash - 将电子邮件文本从 procmail 重定向到 bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17976645/

相关文章:

jsf - 如何发送表单输入值并调用 JSF bean 中的方法

linux - 一行将与模式匹配的文件 move 到新目录

regex - 使用 sed 替换列字段分隔符

linux - 使用 sed 反向 IP 地址格式

java - 使用SSO时如何处理Http session 超时

python - 如何在 Python 中打开并读取输入文件并将其打印到输出文件?

linux - 解析数组时的异常行为

http - 具有 www 的域与非 www 的 IP 不同

windows - Python 看不到 C :\Windows\System32\GroupPolicy 中的文件或文件夹

PHP 游戏无法识别位置