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

2024-05-25

我有一个 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 and tail从文件中获取第 9 行的命令;问题是主题并不总是在第 9 行,并且文件名并没有说明其大部分内容。

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

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

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


以下是wrong但实现了你似乎要求的内容。

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

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

我会用一种稍微现代的编程语言来解决这个问题。这并不完全是一句简单的话,但使用 Python 就足够简单了。

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

where 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,对于模块化工具来说似乎是一个很好的设计。如果您想在提取标头后删除前缀,shell 有简单的功能参数扩展 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html正是这样做的。例如,

echo "${subj#PD: )"

显示的值$subj带有任何前缀PD:从值的前面删除。


这是一个 Python 3 版本,由Xlea /users/2473926/xlea in a 提议的编辑 /review/suggested-edits/23544495然而,它违反了一般的堆栈溢出准则,因此在我将其合并到这个答案之前被拒绝了。

#!/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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 bash 从文件中检索电子邮件主题 的相关文章

随机推荐

  • 无法立即更新状态?

    我有两个功能 第一个功能是我收到所有订单 第二个功能是我收到所有被拒绝的订单 所以在第一个函数中 我根据第二个函数状态更新状态 效果很好 但是当我从 Firebase 控制台删除项目时 尽管我使用on value gt 那么我该如何处理呢
  • SWT 设置列高或插入新行

    我目前有一个带有几个 TableColumn 的表 org eclipse swt widgets Table 然而 由于用户界面空间的限制 我遇到了一些问题 举例来说 我有一个名为 目标用户 的表列 并且不能将其命名为其他任何名称 并且必
  • for 循环在 Python 中生成/导出输出所需的时间太长

    这个问题是上一个问题的延续for 循环花费太长时间才能产生输出 https stackoverflow com questions 41339200 for loop taking too long to produce output no
  • 哪里可以找到关于 swift Alert (UIAlertController) 的明确解释?

    对此找不到清晰且信息丰富的解释 在某个主题上搜索了一段时间后 我没有 找到清晰的解释 即使在它的类参考中UIAlertController 参考 https developer apple com library ios documenta
  • 使用notebook时将jar添加到pyspark

    我正在尝试将 mongodb hadoop 与 Spark 集成 但不知道如何使 IPython 笔记本可以访问这些 jar 这是我想做的 set up parameters for reading from MongoDB via Had
  • WooCommerce 中的分页

    我使用这个短代码在页面上显示产品的类别 但是当我们使用它时 它不会显示分页 因为我们的类别中有很多产品 我们使用以下代码 product category category snowpeak per page 12 columns 4 or
  • iOS 中特定字符串的 SHA1

    根据我的要求 输入字符串必须转换为字节值 string 的每个字符都是 16 位值 必须转换为低 8 位 然后在字节数组上计算 Sha1 生成的 SHA 1 将转换为 40 个字符的字符串 我知道如何将字符串转换为 SHA1 但其余部分对我
  • clang:发射是什么意思?

    The clang 诊断参考 https clang llvm org docs DiagnosticsReference html使用这个词emit三次 以下警告使用该术语 实施例1 https godbolt org z aa3svfY
  • vba Excel 中的多个查找请求(在查找中查找)

    我正在尝试执行一种嵌套查找请求 用例是我需要在一个工作表上查找组 如果找到 则从找到的行中的单独列中获取用户 ID 值 然后在另一张纸 然后它应该执行一系列操作 然后在第一张表中找到下一个出现的组 我的代码是 LookupGroup Spl
  • 使用 CSS 让图像位于文本后面并使其保持在中心位置

    我正在创建一个网页 其中有一个要放置在中心的图像 在该图像的顶部 我想要有输入框 标签和提交按钮 我正在尝试使用这个CSS img center z index 1 但这不起作用 当我将代码更改为 img center position a
  • 为什么数据没有填充在我的自定义 ui 表视图单元格中

    我正在从服务器获取数据 我想将其放入我的自定义 UITableViewCell 中 这是故事板中的单元格 如您所见 有两件事 首选项标签 三个按钮 当我从服务器接收数据时 我这样做 override func tableView table
  • 从一个数组中删除另一个数组中的元素

    假设我有这些二维数组A and B 我怎样才能从中删除元素A那些在B 集合论中的补集 A B A np asarray 1 1 1 1 1 2 1 1 3 1 1 4 B np asarray 0 0 0 1 0 2 1 0 3 1 0 4
  • JS 代码覆盖率

    我是测试场景的新手 我有一个问题想请你帮忙 例如 如果我有一个从 HTML JS 和 CSS 实现并调用其他 API 的 Web 应用程序 在测试此 Web 应用程序时 在进行功能测试时如何在浏览器中测量 HTML JS CSS 浏览器应用
  • 如何在 Jetty 中以编程方式设置 gzip?

    我正在使用 Noir 和 clojure 编写一个网络应用程序 它使用 Jetty Jetty 有两种使用 gzip 的方法 一种用于静态 一种用于动态 它们在https stackoverflow com a 9113129 104021
  • 为什么在 Spark-Shell 中导入 SparkSession 会失败并显示“对象 SparkSession 不是包 org.apache.spark.sql 的成员”?

    我在我的 VM Cloudera 机器上使用 Spark 1 6 0 我正在尝试从 Spark shell 将一些数据输入到 Hive 表中 为此 我尝试使用 SparkSession 但以下导入不起作用 scala gt import o
  • 在 CustomAdapters 中使用条件 if(view==null)

    我正在为 ListView 编写一个自定义适配器 它扩展了 BaseAdapter 并在此方法中 Override public View getView int position View convertView ViewGroup pa
  • document.execCommand('copy') 有大小限制吗?

    我使用的 document execCommand copy 与此处描述的类似 https developers google com web updates 2015 04 cut and copy commands https deve
  • iOS10 iMessage:无法使用 MSConversation 将数据插入 iMessage

    在我的项目中我添加了iMessage Extension但我无法发送选定的数据UITableview 需要发送选定行数据 声明 var savedConversation MSConversation 我想在用户时发送文本didselect
  • 标记处的其他选项

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

    我有一个 shell 脚本 它将文件从服务器邮件文件夹下载到 NAS 设备 以便客户端拥有本地备份的副本 文件保存为11469448248 H15587P19346 smtp x14 eu 2 S文件 我已将扩展名更改为标准 eml 格式