#vba #email #outlook
#vba #Адрес электронной почты #outlook
Вопрос:
У меня есть некоторый код для поддержания чистоты моего почтового ящика.
Процесс:
- Вручную перемещайте письма из папки «Исходящие» во входящие. Теперь у меня есть все письма, которые нужно архивировать во входящих.
- Запустите код.
Когда у меня была 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 нет проблем с этим.
У вас есть несколько вариантов —
- Измените имена получателей, чтобы включить адрес, а также имя (свойства / CC / BCC автоматически перестраиваются поставщиком хранилища при сохранении сообщения на основе содержимого таблицы получателей). ООМ, опять же, не поможет вам —
Recipient.Name
доступно только для чтения - Если опция использует Redemption (я его автор), ее версия Items.
Find
и Items.Restrict
создайте ограничение на имя / адрес получателя / адрес SMTP, если вы используете свойства Recipients/To/CC / BCC в запросе.
Комментарии:
1. Дмитрий — спасибо за ваше предложение. # 1: Я не могу изменить входящие адреса электронной почты. Я нашел другой способ получить то, что мне было нужно. Я думаю, это не идеально. Если отправитель и получатель находятся в одном домене Exchange, идентификатором почты является эта длинная строка: /o= Первая организация / ou = Административная группа Exchange (…) (спасибо Outlook Spy).
2. Да, это выглядит как адрес типа EX (в отличие от SMTP). Это все равно вам не поможет.