Найти конкретную почту в Outlook по заголовку - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать код, который будет искать письма в моем почтовом ящике, используя поле Тема (например, в соответствии с правилами 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)

Этот код находит последнюю букву в папке.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Приведенный ниже код будет искать во всех сообщениях папки 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")
0 голосов
/ 11 октября 2019

Вам необходимо использовать Find / FindNext или Restrict класса 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);
    }
}

Подробнее об этих методах читайте в следующих статьях:

Также вам может пригодиться метод AdvancedSearch класса Application. Ключевые преимущества использования метода AdvancedSearch в Outlook:

  • Поиск выполняется в другой теме. Вам не нужно запускать другой поток вручную, так как метод AdvancedSearch запускает его автоматически в фоновом режиме.
  • Возможность поиска любых типов элементов: почта, встреча, календарь, заметки и т. Д. В любом месте, например внеобласть действия определенной папки. Методы Restrict и Find / FindNext могут быть применены к определенной коллекции Items (см. Свойство Items класса Folder в Outlook).
  • Полная поддержка запросов DASL (пользовательские свойства также могут использоваться для поиска). Подробнее об этом можно прочитать в статье Filtering в MSDN. Для повышения эффективности поиска можно использовать ключевые слова мгновенного поиска, если для магазина включен мгновенный поиск (см. Свойство IsInstantSearchEnabled класса Store).
  • Вы можете остановить процесс поиска в любой момент, используя метод Stopкласса Search.

Подробнее об этом методе читайте в расширенном поиске в Outlook программным способом: C #, VB.NET , статья.

...