Поиск нескольких ключевых слов в одном заголовке темы Outlook mail.item - PullRequest
0 голосов
/ 11 октября 2019

У меня есть несколько ключевых слов в заголовке темы электронного письма Outlook. ключевые слова не в том же порядке, но присутствуют. Я работал над кодом, который находит одно из ключевых слов, но не могу найти все ключевые слова.

, если кто-нибудь может выделить лучший способ обработки различий в случае, т.е. некоторые темы электронной почты пишутся заглавными буквами, некоторые - строчными, а некоторые, например, смешанными.

Список комплектации Tuf PHS: SD 19704802
СПИСОК ПОБИРАТЬ TUF PHS SD / 19704796

Я просмотрел множество протекторов. некоторые действительно полезны, но я не могу найти комбинацию строк, которая работает для нескольких ключевых слов в заголовке темы.

Sub ExtractandPrintTufnelOders()


Dim myOlApp As New Outlook.Application
Dim myNameSpace As Outlook.Namespace
Dim myInbox As Outlook.MAPIFolder
Dim myitems As Outlook.Items
Dim myitem As Object
Dim Found As Boolean
Dim Unread As Long


Set myNameSpace = myOlApp.GetNamespace("MAPI")
Set myInbox = myNameSpace.Folders("xxx@xxx.co.uk")
Set myInbox = myInbox.Folders("Inbox")
Set myitems = myInbox.Items
Found = False

For Each myitem In myitems.Restrict("[Unread] = true")
If myitem.Class = olMail Then

     If InStr(1, myitem.Subject, "Tuf" & "Picking List") > 0 Or _
        InStr(1, myitem.Subject, "TUF" & "PICKING LIST") > 0 Or _
        InStr(1, myitem.Subject, "Tuf" & "Picking List:") > 0 Or _
        InStr(1, myitem.Subject, "tuf" & "picking list") > 0 Then
                Debug.Print "Found a Tufnels Picking List"
                    Found = True
                        If Found = True Then

                        End If
    End If
 End If



 Next myitem

'If the subject isn't found:
 If Not Found Then
'NoResults.Show
End If

'myOlApp.Quit
 Set myOlApp = Nothing
Debug.Print myInbox.UnReadItemCount
End Sub

это ничего не найдет, однако, если я уменьшу строку до "Tuf", я получу положительный результат.

Ответы [ 2 ]

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

оператор & здесь объединяет две строки "Tuf" и "Picking List". Вам нужно будет использовать логический AND, чтобы объединить несколько IF условий. Кроме того, вам следует санировать регистр заранее, чтобы вам не приходилось пытаться жестко кодировать все возможные варианты написания / заглавных букв.

Измените это:

If InStr(1, myitem.Subject, "Tuf" & "Picking List") > 0 Or _
    InStr(1, myitem.Subject, "TUF" & "PICKING LIST") > 0 Or _
    InStr(1, myitem.Subject, "Tuf" & "Picking List:") > 0 Or _
    InStr(1, myitem.Subject, "tuf" & "picking list") > 0 Then
            Debug.Print "Found a Tufnels Picking List"
                Found = True
                    If Found = True Then

                    End If
End If

На это:

Dim subj as String
subj = UCase(myItem.Subject) ' ignore casing
Found = (Instr(1, subj, "TUF") > 0) AND (Instr(1, subj, "PICKING LIST") > 0) 
If Found Then
    Debug.Print "Found a Tufnels Picking List"

End If

Здесь мы конвертируем тему в строку, состоящую из всего верхнего регистра, это позволяет нам сделать одно сравнение с «TUF» верхнего регистра и «PICKING LIST» верхнего регистра вместо попыткиучитывать каждый вариант оболочки для этих двух подстрок. На самом деле мы не манипулировали myItem.Subject - это все еще сохраняет первоначальный корпус.

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

Прежде всего, вы можете применить фильтр к объекту и объединить их вместе.

criteria = "@SQL=" & Chr(34) _ 
& "urn:schemas:httpmail:subject" & Chr(34) _ 
& " ci_phrasematch 'picking List'" 

Ограничение ci_phrasematch позволяет находить элементы со строками темы, которые содержат каждый элемент из вашего списка.

Метод Items.Restrict применяет фильтр кItems collection, возвращая новую коллекцию , содержащую все элементы из оригинала, которые соответствуют фильтру. Вот пример кода VB.NET:

Private Sub RestrictUnreadItems(folder As Outlook.MAPIFolder)
    Dim restrictCriteria As String = "[UnRead] = true"
    Dim strBuilder As StringBuilder = Nothing
    Dim folderItems As Outlook.Items = Nothing
    Dim resultItems As Outlook.Items = Nothing
    Dim mail As Outlook._MailItem = Nothing
    Dim counter As Integer = 0
    Dim item As Object = Nothing
    Try
        strBuilder = New StringBuilder()
        folderItems = folder.Items
        resultItems = folderItems.Restrict(restrictCriteria)
        item = resultItems.GetFirst()
        While Not IsNothing(item)
            If TypeOf (item) Is Outlook._MailItem Then
                counter += 1
                mail = item
                strBuilder.AppendLine("#" + counter.ToString() + _
                                     " - Subject: " + mail.Subject)
            End If
            Marshal.ReleaseComObject(item)
            item = resultItems.GetNext()
        End While
        If (strBuilder.Length > 0) Then
            Debug.WriteLine(strBuilder.ToString())
        Else
            Debug.WriteLine("There is no match in the " _
                               + folder.Name + " folder.")
        End If
    Catch ex As Exception
        System.Windows.Forms.MessageBox.Show(ex.Message)
    Finally
        If Not IsNothing(folderItems) Then Marshal.ReleaseComObject(folderItems)
        If Not IsNothing(resultItems) Then Marshal.ReleaseComObject(resultItems)
    End Try
End Sub

См. Как: Использовать метод Restrict для получения почтовых элементов Outlook из папки для получения дополнительной информации.

Итак, в основном ваш код VBA должен выглядеть так:

Dim unreadItems as Outlook.Items
Set unreadItems = myitems.Restrict("[Unread] = true")

For Each myitem In unreadItems
   If myitem.Class = olMail Then

     If InStr(1, myitem.Subject, "Tuf" & "Picking List") > 0 Or _
        InStr(1, myitem.Subject, "TUF" & "PICKING LIST") > 0 Or _
        InStr(1, myitem.Subject, "Tuf" & "Picking List:") > 0 Or _
        InStr(1, myitem.Subject, "tuf" & "picking list") > 0 Then
                Debug.Print "Found a Tufnels Picking List"
                    Found = True
                        If Found = True Then

                        End If
      End If
   End If
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...