如何让 mapi 循环浏览电子邮件文件附件中的正文



我正试图让我的代码循环通过特定子文件夹中的文件附件正文,这样,如果文件附件正文中存在某个单词,就会读取电子邮件正文。

目前,我只知道如何阅读电子邮件的正文使用:

import win32com.client
outlook=win32com.client.Dispatch('outlook.application')
mapi=outlook.GetNamespace("MAPI")
inbox=mapi.GetDefaultFolder(6).Folders['Email']
messages=inbox.Items
for message in messages:
body = message.body

但当涉及到在不逐个保存所有文件附件的情况下读取文件附件的正文时,我就陷入了困境。

您可以使用Table对象,该对象表示来自FolderSearch对象的一组项数据,其中项作为表的行,属性作为表的列。使用Folder.GetTable可以获得Table对象,该对象表示文件夹或搜索文件夹中的一组项目。如果Table对象是从Folder.GetTable获得的,则可以进一步指定过滤器(在Table.Restrict中(以获得文件夹中项目的子集。如果您没有指定任何筛选器,您将获得文件夹中的所有项目。

以下示例代码示例使用DAV搜索和定位(DASL(语法来指定查询。为了构造过滤器,代码样本首先检查在默认存储中是否启用了即时搜索,以确定是否使用ci_phrasematch关键字来获得与"匹配的精确短语;办公室;在任何附件中。然后,示例将筛选器应用于收件箱上的GetTable方法,并在Table对象中获得结果。然后,代码示例在Table中显示每个返回项目的主题。以下示例在C#中,但Outlook对象模型对于所有类型的应用程序都是常见的,因此理解所描述的方法应该不会有问题:

using Outlook = Microsoft.Office.Interop.Outlook;
private void DemoSearchAttachments()
{
string filter;
const string PR_SEARCH_ATTACHMENTS =
"http://schemas.microsoft.com/mapi/proptag/0x0EA5001E";
if (Application.Session.DefaultStore.IsInstantSearchEnabled)
{
filter = "@SQL=" + """
+ PR_SEARCH_ATTACHMENTS + """
+ " ci_phrasematch 'office'";
Outlook.Table table = Application.Session.GetDefaultFolder(
Outlook.OlDefaultFolders.olFolderInbox).GetTable(
filter, Outlook.OlTableContents.olUserItems);
while (!table.EndOfTable)
{
Outlook.Row row = table.GetNextRow();
Debug.WriteLine(row["Subject"]);
// or
// Debug.WriteLine(row["Body"]);
}
}
}

相关内容

最新更新