通过电子邮件 html 发送到 csv 文件
Email html to csv file
我有一封 html 格式的电子邮件,需要下载它并且需要将一个 csv 分号字段分隔符结果生成一个新文件。
收到的电子邮件示例:
Content-Type: text/html; charset=UTF-8
<b>Thu Jul 11 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st= yle=3D"padding: 8px;background-color: #cce6ff">Name</th><th styl=
e=3D"padding: 8px;background-color: #cce6ff">CI</th><th style=3D"padding: 8=
px;background-color: #cce6ff">DH</th><th style=3D"padding: 8px;backgro=
und-color: #cce6ff">FG</th><th style=3D"padding: 8px;background-color: #c=
ce6ff">Mon</th><th style=3D"padding: 8px;background-color: #cce6ff">DATE=
(UTC)</th></tr><tr><th style=3D"padding: 8px;">Arael Amarel</th><th style=
=3D"padding: 8px;">30549214</th><th style=3D"padding: 8px;">099981496</th><=
th style=3D"padding: 8px;">43</th><th style=3D"padding: 8px;">-</th><th sty=
le=3D"padding: 8px;">2019-07-11T10:06:34.311Z</th></tr><tr><th style=3D"pad=
ding: 8px;background-color: #dddddd">MATIN TARDEI</th><th style=3D"padding=
: 8px;background-color: #dddddd">45159820</th><th style=3D"padding: 8px;bac=
kground-color: #dddddd">094432451</th><th style=3D"padding:
8px;background-=
color: #dddddd">32</th><th style=3D"padding: 8px;background-color: #dddddd"=
-</th><th style=3D"padding: 8px;background-color: #dddddd">2019-07-
11T10:2=
8:41.198Z</th></tr>
需要 csv 输出:
Name;CI;DH;FG;Mon;DATE (UTC)
Arael Amarel;30549214;099981496;43;-;2019-07-11T10:06:34.311Z
MATIN TARDEI;45159820;094432451;32;-;2019-07-11T10:28:41.198Z
如果我在客户端打开此邮件,table 一切正常,但我认为如果我将此内容放入 .html 文件,则 procmail 的格式存在问题(由 procmail 保存)并打开它,如果我看这个内容,所有行尾都标有“=”,这意味着无法处理内容,这意味着很多问题,此外还有一些服务器问题table 和其他内容的对齐使得处理要提取的内容成为一场噩梦。
我制作了一个带有过滤器的 procmailrc 以将 html 格式转换为普通格式
procmailrc 文件:
MAILDIR=/new/mail/htmlconvert
:0
* ^Content-Type: text/html.*;
{
:0c
$MAILDIR/converted/
:0fwb
| `which html2text`
:0fwh
| `which formail` -i "Content-Type: text/plain; charset=UTF-8"
}
这是第 1 次尝试,没有用转换器使用我强硬的 html2text 转换器如果我直接从文件中使用 html2text de 结果是:
html2条文字
===============================================================================
1px solid #dddddd;border-collapse: collapse;text-align: left;">
px;background-color: #cce6ff">NAME
px;background-color: #cce6ff">CI
= px;background-color: #cce6ff">DH
px;backgro= und-color: #cce6ff">FG
px;background-color: #c= ce6ff">Mon
px;background-color: #cce6ff">DATE= (UTC)
px;">Arael Amarel
px;">30549214
px;">099981496
<= th style=3D"padding: 8px;">43
px;">-
px;">2019-07-11T10:06:34.311Z
px;background-color: #dddddd">MATIN TARDEI
8px;background-color: #dddddd">45159820
px;bac= kground-color: #dddddd">094432451
px;background-= color: #dddddd">32
px;background-color: #dddddd"= >-
px;background-color: #dddddd">2019-07-11T10:2= 8:41.198Z
px;">
已经尝试了 lynx -dump -force-html 到文件中,结果没有什么好达到 csv 格式输出。
html2text -nobs (file)
Name;CI;DH;FG;Mon;DATE (UTC)
Arael Amarel;30549214;099981496;43;-;2019-07-11T10:06:34.311Z
MATIN TARDEI;45159820;094432451;32;-;2019-07-11T10:28:41.198Z
更新:
我已经将 tripleee 的解决方案应用到 procmailrc,但是邮件的格式仍然与原始来源相同,qprint
并没有随着此更改而更改格式。但是已经尝试将其直接写入文件并且工作正常。
实际解决方案:
qprint -d -n <1563019338.1197_0.localhost.localdomain |
html2text -style pretty |
awk '/^-------------------------------------------------------------------------------/{p=1}p'
-行是邮件的body和前面内容的分隔符,这样显示:
-------------------------------------------------------------------------------
NAME CI CD FG HJ DATE (UTC)
Yaiaa Fereeira 52104575 097325303 20 - 2019-07-12T10:46:24.716Z
Gabtiel Aosta Sclavi 42445135 098322361 42 - 2019-07-12T11:07:36.110Z
现在需要将此内容制作成 csv 格式,我认为第一部分会更容易,但想将其自动化到 procmail 以通过邮件下载来完成。
procmail 更改 procmailrc 的结果是 body 的邮件仍然以“=”作为行尾,但在 header 中有:
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
更新
procrc
中带有 qprint 的邮件结果源
Return-Path:
Delivered-To:
Return-path:
Envelope-to:
Delivery-date: Sat, 13 Jul 2019 08:03:48 -0300
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
Date: Sat, 13 Jul 2019 11:03:02 +0000 (UTC)
From:
Mime-Version: 1.0
To:
Message-ID:
Subject:Fri Jul 12 2019
X-Spam-Flag: NO
<b>Fri Jul 12 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st=
yle=3D"padding: 8px;background-color: #cce6ff">NAME</th><th styl=
e=3D"padding: 8px;background-color: #cce6ff">CI</th><th style=3D"padding: 8=
px;background-color: #cce6ff">CD</th><th style=3D"padding: 8px;backgro=
und-color: #cce6ff">FG</th><th style=3D"padding: 8px;background-color: #c=
ce6ff">HJ</th><th style=3D"padding: 8px;background-color: #cce6ff">DATE=
(UTC)</th></tr><tr><th style=3D"padding: 8px;">Yaiaa Fereeira</th><th st=
yle=3D"padding: 8px;">52104575</th><th style=3D"padding: 8px;">097325303</t=
h><th style=3D"padding: 8px;">20</th><th style=3D"padding: 8px;">-</th><th =
style=3D"padding: 8px;">2019-07-12T10:46:24.716Z</th></tr>
我在 stdin 中有日志,因为 procmail 无法写入日志文件,如您在此日志详细信息中所见:
1 message for aaa@aaa.com at aaa.com (25330 octets).
reading message aaa@aaa.com@aaa.com:1 of 1 (25330 octets)........................procmail: Error while writing to "/info/in/log"
procmail: [20191] Mon Jul 15 08:55:34 2019
procmail: Assigning "FORMAIL=/usr/bin/formail"
procmail: Assigning "QPRINT=/usr/local/bin/qprint"
procmail: Match on "^Content-Type: text/html;"
procmail: Assigning "LASTFOLDER=converted/new/1563191734.20191_0.localhost.localdomain"
Subject: Sun Jul 14 2019
Folder: converted/new/1563191734.20191_0.localhost.localdomain 24985
procmail: Executing " qprint -d -n | html2text -nobs "
procmail: Executing " formail -I "Content-Type: text/html; charset=UTF-8"
procmail: Skipped "Mail"
procmail: Skipped "/"
From aaaaaa.com@aaa.com Mon Jul 15 08:55:34 2019
Subject: Sun Jul 14 2019
Folder: **Bounced** 24985
fetchmail: MDA returned nonzero status 73
not flushed
您 post 中的示例根本不像有效电子邮件 body。我 猜测 它是 MIME 消息中的 body 部分,带有 Content-type: text/html
(如模糊指示)和 Content-transfer-encoding: quoted-printabe
。后者是引入您认为有问题的 =
转义的原因。对它们进行解码实际上是相当简单的,但是如何从 Procmail 中进行解码取决于包含邮件的整体组成以及您可用的实用程序。不幸的是,Procmail 本身并不知道 MIME 结构,因此您将不得不依赖外部工具。
顺便说一下,您食谱中的 `which ...`
命令完全是多余的。要使 which
工作,您正在寻找的实用程序需要在您的 PATH
中......这意味着 Procmail 可以在没有 which
.
的情况下找到它们
如果 Procmail 的默认 PATH
中没有某些内容,只需更新 .procmailrc
文件顶部附近的 PATH
。这也应该消除使用 $FORMAIL
等变量的需要。只需使用 formail
并确保它在 Procmail 的 PATH
.
上可用
要使您的食谱生效,MIME 结构必须是 single-part 消息。如果情况确实如此,并且您的 html2text
在其他方面是正确的,那么您唯一需要的解决方法是在通过 content-transfer-encoding 之前解码 content-transfer-encoding 。假设您有 qprint
,并且删除了多余的 which
调用,剩下
:0
* ^Content-Type: text/html.*;
{
:0c # no need to spell out $MAILDIR/ prefix
converted/
:0fwb
| qprint -d | html2text
:0fwh
| formail -i "Content-Type: text/plain; charset=UTF-8" \
-i "Content-transfer-encoding: 8bit"
}
如果 MIME body 结构实际上更复杂,也许可以编辑您的问题以包含实际的电子邮件来源,而不是您当前的 ad-lib 释义。
换句话说,更详细地说,如果您的输入消息看起来像
From: sender <sender@example.net>
To: you <you@example.org>
Subject: HTML table
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<b>Thu Jul 11 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st=
yle=3D"padding: 8px;background-color: #cce6ff">Name</th><th styl=
e=3D"padding: 8px;background-color:....
那么上面的方法应该基本有效。但另一方面,如果您的实际消息更像是
From: sender <sender@example.net>
To: you <you@example.org>
Subject: HTML table
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=0xdeadbeef
This is a multi-part MIME message.
--0xdeadbeef
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<b>Thu Jul 11 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st=
yle=3D"padding: 8px;background-color: #cce6ff">Name</th><th styl=
e=3D"padding: 8px;background-color:....
--0xdeadbeef--
那么第一个条件将不匹配(headers 不包含 Content-type: text/html
),但是块内的操作也需要在几个地方更新,因为 MIME 环绕HTML body 部分需要展开或以其他方式重组。这是解决此问题的真正快速而肮脏的尝试。
:0
* ^Content-Type: multipart/mixed
{
:0c # no need to spell out $MAILDIR/ prefix
converted/
:0fwb
| perl -0777 -pe 's/=([0-9A-F]{2})/ chr(oct("0x"))/ge; \
s/=\n//g; \
s%</table>.*%%s; \
s%.*<table[^<>]*>%%s; \
s%<tr[^<>]*><t[dh][^<>]*>%\n%g; \
s%<t[dh][^<>]*>%;%g; \
s%</t[rdh]>%%g; \
s%^\n+%%;'
:0fwh
| formail -i "Content-Type: text/plain; charset=UTF-8" \
-i "Content-transfer-encoding: 8bit"
}
稍加改动,它应该也适用于 single-part 变体。但是你应该意识到 Perl 脚本是一个非常粗略的剪辑,而不是一个合适的 HTML 解析器。
f
标志使 Procmail 将输入消息替换为管道的输出。然后需要 formail
调用,因为在用不同类型和不同编码的内容替换原始内容后,原始 MIME headers 不再正确。如果您只是想将 CSV 数据提取到外部文件中,则可以跳过后者,而前者可以简化为
:0
* ^Content-type: text/html
{
:0c
converted/
:0b # no w flag necessary either once we drop f
| qprint -d | html2text >>result.csv
}
我们再次假设 single-part MIME 消息作为输入。是否覆盖输出文件而不是追加(或者可能每次写入不同的 CSV 文件)将取决于您的具体用例,以及您希望多久收到一次这些消息。
(不是特别认可 qprint
;有许多类似的实用程序,但没有什么特别普遍的。不幸的是,GNU Coreutils 维护者坚决拒绝包含类似的实用程序。)
我有一封 html 格式的电子邮件,需要下载它并且需要将一个 csv 分号字段分隔符结果生成一个新文件。
收到的电子邮件示例:
Content-Type: text/html; charset=UTF-8
<b>Thu Jul 11 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st= yle=3D"padding: 8px;background-color: #cce6ff">Name</th><th styl=
e=3D"padding: 8px;background-color: #cce6ff">CI</th><th style=3D"padding: 8=
px;background-color: #cce6ff">DH</th><th style=3D"padding: 8px;backgro=
und-color: #cce6ff">FG</th><th style=3D"padding: 8px;background-color: #c=
ce6ff">Mon</th><th style=3D"padding: 8px;background-color: #cce6ff">DATE=
(UTC)</th></tr><tr><th style=3D"padding: 8px;">Arael Amarel</th><th style=
=3D"padding: 8px;">30549214</th><th style=3D"padding: 8px;">099981496</th><=
th style=3D"padding: 8px;">43</th><th style=3D"padding: 8px;">-</th><th sty=
le=3D"padding: 8px;">2019-07-11T10:06:34.311Z</th></tr><tr><th style=3D"pad=
ding: 8px;background-color: #dddddd">MATIN TARDEI</th><th style=3D"padding=
: 8px;background-color: #dddddd">45159820</th><th style=3D"padding: 8px;bac=
kground-color: #dddddd">094432451</th><th style=3D"padding:
8px;background-=
color: #dddddd">32</th><th style=3D"padding: 8px;background-color: #dddddd"=
-</th><th style=3D"padding: 8px;background-color: #dddddd">2019-07-
11T10:2=
8:41.198Z</th></tr>
需要 csv 输出:
Name;CI;DH;FG;Mon;DATE (UTC)
Arael Amarel;30549214;099981496;43;-;2019-07-11T10:06:34.311Z
MATIN TARDEI;45159820;094432451;32;-;2019-07-11T10:28:41.198Z
如果我在客户端打开此邮件,table 一切正常,但我认为如果我将此内容放入 .html 文件,则 procmail 的格式存在问题(由 procmail 保存)并打开它,如果我看这个内容,所有行尾都标有“=”,这意味着无法处理内容,这意味着很多问题,此外还有一些服务器问题table 和其他内容的对齐使得处理要提取的内容成为一场噩梦。
我制作了一个带有过滤器的 procmailrc 以将 html 格式转换为普通格式 procmailrc 文件:
MAILDIR=/new/mail/htmlconvert
:0
* ^Content-Type: text/html.*;
{
:0c
$MAILDIR/converted/
:0fwb
| `which html2text`
:0fwh
| `which formail` -i "Content-Type: text/plain; charset=UTF-8"
}
这是第 1 次尝试,没有用转换器使用我强硬的 html2text 转换器如果我直接从文件中使用 html2text de 结果是:
html2条文字
===============================================================================
1px solid #dddddd;border-collapse: collapse;text-align: left;">
px;background-color: #cce6ff">NAME
px;background-color: #cce6ff">CI
= px;background-color: #cce6ff">DH
px;backgro= und-color: #cce6ff">FG
px;background-color: #c= ce6ff">Mon
px;background-color: #cce6ff">DATE= (UTC)
px;">Arael Amarel
px;">30549214
px;">099981496
<= th style=3D"padding: 8px;">43
px;">-
px;">2019-07-11T10:06:34.311Z
px;background-color: #dddddd">MATIN TARDEI
8px;background-color: #dddddd">45159820
px;bac= kground-color: #dddddd">094432451
px;background-= color: #dddddd">32
px;background-color: #dddddd"= >-
px;background-color: #dddddd">2019-07-11T10:2= 8:41.198Z
px;">
已经尝试了 lynx -dump -force-html 到文件中,结果没有什么好达到 csv 格式输出。
html2text -nobs (file)
Name;CI;DH;FG;Mon;DATE (UTC)
Arael Amarel;30549214;099981496;43;-;2019-07-11T10:06:34.311Z
MATIN TARDEI;45159820;094432451;32;-;2019-07-11T10:28:41.198Z
更新:
我已经将 tripleee 的解决方案应用到 procmailrc,但是邮件的格式仍然与原始来源相同,qprint
并没有随着此更改而更改格式。但是已经尝试将其直接写入文件并且工作正常。
实际解决方案:
qprint -d -n <1563019338.1197_0.localhost.localdomain |
html2text -style pretty |
awk '/^-------------------------------------------------------------------------------/{p=1}p'
-行是邮件的body和前面内容的分隔符,这样显示:
-------------------------------------------------------------------------------
NAME CI CD FG HJ DATE (UTC)
Yaiaa Fereeira 52104575 097325303 20 - 2019-07-12T10:46:24.716Z
Gabtiel Aosta Sclavi 42445135 098322361 42 - 2019-07-12T11:07:36.110Z
现在需要将此内容制作成 csv 格式,我认为第一部分会更容易,但想将其自动化到 procmail 以通过邮件下载来完成。
procmail 更改 procmailrc 的结果是 body 的邮件仍然以“=”作为行尾,但在 header 中有:
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
更新 procrc
中带有 qprint 的邮件结果源Return-Path:
Delivered-To:
Return-path:
Envelope-to:
Delivery-date: Sat, 13 Jul 2019 08:03:48 -0300
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
Date: Sat, 13 Jul 2019 11:03:02 +0000 (UTC)
From:
Mime-Version: 1.0
To:
Message-ID:
Subject:Fri Jul 12 2019
X-Spam-Flag: NO
<b>Fri Jul 12 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st=
yle=3D"padding: 8px;background-color: #cce6ff">NAME</th><th styl=
e=3D"padding: 8px;background-color: #cce6ff">CI</th><th style=3D"padding: 8=
px;background-color: #cce6ff">CD</th><th style=3D"padding: 8px;backgro=
und-color: #cce6ff">FG</th><th style=3D"padding: 8px;background-color: #c=
ce6ff">HJ</th><th style=3D"padding: 8px;background-color: #cce6ff">DATE=
(UTC)</th></tr><tr><th style=3D"padding: 8px;">Yaiaa Fereeira</th><th st=
yle=3D"padding: 8px;">52104575</th><th style=3D"padding: 8px;">097325303</t=
h><th style=3D"padding: 8px;">20</th><th style=3D"padding: 8px;">-</th><th =
style=3D"padding: 8px;">2019-07-12T10:46:24.716Z</th></tr>
我在 stdin 中有日志,因为 procmail 无法写入日志文件,如您在此日志详细信息中所见:
1 message for aaa@aaa.com at aaa.com (25330 octets).
reading message aaa@aaa.com@aaa.com:1 of 1 (25330 octets)........................procmail: Error while writing to "/info/in/log"
procmail: [20191] Mon Jul 15 08:55:34 2019
procmail: Assigning "FORMAIL=/usr/bin/formail"
procmail: Assigning "QPRINT=/usr/local/bin/qprint"
procmail: Match on "^Content-Type: text/html;"
procmail: Assigning "LASTFOLDER=converted/new/1563191734.20191_0.localhost.localdomain"
Subject: Sun Jul 14 2019
Folder: converted/new/1563191734.20191_0.localhost.localdomain 24985
procmail: Executing " qprint -d -n | html2text -nobs "
procmail: Executing " formail -I "Content-Type: text/html; charset=UTF-8"
procmail: Skipped "Mail"
procmail: Skipped "/"
From aaaaaa.com@aaa.com Mon Jul 15 08:55:34 2019
Subject: Sun Jul 14 2019
Folder: **Bounced** 24985
fetchmail: MDA returned nonzero status 73
not flushed
您 post 中的示例根本不像有效电子邮件 body。我 猜测 它是 MIME 消息中的 body 部分,带有 Content-type: text/html
(如模糊指示)和 Content-transfer-encoding: quoted-printabe
。后者是引入您认为有问题的 =
转义的原因。对它们进行解码实际上是相当简单的,但是如何从 Procmail 中进行解码取决于包含邮件的整体组成以及您可用的实用程序。不幸的是,Procmail 本身并不知道 MIME 结构,因此您将不得不依赖外部工具。
顺便说一下,您食谱中的 `which ...`
命令完全是多余的。要使 which
工作,您正在寻找的实用程序需要在您的 PATH
中......这意味着 Procmail 可以在没有 which
.
如果 Procmail 的默认 PATH
中没有某些内容,只需更新 .procmailrc
文件顶部附近的 PATH
。这也应该消除使用 $FORMAIL
等变量的需要。只需使用 formail
并确保它在 Procmail 的 PATH
.
要使您的食谱生效,MIME 结构必须是 single-part 消息。如果情况确实如此,并且您的 html2text
在其他方面是正确的,那么您唯一需要的解决方法是在通过 content-transfer-encoding 之前解码 content-transfer-encoding 。假设您有 qprint
,并且删除了多余的 which
调用,剩下
:0
* ^Content-Type: text/html.*;
{
:0c # no need to spell out $MAILDIR/ prefix
converted/
:0fwb
| qprint -d | html2text
:0fwh
| formail -i "Content-Type: text/plain; charset=UTF-8" \
-i "Content-transfer-encoding: 8bit"
}
如果 MIME body 结构实际上更复杂,也许可以编辑您的问题以包含实际的电子邮件来源,而不是您当前的 ad-lib 释义。
换句话说,更详细地说,如果您的输入消息看起来像
From: sender <sender@example.net>
To: you <you@example.org>
Subject: HTML table
MIME-Version: 1.0
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<b>Thu Jul 11 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st=
yle=3D"padding: 8px;background-color: #cce6ff">Name</th><th styl=
e=3D"padding: 8px;background-color:....
那么上面的方法应该基本有效。但另一方面,如果您的实际消息更像是
From: sender <sender@example.net>
To: you <you@example.org>
Subject: HTML table
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=0xdeadbeef
This is a multi-part MIME message.
--0xdeadbeef
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<b>Thu Jul 11 2019</b><hr><table style=3D"border=
: 1px solid #dddddd;border-collapse: collapse;text-align: left;"><tr><th st=
yle=3D"padding: 8px;background-color: #cce6ff">Name</th><th styl=
e=3D"padding: 8px;background-color:....
--0xdeadbeef--
那么第一个条件将不匹配(headers 不包含 Content-type: text/html
),但是块内的操作也需要在几个地方更新,因为 MIME 环绕HTML body 部分需要展开或以其他方式重组。这是解决此问题的真正快速而肮脏的尝试。
:0
* ^Content-Type: multipart/mixed
{
:0c # no need to spell out $MAILDIR/ prefix
converted/
:0fwb
| perl -0777 -pe 's/=([0-9A-F]{2})/ chr(oct("0x"))/ge; \
s/=\n//g; \
s%</table>.*%%s; \
s%.*<table[^<>]*>%%s; \
s%<tr[^<>]*><t[dh][^<>]*>%\n%g; \
s%<t[dh][^<>]*>%;%g; \
s%</t[rdh]>%%g; \
s%^\n+%%;'
:0fwh
| formail -i "Content-Type: text/plain; charset=UTF-8" \
-i "Content-transfer-encoding: 8bit"
}
稍加改动,它应该也适用于 single-part 变体。但是你应该意识到 Perl 脚本是一个非常粗略的剪辑,而不是一个合适的 HTML 解析器。
f
标志使 Procmail 将输入消息替换为管道的输出。然后需要 formail
调用,因为在用不同类型和不同编码的内容替换原始内容后,原始 MIME headers 不再正确。如果您只是想将 CSV 数据提取到外部文件中,则可以跳过后者,而前者可以简化为
:0
* ^Content-type: text/html
{
:0c
converted/
:0b # no w flag necessary either once we drop f
| qprint -d | html2text >>result.csv
}
我们再次假设 single-part MIME 消息作为输入。是否覆盖输出文件而不是追加(或者可能每次写入不同的 CSV 文件)将取决于您的具体用例,以及您希望多久收到一次这些消息。
(不是特别认可 qprint
;有许多类似的实用程序,但没有什么特别普遍的。不幸的是,GNU Coreutils 维护者坚决拒绝包含类似的实用程序。)