#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
свойство orrecipients
— это массив, поэтому вам нужно будет выполнить цикл по нему.
Ответ №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. Ограничить. Во-вторых, Получатели — это коллекция, а не строка. Вы должны перебрать эту коллекцию, чтобы проверить, совпадает ли адрес.