通过bash从文件中检索电子邮件主题

时间:2016-09-12 19:25:21

标签: bash email sed

我有一个shell脚本,可以将文件从服务器邮件文件夹下载到NAS设备,这样客户端就可以在本地创建备份副本。

文件保存为 11469448248.H15587P19346.smtp.x14.eu_2,S 文件。 我已将扩展名更改为标准.eml格式,以便电子邮件客户端可以从光盘中读取它们。

for f in *.smtp.x14.eu_2,S; do
#sed "9q;d" $f
#tail -n+9 $f | head -n1
mv -- "$f" "${f%.smtp.x14.eu_2,S}.eml";
done

正如您所看到的,我尝试使用 sed tail 命令从文件中获取第9行;问题是主题并不总是在第9行,而文件名的内容并不多。

我正在尝试将文件名称设置为可理解的格式,因此我认为该主题可能会有所帮助。

在电子邮件文件的第n行是以主题:PD:主题

开头的行

我试图找到这条线摆脱主题:PD:并将其余部分留作ne文件名

1 个答案:

答案 0 :(得分:2)

以下是错误,但实现了您似乎要问的内容。

subj=$(sed -n '/^Subject: PD *//!d;p;q;/^$/q' "$f")

这个问题是它在成功的情况下取得了成功,但是当你有一个MIME RFC2047编码的Subject:标题时会失败,而当Subject:标题超过一个标题时(更简单地说)单行。

我会用更现代的编程语言来解决这个问题。它不是一个单行,但用Python很容易。

subj=$(./emailsubj.py "$f")

其中emailsubj.py包含或多或少的内容

#!/usr/bin/env python
from email.parser import Parser
from email.header import Header, decode_header
from sys import argv

for filename in argv[1:]:
    with open(filename, 'rb') as handle:  # handle file not found etc?
        message = Parser().parse(handle)
    try:
        subj = ''.join([frag.decode(enc) if enc else frag
            for frag, enc in decode_header(message['subject'])])
    except HeaderParseError, UnicodeDecodeError:
        subj = message['subject']   # maybe warn about error?
    print(subj)

(显然请记住chmod +x emailsubj.py。)