如何使用 procmail 拆分单个邮件?
How to split single mail with procmail?
我有一个隔离文件夹,我必须定期下载它并按收件人收件箱拆分,或者最好将每封邮件拆分为一个文本文件。我有 c.a。每天 10.000 封邮件,我正在用 fetchmail 和 procmail 编写一些代码。问题是我无法找到如何在 procmail 中逐条拆分消息;他们最终都在同一个收件箱中。
我尝试通过如下配方传递脚本中的每条消息:
:0
| script_processing_messages.sh
其中包含
read varname
echo "$varname" > test_file
尝试查看是否可以在 $varname 变量中获取一条消息,但是不行,我每次只获取一行消息。
现在我用
fetchmail --keep
.fetchmailrc 在哪里
poll mail.mymta.my protocol pop3 username "my@inbox.com" password "****" mda "procmail /root/.procmailrc"
.procmailrc 是
VERBOSE=0
DEFAULT=/root/inbox.quarantine
我想为每条消息获取一个文件,所以:
1.txt
2.txt
3.txt
[...]
10000.txt
我有很多收件人和很多域,所以我不能说写 5000 条规则来匹配每个收件人。要是有什么就好了
^To: $USER
重定向到
/$USER.inbox
以便 procmail 本身负责动态地读取和创建这些收件箱
我不是 fetchmail 和 procmail 配方方面的专家,我正在努力但我不会走得太远。
我找到了部分问题的解决方案。
procmail似乎没有办法让procmail自己识别收件人而不在配方中指定它,所以我只是获取了一个列表并创建了一个巨大的配方文件。
但后来我才发现,要保存单个邮件并避免装满大量邮件的巨大邮箱,可以只写一个食谱,例如:
:0
* ^To: recipient@mail.it
/inbox/folder/recipient@mail.it/
注意末尾的 /
:这将使 procmail 创建一个文件夹结构,而不是在单个文件中写入所有内容。
您似乎有两三个不同的问题; Stack Overflow 上的适当礼仪是分别询问每个人 - 这也有助于未来的访问者遇到您的问题之一。
首先,要拆分包含多条消息的 Berkeley mbox 文件和 运行 Procmail,请尝试
formail -s procmail -m <file.mbox
您可能需要阅读 mailbox formats supported by Procmail。 Berkeley 邮箱是包含多条消息的单个文件,仅由以 From
开头的行分隔(在四个字母字符后有 space)。此分隔符必须是唯一的,因此在 body 的一行开头包含这五个字符的消息将需要以某种方式进行转义(通常通过在 From
之前写一个 >
).
要将每封邮件保存在单独的文件中,请选择与 single-file Berkeley 格式不同的邮箱格式。具体来说,如果目标是目录,Procmail 将在该目录中创建一个新文件。新文件的确切命名方式取决于目录的内容(如果它包含 Maildir 子目录 new
、tmp
和 cur
,则新文件将在 new
根据 Maildir 命名约定)以及如何准确指定目录(尾部斜杠和点选择 MH 格式;否则,邮件目录格式)。
将每个收件人保存到一个邮箱有许多讨厌的极端情况。如果邮件被发送给多个本地收件人怎么办?如果收件人地址在 headers 中不可见怎么办?等等(Procmail Mini-FAQ 在域的虚拟托管上下文中有 a section about this,这基本上是其变体)。但是如果我们简单地忽略这些,你也许可以用像
这样的东西来实现它
:0 # whitespace before ] is a literal tab
* ^TO_\/[^ @ ]+@(yourdomain\.example|example\.info)\>
{
# Trim domain part from captured MATCH
:0
* MATCH ?? ^\/[^@]+
./$MATCH/
}
这将捕获到 $MATCH
匹配正则表达式的第一个地址,然后对捕获的字符串执行另一个正则表达式匹配以仅捕获 @
符号之前的部分。这显然要求你要匹配的地址都在一组特定的域中(这里,我使用了yourdomain.example
和example.info
;显然用你的实际域名替换它们)并且捕获第一个匹配address 就足够了(所以如果消息是 To: alice@yourdomain.example
和 Cc: bob@example.info
,无论哪个更接近消息的顶部都会被这个配方挑选出来,而另一个将被忽略)。
更详细地说,\/
特殊标记使 Procmail 将此点之后与正则表达式匹配的文本复制到内部变量 MATCH
中。正如这个秘籍所演示的,您可以对该变量本身执行正则表达式匹配以提取它的子字符串(或者,换句话说,丢弃捕获的匹配项的一部分)。
操作 ./$MATCH/
使用 MATCH
中捕获的字符串作为要保存到的文件夹的名称。前导 ./
指定当前目录(等于 Procmail 变量 MAILDIR
的值),尾随 /
选择邮件目录格式。
如果您的预期收件人不能被限制在一组特定的域中或以其他方式与单个正则表达式匹配,我的建议是提出一个范围更有限的新问题,并提供足够的详细信息来实际识别您的内容想要完成。
我有一个隔离文件夹,我必须定期下载它并按收件人收件箱拆分,或者最好将每封邮件拆分为一个文本文件。我有 c.a。每天 10.000 封邮件,我正在用 fetchmail 和 procmail 编写一些代码。问题是我无法找到如何在 procmail 中逐条拆分消息;他们最终都在同一个收件箱中。
我尝试通过如下配方传递脚本中的每条消息:
:0
| script_processing_messages.sh
其中包含
read varname
echo "$varname" > test_file
尝试查看是否可以在 $varname 变量中获取一条消息,但是不行,我每次只获取一行消息。
现在我用
fetchmail --keep
.fetchmailrc 在哪里
poll mail.mymta.my protocol pop3 username "my@inbox.com" password "****" mda "procmail /root/.procmailrc"
.procmailrc 是
VERBOSE=0
DEFAULT=/root/inbox.quarantine
我想为每条消息获取一个文件,所以:
1.txt
2.txt
3.txt
[...]
10000.txt
我有很多收件人和很多域,所以我不能说写 5000 条规则来匹配每个收件人。要是有什么就好了
^To: $USER
重定向到
/$USER.inbox
以便 procmail 本身负责动态地读取和创建这些收件箱
我不是 fetchmail 和 procmail 配方方面的专家,我正在努力但我不会走得太远。
我找到了部分问题的解决方案。
procmail似乎没有办法让procmail自己识别收件人而不在配方中指定它,所以我只是获取了一个列表并创建了一个巨大的配方文件。
但后来我才发现,要保存单个邮件并避免装满大量邮件的巨大邮箱,可以只写一个食谱,例如:
:0
* ^To: recipient@mail.it
/inbox/folder/recipient@mail.it/
注意末尾的 /
:这将使 procmail 创建一个文件夹结构,而不是在单个文件中写入所有内容。
您似乎有两三个不同的问题; Stack Overflow 上的适当礼仪是分别询问每个人 - 这也有助于未来的访问者遇到您的问题之一。
首先,要拆分包含多条消息的 Berkeley mbox 文件和 运行 Procmail,请尝试
formail -s procmail -m <file.mbox
您可能需要阅读 mailbox formats supported by Procmail。 Berkeley 邮箱是包含多条消息的单个文件,仅由以 From
开头的行分隔(在四个字母字符后有 space)。此分隔符必须是唯一的,因此在 body 的一行开头包含这五个字符的消息将需要以某种方式进行转义(通常通过在 From
之前写一个 >
).
要将每封邮件保存在单独的文件中,请选择与 single-file Berkeley 格式不同的邮箱格式。具体来说,如果目标是目录,Procmail 将在该目录中创建一个新文件。新文件的确切命名方式取决于目录的内容(如果它包含 Maildir 子目录 new
、tmp
和 cur
,则新文件将在 new
根据 Maildir 命名约定)以及如何准确指定目录(尾部斜杠和点选择 MH 格式;否则,邮件目录格式)。
将每个收件人保存到一个邮箱有许多讨厌的极端情况。如果邮件被发送给多个本地收件人怎么办?如果收件人地址在 headers 中不可见怎么办?等等(Procmail Mini-FAQ 在域的虚拟托管上下文中有 a section about this,这基本上是其变体)。但是如果我们简单地忽略这些,你也许可以用像
这样的东西来实现它:0 # whitespace before ] is a literal tab
* ^TO_\/[^ @ ]+@(yourdomain\.example|example\.info)\>
{
# Trim domain part from captured MATCH
:0
* MATCH ?? ^\/[^@]+
./$MATCH/
}
这将捕获到 $MATCH
匹配正则表达式的第一个地址,然后对捕获的字符串执行另一个正则表达式匹配以仅捕获 @
符号之前的部分。这显然要求你要匹配的地址都在一组特定的域中(这里,我使用了yourdomain.example
和example.info
;显然用你的实际域名替换它们)并且捕获第一个匹配address 就足够了(所以如果消息是 To: alice@yourdomain.example
和 Cc: bob@example.info
,无论哪个更接近消息的顶部都会被这个配方挑选出来,而另一个将被忽略)。
更详细地说,\/
特殊标记使 Procmail 将此点之后与正则表达式匹配的文本复制到内部变量 MATCH
中。正如这个秘籍所演示的,您可以对该变量本身执行正则表达式匹配以提取它的子字符串(或者,换句话说,丢弃捕获的匹配项的一部分)。
操作 ./$MATCH/
使用 MATCH
中捕获的字符串作为要保存到的文件夹的名称。前导 ./
指定当前目录(等于 Procmail 变量 MAILDIR
的值),尾随 /
选择邮件目录格式。
如果您的预期收件人不能被限制在一组特定的域中或以其他方式与单个正则表达式匹配,我的建议是提出一个范围更有限的新问题,并提供足够的详细信息来实际识别您的内容想要完成。