Exchangelib:ItemAttachment 似乎从附件名称中删除了文件扩展名
Exchangelib: ItemAttachment appears to strip file extension from the attachment name
在尝试处理入站电子邮件中类型为 ItemAttachment 和 FileAttachment 的几个附件时,我注意到 ItemAttachment(代表电子邮件附件“HELLO WORLD.eml”)从名称中删除了扩展名 .eml。所以我在流程的下游丢失了该信息。
FileAttachment 类型的其他类型的附件都很好,并保留其扩展名。不确定我是否遗漏了某些东西或者 ItemAttachment 的初始化方式存在缺陷。想法?
注意 1:这些附件是即时的,例如:attachments = message_item.attachments
注2:exchangelib==3.2.0
** ATTACHMENT 1
NAME: HELLO WORLD, <== Supposed to have .eml extension
TYPE: <class 'exchangelib.attachments.ItemAttachment'>
content_type='message/rfc822',
content_id='742A502EB7681B4F8D08B03020716918@namprd10.prod.outlook.com',
size=31367,
last_modified_time=EWSDateTime(2020, 7, 20, 22, 25, 2, tzinfo=<UTC>),
is_inline=False
** ATTACHMENT 2
NAME: Daily Sync-up call.ics
TYPE: <class 'exchangelib.attachments.FileAttachment'>:
content_type='text/calendar',
content_id='AF02FF7A060C5F4BA45628DE091DF5CD@namprd10.prod.outlook.com',
size=76875,
last_modified_time=EWSDateTime(2020, 7, 20, 22, 25, 2, tzinfo=<UTC>),
is_inline=False,
is_contact_photo=False)
(部分内容已编辑)
EWS 中的项目附件的不同之处在于它们实际上不是文件,而是对 Exchange 数据库中其他项目的引用。因此,您可能会在例如中看到的 .ics 扩展名Outlook 是一个 .eml 文件,Outlook 从引用的项目创建并提供下载。但是EWS并不知道。
在 exchangelib 中,ItemAttachment.item
是一个普通的 Item
,您可以直接使用它。如果您需要附件,您可以根据项目附件中包含的信息创建一个 .eml 文件,但您必须自己创建或使用图书馆来帮助您。
考虑到我的问题已接受的答案,为了解决我在使用 ItemAttachment 时丢失的 .eml 扩展名,我采用了如下显式重命名方案:
if isinstance(a, ItemAttachment):
attach_name = a.name
regex_pat = re.compile(r'.*\.eml$') # regex for explicit .eml extension
if not regex_pat.match(a.name) and a.content_type == "message/rfc822":
attach_name += ".eml"
attachment_file = ContentFile(a.item.mime_content, name=attach_name)
一个明显的问题是我假设“message/rfc822”类型文件的扩展名为 .eml 而不是其他。但这适用于我在我的环境中的目的,作为恢复丢失的 .eml 扩展名的解决方法。将此方法留在此处 compare/contrast 以防有人遇到此问题。
在尝试处理入站电子邮件中类型为 ItemAttachment 和 FileAttachment 的几个附件时,我注意到 ItemAttachment(代表电子邮件附件“HELLO WORLD.eml”)从名称中删除了扩展名 .eml。所以我在流程的下游丢失了该信息。
FileAttachment 类型的其他类型的附件都很好,并保留其扩展名。不确定我是否遗漏了某些东西或者 ItemAttachment 的初始化方式存在缺陷。想法?
注意 1:这些附件是即时的,例如:attachments = message_item.attachments
注2:exchangelib==3.2.0
** ATTACHMENT 1
NAME: HELLO WORLD, <== Supposed to have .eml extension
TYPE: <class 'exchangelib.attachments.ItemAttachment'>
content_type='message/rfc822',
content_id='742A502EB7681B4F8D08B03020716918@namprd10.prod.outlook.com',
size=31367,
last_modified_time=EWSDateTime(2020, 7, 20, 22, 25, 2, tzinfo=<UTC>),
is_inline=False
** ATTACHMENT 2
NAME: Daily Sync-up call.ics
TYPE: <class 'exchangelib.attachments.FileAttachment'>:
content_type='text/calendar',
content_id='AF02FF7A060C5F4BA45628DE091DF5CD@namprd10.prod.outlook.com',
size=76875,
last_modified_time=EWSDateTime(2020, 7, 20, 22, 25, 2, tzinfo=<UTC>),
is_inline=False,
is_contact_photo=False)
(部分内容已编辑)
EWS 中的项目附件的不同之处在于它们实际上不是文件,而是对 Exchange 数据库中其他项目的引用。因此,您可能会在例如中看到的 .ics 扩展名Outlook 是一个 .eml 文件,Outlook 从引用的项目创建并提供下载。但是EWS并不知道。
在 exchangelib 中,ItemAttachment.item
是一个普通的 Item
,您可以直接使用它。如果您需要附件,您可以根据项目附件中包含的信息创建一个 .eml 文件,但您必须自己创建或使用图书馆来帮助您。
考虑到我的问题已接受的答案,为了解决我在使用 ItemAttachment 时丢失的 .eml 扩展名,我采用了如下显式重命名方案:
if isinstance(a, ItemAttachment):
attach_name = a.name
regex_pat = re.compile(r'.*\.eml$') # regex for explicit .eml extension
if not regex_pat.match(a.name) and a.content_type == "message/rfc822":
attach_name += ".eml"
attachment_file = ContentFile(a.item.mime_content, name=attach_name)
一个明显的问题是我假设“message/rfc822”类型文件的扩展名为 .eml 而不是其他。但这适用于我在我的环境中的目的,作为恢复丢失的 .eml 扩展名的解决方法。将此方法留在此处 compare/contrast 以防有人遇到此问题。