【问题标题】:how to read latest unread emails from outlook till the point i have read mail如何从 Outlook 中阅读最新的未读电子邮件,直到我已阅读邮件
【发布时间】:2019-07-04 13:11:27
【问题描述】:

我正在尝试使用 powershell 并显示主题从我的 Outlook 邮箱中读取未读邮件。我想阅读最新的未读电子邮件,直到我有任何已读电子邮件为止。我可能在阅读邮件后有未读邮件,但不应该包括在内。

  $outlook = New-Object -ComObject Outlook.Application
  $namespace = $outlook.GetNameSpace("MAPI")
  $folder=$namespace.GetDefaultFolder(6)
  $folder.Items|ForEach-Object { 
  if($_.Unread -eq $true){
    $_.subject
 }else{
break;
}  
 }   

由于我的收件箱充满了邮件(11011+)邮件,所以上面的脚本卡住了。

【问题讨论】:

    标签: powershell email outlook


    【解决方案1】:

    如果您只需要在文件夹中查找未读项目,则需要使用 Items 类的 Find/FindNextRestrict 方法。

    查找/查找下一个

    using System.Text;
    using System.Diagnostics;
    // ...
    private void FindAllUnreadEmails(Outlook.MAPIFolder folder)
    {
        string searchCriteria = "[UnRead] = true";
        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);
        }
    }
    

    限制

    using System.Text;
    using System.Diagnostics;
    // ...
    private void RestrictUnreadItems(Outlook.MAPIFolder folder)
    {
        string restrictCriteria = "[UnRead] = true";
        StringBuilder strBuilder = null;
        Outlook.Items folderItems = null;
        Outlook.Items resultItems = null;
        Outlook._MailItem mail = null;
        int counter = default(int);
        object item = null;
        try
        {
            strBuilder = new StringBuilder();
            folderItems = folder.Items;
            resultItems = folderItems.Restrict(restrictCriteria);
            item = resultItems.GetFirst();
            while (item != null)
            {
                if (item is Outlook._MailItem)
                {
                    counter++;
                    mail = item as Outlook._MailItem;
                    strBuilder.AppendLine("#" + counter.ToString() +
                                       "\tSubject: " + mail.Subject);
                }
                Marshal.ReleaseComObject(item);
                item = resultItems.GetNext();
            }
            if (strBuilder.Length > 0)
                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);
            if (resultItems != null) Marshal.ReleaseComObject(resultItems);
        }
    }
    
    

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

    【讨论】:

      【解决方案2】:

      您可以在 Outlook 中使用 Restrict() 进行预过滤:

      ...
      $folder=$namespace.GetDefaultFolder(6)
      $folder.Items.Restrict('[UnRead] = True')|ForEach-Object { 
        $_.subject
      }
      

      【讨论】:

        猜你喜欢
        • 2018-07-08
        • 2011-08-18
        • 2017-09-05
        • 1970-01-01
        • 2022-01-23
        • 2011-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多