gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:58:29 24 4
gpt4 key购买 nike

我有一个 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

如您所见,我尝试使用 sedtail 命令从文件中获取第 9 行;问题是主题并不总是在第 9 行,并且文件名并没有说明其大部分内容。

我正在尝试使文件名采用易于理解的格式,因此我认为该主题可能会有所帮助。

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

我试图找到这一行,去掉主题:PD:并将其余部分保留为新文件名

最佳答案

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

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

这样做的问题是,它在简单的情况下会成功,但当您有 MIME RFC2047 编码的 Subject: header 时,以及(更简单地)Subject: header 跨越一行以上。

我会用稍微更现代的编程语言来解决这个问题。这并不完全是一句简单的话,但使用 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。)

这会检索整个 Subject: header ,对于模块化工具来说似乎是一个很好的设计。如果您想在提取 header 后删除前缀,shell 有简单的工具 parameter expansion正是这样做的。例如,

echo "${subj#PD: )"

显示 $subj 的值,并删除该值前面的任何前缀 PD:


这是一个Python 3版本,由Xlea贡献在 proposed edit然而,它违反了一般的 Stack Overflow 准则,因此在我将其合并到这个答案之前被拒绝了。

#!/usr/bin/env python3
from email.parser import BytesParser
from email.header import Header, decode_header
from email.errors import HeaderParseError
from sys import argv

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

关于bash - 通过 bash 从文件中检索电子邮件主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39457380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com