如何将邮箱拆分为每个邮件一个单独的文件?

8
我希望将我的收件箱分成单独的文件(每个邮件一个文件)通过bash命令或者简单的Java程序。如何实现?
祝好,谢谢。

如果您正在使用mbox,这个链接可以帮助您。还有这个链接 - hamed
3个回答

13

只需使用formail即可。 formail是一个可以处理邮箱、对邮箱中的每个消息运行一些操作、将消息分离等的程序。

更多信息:http://www.manpagez.com/man/1/formail/

如果您只想将邮箱分割成单独的文件,我建议使用以下解决方案:

$ cat $MAIL | formail -ds sh -c 'cat > msg.$FILENO'

来自man手册:

   FILENO
        While splitting, formail  assigns  the  message  number  currently
        being  output  to  this  variable.   By presetting FILENO, you can
        change the initial message number being used and the width of  the
        zero-padded  output.   If  FILENO is unset it will default to 000.
        If FILENO is non-empty and does not contain a number, FILENO  gen-
        eration is disabled.

注意:formail也包含在procmail中-https://github.com/BuGlessRB/procmail


使用Bash和formail,如果您想按文件大小拆分而不是按每封邮件拆分,以便每个拆分生成最多n MB,您将如何执行此操作? - Alex
3
formail 是我计算机上 procmail 的一部分(可通过 apt-get install procmail 安装)。 - Att Righ
“formail” 似乎非常原始。它似乎仅基于以“From: ”开头的行来拆分文件。我的电子邮件正文中有包含该短语的行,而“formail”会将这些电子邮件拆成两个部分,而不是将其视为单个消息。Andrey答案中的“git”解决方案对我更有效。 - Stephen Ostermiller
5
对我来说,这并没有起作用;它只是创建了一个与mbox相同的单个“msg.000”文件。 - ki9

7
我见过的旧邮箱文件是以以"From "开头的一行分隔的消息,后面跟着:
- 对于旧的Eudora文件,要么是"???@???"和一个日期:
From ???@??? Fri Oct 16 10:49:27 1998 - 要么只有"-"和一个日期,适用于Thunderbird文件:
From - Tue Jul 31 13:23:45 2007 所以你可以使用这个Perl oneliner。
perl -pe 'open STDOUT, ">out".++$n if /^From (-|\?{3}\@\?{3}) /' < $IN

或者,如果您的邮箱少于1百万封邮件,可以使用6位数的0填充数字,并添加“.eml”扩展名。
perl -pe 'open STDOUT, sprintf(">m%06d.eml", ++$n) if /^From (-|\?{3}\@\?{3}) /' < $IN

1

还有一个专门的git命令用于此操作:

mkdir messages
git mailsplit -omessages mbox

在一个完全有效的 Thunderbird INBOX 文件上,它显示“邮箱已损坏”。 - user1424074

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接