0

我正在尝试创建一个代码,该代码将使用主题字段在我的邮箱中查找信件(例如,根据 Outlook 规则,这些信件将位于文件夹“TODO”中)。这就是我现在所拥有的:

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

inbox = outlook.GetDefaultFolder(6).Folders.Item("TODO")

messages = inbox.Items
message = messages.GetLast()
body_content = message.subject
print(body_content)

此代码查找文件夹中的最后一个字母。

先感谢您。

4

2 回答 2

1

下面的代码将在 TODO 文件夹的所有消息中搜索,如果主题与要搜索的字符串匹配,它将打印找到的消息

import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

inbox = outlook.GetDefaultFolder(6).Folders.Item("TODO")

messages = inbox.Items
    for message in messages:
        if message.subject == 'String To be Searched':
            print("Found message")
于 2019-10-11T11:59:46.570 回答
0

您需要使用类的Find / FindNextRestrict方法Items。例如,要获取带有Hello world主题行的项目,您可以使用以下代码:

private void FindAllUnreadEmails(Outlook.MAPIFolder folder)
{
    string searchCriteria = "[Subject] = `Hello world`";
    StringBuilder strBuilder = null;
    int counter = default(int);
    Outlook._MailItem mail = null;
    Outlook.Items folderItems = null;
    object resultItem = null;
    try
    {
        if (folder.UnReadItemCount > 0)
        {
            strBuilder = new StringBuilder();
            folderItems = folder.Items;
            resultItem = folderItems.Find(searchCriteria);
            while (resultItem != null)
            {
                if (resultItem is Outlook._MailItem)
                {
                    counter++;
                    mail = resultItem as Outlook._MailItem;
                    strBuilder.AppendLine("#" + counter.ToString() + 
                                          "\tSubject: " + mail.Subject);
                }
                Marshal.ReleaseComObject(resultItem);
                resultItem = folderItems.FindNext();
            }
            if (strBuilder != null)
                Debug.WriteLine(strBuilder.ToString());
        }
        else
            Debug.WriteLine("There is no match in the " 
                                 + folder.Name + " folder.");
    }
    catch (Exception ex)
    {
        System.Windows.Forms.MessageBox.Show(ex.Message);
    }
    finally
    {
        if (folderItems != null) Marshal.ReleaseComObject(folderItems);
    }
}

在以下文章中阅读有关这些方法的更多信息:

此外,您可能会发现Application 类的AdvancedSearch方法很有帮助。AdvancedSearch在 Outlook 中使用该方法的主要好处是:

  • 搜索在另一个线程中执行。您不需要手动运行另一个线程,因为 AdvancedSearch 方法会在后台自动运行它。
  • 可以在任何位置(即超出某个文件夹的范围)搜索任何项目类型:邮件、约会、日历、便笺等。Restrict 和 Find/FindNext 方法可以应用于特定的 Items 集合(请参阅 Outlook 中 Folder 类的 Items 属性)。
  • 完全支持 DASL 查询(自定义属性也可用于搜索)。您可以在 MSDN中的过滤文章中阅读有关此内容的更多信息。为了提高搜索性能,如果为商店启用了即时搜索,则可以使用即时搜索关键字(请参阅 Store 类的 IsInstantSearchEnabled 属性)。
  • 您可以使用 Search 类的 Stop 方法随时停止搜索过程。

在 Outlook中的高级搜索中以编程方式阅读有关此方法的更多信息:C#、VB.NET文章。

于 2019-10-11T11:47:24.947 回答