有没有办法从 PST 文件中获取附件名称?

Posted

技术标签:

【中文标题】有没有办法从 PST 文件中获取附件名称?【英文标题】:Is there a way to get the attachment names from a PST file? 【发布时间】:2019-04-25 10:58:18 【问题描述】:

我正在使用pypff 编写一个python 脚本来打开Outlook PST 文件并提取有用的信息。我正在关注here 中发布的代码。

我正在尝试获取每封电子邮件的附件名称,但输入“附件”的唯一方法是 get_size()read_buffer()seek_offset(),这对我没有用处。

read_buffer 方法给出一个长字符串,类似于x00\x11\x00\x02\x01\x02\x02\x01\x03\x04\x07\x05\...

如何解码?

【问题讨论】:

【参考方案1】:

您可以先尝试使用ascii 进行解码。

print((msg.get_attachment(0).read_buffer(attach_size)).decode('ascii', errors="ignore"))

我认为微软正在使用不止一种方法来对附件的不同部分进行编码,因此没有一种解码可以完美地完成。如果ascii 无法解码足够多的内容,您可以全部尝试。对于不同的 Python 版本,请查看here。

# 98 encodings in python3.5/6/7
decode = ['ascii','big5','big5hkscs','cp037','cp273',
          'cp424','cp437','cp500','cp720','cp737',
          'cp775','cp850','cp852','cp855','cp856',
          'cp857','cp858','cp860','cp861','cp862',
          'cp863','cp864','cp865','cp866','cp869',
          'cp874','cp875','cp932','cp949','cp950',
          'cp1006','cp1026','cp1125','cp1140','cp1250',
          'cp1251','cp1252','cp1253','cp1254','cp1255',
          'cp1256','cp1257','cp1258','cp65001','euc_jp',
          'euc_jis_2004','euc_jisx0213','euc_kr','gb2312','gbk',
          'gb18030','hz','iso2022_jp','iso2022_jp_1','iso2022_jp_2',
          'iso2022_jp_2004','iso2022_jp_3','iso2022_jp_ext','iso2022_kr','latin_1',
          'iso8859_2','iso8859_3','iso8859_4','iso8859_5','iso8859_6',
          'iso8859_7','iso8859_8','iso8859_9','iso8859_10','iso8859_11',
          'iso8859_13','iso8859_14','iso8859_15','iso8859_16','johab',
          'koi8_r','koi8_t','koi8_u','kz1048','mac_cyrillic',
          'mac_greek','mac_iceland','mac_latin2','mac_roman','mac_turkish',
          'ptcp154','shift_jis','shift_jis_2004','shift_jisx0213','utf_32',
          'utf_32_be','utf_32_le','utf_16','utf_16_be','utf_16_le',
          'utf_7','utf_8','utf_8_sig']

# Select the best decoder
items = []
for item in encode:
    attach_size = msg.get_attachment(0).get_size()
    content = (msg.get_attachment(0).read_buffer(attach_size)).decode(item, errors="ignore")
    
    # I know 'sample_content' is in the attachment, so it's easy to see which ones can decode it.
    if 'sample_content' in content:
        items.append(item)

print(items)

如果您不知道内容中的内容,可以尝试解决方法。例如,在循环中,您可以找到留下最少数量“\x”的解码,因为在编码之前,您的内容看起来像这样“\x93\x93\xfa\x8c\xd3\x1a\xc6”。

如果有人有更好的附件解码方法,请在这里留言,谢谢。

【讨论】:

以上是关于有没有办法从 PST 文件中获取附件名称?的主要内容,如果未能解决你的问题,请参考以下文章

向 .NET 电子邮件添加附件

outlook 邮箱收的邮件在那放着(附件在哪)

无需下载即可获取 Gmail 附件文件名

获取 UITableViewCell 详细附件视图的图像

如何从电子邮件中获取 csv 附件并保存

TIdAttachment - 获取正确的附件文件名 - 没有 utf-8 编码信息