Братцы, сестры и Гуру программирования подскажите пожалуйста как быть и возможно с чего начать: в ходе работы столкнулась с необычной задачей: На почту outloock периодически (очень часто) приходят письма с однотипными запросами (с конкретной темой письма) по которому надо ответить выгрузив кусок таблицы одной и той же большой таблицы по подразделению. По идее необходимо при получении входящего письма макросом excel или в макросом outloock получить почту отправителя, сверить данные отправителя с базой контактов outloock, выгрузить наименование подразделения, далее открыть файл excel ( с этого момента моих знаний наверно хватит) по наименованию подразделению, провести фильтрацию по наименованию подразделения в файле, скопировать кусочек файла excel в новый файл, сохранить новый файл, дальше отправить этот файл ответным письмом на почтовый адрес с которого был направлен запрос (тут моих знаний снова не хватает).
Если все получится= как всегда по итогу выложу полную версию адаптированного рабочего кода, который смогут использовать другие для своих нужд. Заранее спасибо за любую помощь или добрый совет.
Да у меня если все получиться= весь код который у меня получится приложу- основная помощь в подсказках нужна в этом куске:"По идее необходимо при получении входящего письма макросом excel или в макросом outloock получить почту отправителя, сверить данные отправителя с базой контактов outloock, выгрузить наименование подразделения" и в этом "дальше отправить этот файл ответным письмом на почтовый адрес с которого был направлен запрос"
Цитата
БМВ написал: - что за база? Если контакты, то какие, личные, GlobalAB ...
База хз как правильно называется- та которая нажимаешь на кому и открывается окошко "Глобальный список адресов", там есть раздел "Отдел"- вот ума не приложу как наименование отдела вытаскивать из входящего по почте адресата письма макросом. Возможно просто искать по адресу электронной почты в файле и уже по этому фильтровать большой файл excel(он содержит почты) = я не знаю как лучше и куда правильнее начать копать= т.е. то что фактически реализуемо.
Мне бы образцы решений подглядеть подобных ( может были аналогичные решение где кусочек кода можно подсмотреть и понять откуда и что к чему прикручивать)- или подсказать что из чего, какие это объекты может сама бы чего написала, а дальше я сама прикручу, что попроще.
Чуть попозже выложу свою часть кода как его дошлифую и приведу в божеский вид.
БМВ спасибо. Будем подтягивать мат часть . =это уже прогресс, а как автоматически по теме входящего письма запускать макрос и отправить сфоррмированный макросом файл ответным письмом на почтовый адрес с которого был направлен запрос?
ребята из безопасности не дали добро на изменение реестра= без него швах, печально....
Для использования сценариев со скриптами для автоматической обработки входящих писем необходимо внести изменения в реестр: Чтобы это исправить, вам нужно установить значение EnableUnsafeClientMailRules в реестре, а затем перезапустить Outlook.
Outlook 2016 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 16.0 \ Outlook \ Security DWORD: EnableUnsafeClientMailRules Значение: 1
Outlook 2013 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 15.0 \ Outlook \ Security DWORD: EnableUnsafeClientMailRules Значение: 1
Outlook 2010 HKEY_CURRENT_USER \ Software \ Microsoft \ Office \ 14.0 \ Outlook \ Security DWORD: EnableUnsafeClientMailRules Значение: 1
Пользователи Office, использующие правила выполнения сценариев, обнаруживают, что их сценарии в настоящее время отключены (как и « Запуск приложения» ) благодаря обновлению безопасности. Когда обновление установлено, все существующие правила запуска сценариев и запуска приложений будут отключены.
Подобным макаром можно по запросу (кнопке) шерстить папки Outlook из Excel:
Код
Sub ReadOutMail()
Dim fld As Object
Set fld = CreateObject("Outlook.Application")
Set aa = fld.Session.CurrentUser.Session.Folders
For Each bb In aa
For Each cc In bb.Folders
Debug.Print cc.Name
For Each dd In cc.Items
If InStr(dd.Subject, "Нужная тема") > 0 Then 'выбираем тему письма
Debug.Print dd.Subject & " " & dd.CreationTime
Debug.Print dd.Attachments.Count
' здесь какой-то код по обработке
End If
Next
Next
Next
End Sub
Если подключить словарь или массив, то можно собрать нужные данные по письмам с определенной темой или отправителем.
Все содержимое писем в Outlook в HTML формате, насколько я знаю. Это на случай если потребуется ковырять тело писем, то потребуется парсер.
Anchoret написал: Все содержимое писем в Outlook в HTML формате
нет. Есть просто .Body - это текст письма без разметки. Там хоть и будут присутствовать определенные теги(вроде href) - но в основном это будет чисто текст, который парсить в некоторых случаях куда проще. А есть и .HTMLBody - это с полноценной разметкой HTML.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий(The_Prist) Щербаков, во всяком случае таблицы из Excel вставленные в тело письма в HTML формате) БМВ, так для фильтрации массива писем в Outlook же есть встроенный инструмент - "Правила" + возможность создавать папки и пр.. Хотя кому я рассказываю, Вы и так все это лучше меня знаете)
Anchoret написал: таблицы из Excel вставленные в тело письма в HTML формате
ну это да. Но зависит все от того, какая информация нужна будет из письма. Ни разу не встречал ситуацию, когда нужно было выдернуть из письма таблицу со всем форматированием Да и судя по описанию планируется не таблицу в письмо вставлять, а файл Excel.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий(The_Prist) Щербаков написал: Да и судя по описанию планируется не таблицу в письмо вставлять, а файл Excel.
+ (насколько я понял) еще проверять на соответствие адресата из входящего письма определенной группе рассылки. Группы пока не искал, но наверняка и это возможно. Надо поковырять объект Outlook) ---------- Порылся, но ничего относящегося к группам рассылок не нашел. Возможно они на главном сервере компании.
вот тут ХЗ. Написано, что надо почту и подразделение - а где это подразделение взять не очень понятно. То ли это действительно группа, то ли это где-то в таблице соответствия адресов все записано... Но адрес даже Exchange можно получить. Писал когда-то для этого специально функцию:
Код
'---------------------------------------------------------------------------------------
' Function: GetEmailAddress
' Author : The_Prist(Щербаков Дмитрий)
' Профессиональная разработка приложений для MS Office любой сложности
' Проведение тренингов по MS Excel
' https://www.excel-vba.ru
' info@excel-vba.ru
' Purpose: получает адрес отправителя(даже если это Exchange)
'---------------------------------------------------------------------------------------
Public Function GetEmailAddress(mail As Object) As String
Dim oMail As Object
On Error Resume Next
Set oMail = mail
If TypeName(oMail) = "MailItem" Then
If oMail.SenderEmailType = "EX" Then
GetEmailAddress = oMail.Sender.GetExchangeUser.PrimarySmtpAddress
Else
GetEmailAddress = oMail.SenderEmailAddress
End If
Else
GetEmailAddress = "Not a MailItem"
End If
Set oMail = Nothing
End Function
в функцию передаем объект письмо(MailItem), но можно и любой другой, просто функция вернет не адрес, а "Not a MailItem". Но, к слову говоря, метод GetExchangeUser имеет разные свойства. Оттуда можно и отдел и департамент получить, и телефон, если они записаны для адресата.
По поводу раскидать по папкам. Лично я не люблю. Поиск позволяет найти не хуже. Про группы писал выше. Добавлю даже если к оффлайн АВ обратится, то список членов динамической группы не получить. Да и группы дистрибюции могу не отдавать список скрывая его членов.
БМВ написал: ...Как отслеживать событие нового сообщения тогда?
Добрый вечер, Михаил. В Outlook код модуля ThisOutlookSession:
Код
Option Explicit
Private WithEvents objItems As Outlook.Items
Private Sub Application_Startup()
Set objItems = Application.GetNamespace("MAPI").GetDefaultFolder(olFolderInbox).Items
End Sub
Private Sub objItems_ItemAdd(ByVal Item As Object)
Dim x As MailItem
If Item.Class <> olMail Then
Exit Sub
Else
Set x = Item
End If
' Your code goes here
MsgBox "Message subject: " & x.Subject & vbLf _
& "Message sender: " & x.SenderName & " (" & x.SenderEmailAddress & ")"
End Sub
ZVI, Владимир, спасибо. Надо будет погонять, есть сомнение не в работоспособности, а в применимости совместно с другими правилами, но это не вопрос кода. Я собственно о том, что правила, работающие на сервере, выполнятся до старта кода и в olFolderInbox может не оказаться нужного сообщения.
Михаил, а при чём другие правила, выполняемые на сервере, в данном случае? Автор темы же написала, что получает письма, а код их и перехватит без всяких правил.
Владимир, я о том что если Еxchange сервер, то очень большое количество правил обрабатывается на нем и только очень сложные и специфические работают на клиенте. Иначе б не работала OWA и ActiveSunc для мобильных устройств в соответствии с ожидаемым. А раз так, то в корень inbox сообщение может и не падать, с точки зрения outlook. Таким образом если про это забыть то можно сделать правило которое случайно нарушит работу скрипта.
БМВ написал: А раз так, то в корень inbox сообщение может и не падать, с точки зрения outlook
Привет, Михаил. Протестировал код Владимира в Outlook 365 персональный при настроенном правиле - отправлять письма от меня на yandex сразу в папку Yandex. Код не сработал. Зато отработало такое событие
Код
Private Sub Application_NewMailEx(ByVal EntryIDCollection As String)
MsgBox EntryIDCollection
End Sub
Так что остаётся наковырять - с чем есть это EntryIDCollection Забавно, отправил ещё со своего gmail адреса - срабатывает только событие ItemAdd. Если его отключить, только тогда работает NewMailEx
написал: Подобным макаром можно по запросу (кнопке) шерстить папки Outlook из Excel:
Код
[URL=#]?[/URL] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Sub ReadOutMail() Dim fld As Object Set fld = CreateObject( "Outlook.Application" ) Set aa = fld.Session.CurrentUser.Session.Folders For Each bb In aa For Each cc In bb.Folders Debug.Print cc.Name For Each dd In cc.Items If InStr(dd.Subject, "Нужная тема" ) > 0 Then 'выбираем тему письма Debug.Print dd.Subject & " " & dd.CreationTime Debug.Print dd.Attachments.Count ' здесь какой-то код по обработке End If Next Next Next End Sub
Если подключить словарь или массив, то можно собрать нужные данные по письмам с определенной темой или отправителем.
Все содержимое писем в Outlook в HTML формате, насколько я знаю. Это на случай если потребуется ковырять тело писем, то потребуется парсер.
Цитата
Этот Макрос работает.но на некоторых пк выдаёт ошибку "run time error 429. ActiveX component can,t create object". Ошибка эта вылетает на строке set fld=createobject"outlook.application")
Цитата
Мысль,что причина в версии аутлука либо в разрядности. Как можно сделать универсальной эту строку под любую версию офиса?
похвально Но лучше бы оформили его правильно, а не смешивали с цитированием всего сообщения. Ничего в итоге не понятно и читается с трудом. По факту самого вопроса:
Цитата
написал: Как можно сделать универсальной эту строку под любую версию офиса?
Эта строка и так универсальна и работает с любой версией офиса. Где Вы там увидели хоть намек на конкретную версию? Дело не в строке, а в самом ПК. Там просто либо установлена урезанная версия офиса, либо Outlook установлен криво. Поэтому и не получается подключиться к нему методом позднего связывания.
Когда в Excel при установленном Outlook возникает ошибка с СreateObject("Outlook.Application"), то причина - в отличии прав доступа к этим приложениям. Решение -запуск Excel от имени администратора, что можно вручную задать для Excel.exe. Аналогично и для других приложений, например, для Word.
похвально Но лучше бы оформили его правильно, а не смешивали с цитированием всего сообщения. Ничего в итоге не понятно и читается с трудом. По факту самого вопроса:
Цитата
написал: Как можно сделать универсальной эту строку под любую версию офиса?
Эта строка и так универсальна и работает с любой версией офиса. Где Вы там увидели хоть намек на конкретную версию? Дело не в строке, а в самом ПК. Там просто либо установлена урезанная версия офиса, либо Outlook установлен криво. Поэтому и не получается подключиться к нему методом позднего связывания.
Цитата
Спасибо за ответ. Но с телефона у меня только так получается отвечать.... Не могу разобраться как корректно ответить.
Цитата
Я поменял createobject на getobject - вроде теперь работает нормально. Сильно изменил я логику работы макроса при этом?