我有一个 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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我尝试使用sed和tail命令从文件中获取第 9 行;问题是主题并不总是在第 9 行,并且文件名并没有说明其大部分内容。
我正在尝试使文件名采用易于理解的格式,因此我认为该主题可能会有所帮助。
电子邮件文件的第 n 行是以主题开头的行: PD:主题
我试图找到这一行,去掉主题:PD:并将其余部分保留为 ne 文件名
以下是错误的,但实现了您似乎要求的内容。
subj=$(sed -n '/^Subject: PD *//!d;p;q;/^$/q' "$f")
Run Code Online (Sandbox Code Playgroud)
这样做的问题是,它在普通情况下会成功,但当您有 MIME RFC2047 编码的Subject:标头时,以及(更简单地)当Subject:标头跨越多于一行时,它会失败。
我会用一种稍微现代的编程语言来解决这个问题。这并不完全是一句简单的话,但使用 Python 就足够简单了。
subj=$(./emailsubj.py "$f")
Run Code Online (Sandbox Code Playgroud)
其中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)
Run Code Online (Sandbox Code Playgroud)
(显然,请记住chmod +x emailsubj.py。)
这会检索整个Subject:标头,对于模块化工具来说似乎是一个很好的设计。如果您想在提取标头后删除前缀,shell 有简单的参数扩展工具可以做到这一点。例如,
echo "${subj#PD:\ }"
Run Code Online (Sandbox Code Playgroud)
显示从值前面删除$subj任何前缀的值。PD:
上面是为 Python 2.7 编写的。在 Python 3.6+ 中,一个更简单的版本就足够了。下面练习了 Python 3.6+ 改进的email库(暂时需要您命名一个显式的policy, 但是),它更加简单且更加通用。
from email import message_from_binary_file
from email.policy import default
from sys import argv
for filename in argv[1:]:
with open(filename, 'rb') as handle: # handle file not found etc?
message = message_from_binary_file(handle, policy=default)
print(message['subject'])
Run Code Online (Sandbox Code Playgroud)
使用 Python 3,任何正常平台上的输出都应该可以通过print. 当然,如果您的终端无法打印 Unicode(在这种情况下您可能使用的是 Windows),它可能会因此失败。
| 归档时间: |
|
| 查看次数: |
2826 次 |
| 最近记录: |