Ограничение работает только для некоторых получателей

#vba #email #outlook

#vba #Адрес электронной почты #outlook

Вопрос:

У меня есть некоторый код для поддержания чистоты моего почтового ящика.

Процесс:

  1. Вручную перемещайте письма из папки «Исходящие» во входящие. Теперь у меня есть все письма, которые нужно архивировать во входящих.
  2. Запустите код.

Когда у меня была pop3/*pst-files настройка, я использовал правила Outlook и имел некоторый код для запуска всех правил в папке Входящие.

При изменении настройки на Exchange возникли проблемы с правилами.
Внезапно у меня появилось много дубликатов правил, Outlook не мог синхронизироваться с сервером и т. Д.

Теперь у меня есть простая и эффективная концепция, в которой правило выглядит следующим образом:

 @somedomain.dk|XYZ
 

Правило гласит: переместите все электронные письма отправителю / от отправителя в @somedomain.dk Exchange-folder XYZ .

Я выбираю письма для перемещения с помощью этой строки:

 Set mItems = inbox.Items.Restrict(strQry)
iNo = mItems.count
 

Запрос (он работает):

 @SQL="urn:schemas:httpmail:displayto" like '%somedomain.dk%' OR
 "urn:schemas:httpmail:fromemail" like '%somedomain.dk%'
 

В папке «Входящие» у меня 7 писем: получено 4 от и отправлено 3 на этот домен. При выполнении кода собирается 5 писем. Из 3 отправленных мной электронных писем 1 создано мной, а 2 являются ответами. Используя Outlook Spy, я нахожу этот почтовый элемент.To содержит как имя, так и адрес электронной почты в письме, которое я создал, но только имя при ответе.

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

Ответ №1:

Это решение делает то, что мне нужно: перемещать электронные письма в / из somecustomer.com в папку клиента.

Email From: я обнаружил, что email.SenderEmailAddress не улавливает все письма. Некоторые вместо этого найдены с помощью email.Sender .Адрес.

Адрес электронной почты: немного крепкий орешек. Email.To находит некоторые, но только если адрес электронной почты написан с именем (Firstname Lastname <fn@customer.com >). Я обнаружил, что свойство адреса smtp может найти остальное.

 (Module header)
Const PR_SMTP_ADDRESS As String = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"

'>> In procedure
(set objects etc...)
strFrom1 = email.SenderEmailAddress
strFrom2 = email.Sender.Address
strTo1 = email.To
If strTo1 <> "" Then
  strTo2 = email.Recipients(1).PropertyAccessor.GetProperty(PR_SMTP_ADDRESS)
Else
  strTo2 = ""
End If

(loop mails and rules...)
strDom = "*" amp; somedomain.com
'>> Test if mail is to/from somedomain.com
If strFrom2 Like strDom Or strTo1 Like strDom Or strTo2 Like strDom Then
  (do stuff: Move, delete)
End If
(do the rest)
 

Проблемы со скоростью: обработка одного письма за раз занимает немного больше времени, чем при использовании restrict, но: я не нашел способа перемещать несколько писем одной командой, поэтому перемещение в любом случае выполняется по одному.

В моем тесте нет разницы во времени для перемещения 1-200 писем.

Ответ №2:

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

У вас есть несколько вариантов —

  1. Измените имена получателей, чтобы включить адрес, а также имя (свойства / CC / BCC автоматически перестраиваются поставщиком хранилища при сохранении сообщения на основе содержимого таблицы получателей). ООМ, опять же, не поможет вам — Recipient.Name доступно только для чтения
  2. Если опция использует Redemption (я его автор), ее версия Items. Find и Items. Restrict создайте ограничение на имя / адрес получателя / адрес SMTP, если вы используете свойства Recipients/To/CC / BCC в запросе.

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

1. Дмитрий — спасибо за ваше предложение. # 1: Я не могу изменить входящие адреса электронной почты. Я нашел другой способ получить то, что мне было нужно. Я думаю, это не идеально. Если отправитель и получатель находятся в одном домене Exchange, идентификатором почты является эта длинная строка: /o= Первая организация / ou = Административная группа Exchange (…) (спасибо Outlook Spy).

2. Да, это выглядит как адрес типа EX (в отличие от SMTP). Это все равно вам не поможет.