Как искать получателей ранее отправленной почты?

#vba #outlook

#vba #outlook

Вопрос:

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

Я попытался заменить «тема» на «получатели», но безуспешно.

 Public Sub Application_ItemSend(ByVal thisItem As Object, Cancel As Boolean)

Dim ns As Outlook.NameSpace
Dim olfolder As MAPIFolder
Dim Item As Object

 
Set olApp = CreateObject("Outlook.Application")
Set olNs = olApp.GetNamespace("MAPI")
Set firstFolder = olNs.Folders("test@dk.com") ' name of my shared inbox
Set olfolder = firstFolder.Folders("sent items")

' iterate thru emails
For Each Item In olfolder.Items
    ' check subject content amp; date difference
    If InStr(Item.Subject, thisItem.Recipients) And DateDiff("m", Item.SentOn, Now) < 1 Then
        ' added this part
        If MsgBox("already sent", vbYesNo   vbQuestion   vbMsgBoxSetForeground, "Message Text Warning") = vbNo Then
            ' cancel the email
            Cancel = True
        End If
        Exit For
    End If
  

Комментарии:

1. Вы можете посмотреть на .to свойство or recipients — это массив, поэтому вам нужно будет выполнить цикл по нему.

Ответ №1:

Просто замените thisItem.Subject на thisItem.To

редактировать: Nathan_Sav сказал все это 🙂 .Recipents свойство возвращает массив, чтобы вы могли перебирать его в цикле, также можно использовать .To который вернет всех получателей, разделенных точкой с запятой

правка 2: обратите внимание, что есть два других свойства, .cc и .bcc если вы используете их, то в то время как .Recipients array включает их все

Комментарии:

1. Спасибо вам за ответ, а также Натану. Когда я меняю строку на If InStr(Item.Subject, этот элемент. Кому) И DateDiff(«m», Элемент. Отправлено (Сейчас) < 1, тогда это не работает, и это не работает, когда я меняю его на .получатели — я также пытался изменить первую часть, но все еще не работает?

2. Что вы подразумеваете под «не работает»? Где происходит сбой и какое сообщение об ошибке? Получаете ли вы ‘Item.Subject’, ‘thisItem. К элементу’и’. Отправлено правильно?

3. Если я изменю этот элемент.Подчиняюсь этому элементу. К нему выполняется неправильная проверка и он предупреждает меня. Если я изменю его на thisItem.Recipients, появится следующая ошибка: Ошибка времени выполнения ‘5’: недопустимый вызов процедуры или аргумент

4. Вам нужно быть более конкретным, какое предупреждающее сообщение вы получаете с этим элементом. Кому? Как упоминалось выше, thisItem.Recipients не будет работать, поскольку это массив, поэтому вы должны перебирать его в цикле

5. Когда я использую thisItem. На всплывающее сообщение не отображается, даже если я отправляю кому-то более одного раза в месяц.

Ответ №2:

Во-первых, никогда не перебирайте все элементы в папке — это ужасно неэффективно. Используйте Items.Find с ограничением на свойства Subject и SentOn .

Для получателей вы можете использовать ограничение на To свойство, но имейте в виду, что на уровне MAPI это означает ограничение на PR_DISPLAY_TO свойство, которое может включать или не включать фактический адрес электронной почты. ООМ не создает подограничений для PR_MESSAGE_RECIPIENTS свойства. Если используется опция Redemption (я являюсь ее автором), ее версия RDOItems.Find/Restrict позволяет указывать Recipients , To CC , BCC свойства в запросе и создает соответствующее ограничение на адрес электронной почты и имя получателей сообщения.

В худшем случае вы можете ограничить свойства Subject и SentOn с помощью Items.Find/FindNext или Items.Restrict , а затем явно перебирать коллекцию получателей возвращенных совпадений.

Комментарии:

1. У нас есть определенная папка, в которой требуется всего несколько сеансов, поэтому единственная реальная проблема, с которой я сталкиваюсь, заключается в том, что мне нужно изменить ее с subject на recipient, но когда я использую recipient, она выдает ошибку, а когда я использую .to, она не показывает сообщение, даже если я отправляю его одному и тому же человеку несколько раз.

2. Итак, каков ваш код, который обрабатывает получателей? И в чем ошибка?

3. Это то, на что я изменил это сейчас: для каждого элемента в папке olfolder. Элементы проверяют содержимое темы и разницу в дате, если InStr (Item.Subject, thisItem.Recipients) И DateDiff («m», Элемент. Отправлено, сейчас) < 1 Затем ‘ добавлена эта часть, если MsgBox («уже отправлено», vbYesNo vbQuestion vbMsgBoxSetForeground, «Предупреждение о текстовом сообщении») = vbNo Затем ‘ отменить отправку электронной почты Cancel = True Выдается следующее сообщение: Ошибка времени выполнения ‘5’: недопустимый вызов процедуры или аргумент

4. Можете ли вы изменить свой первоначальный вопрос с помощью обновленного кода? Это невозможно прочитать в комментарии.

5. Опять же, вы перебираете все элементы в папке. Не делайте этого — используйте Items.Find/FindNesxt или Items. Ограничить. Во-вторых, Получатели — это коллекция, а не строка. Вы должны перебрать эту коллекцию, чтобы проверить, совпадает ли адрес.