Страницы: 1
RSS
макрос excel на анализ входящей почты outloock и отправку файла excel
 
Братцы, сестры и Гуру программирования подскажите пожалуйста как быть и возможно с чего начать: в ходе работы столкнулась с необычной задачей:
На почту outloock периодически (очень часто) приходят письма с однотипными запросами (с конкретной темой письма) по которому надо ответить выгрузив  кусок таблицы одной и той же большой таблицы по подразделению. По идее необходимо при получении входящего письма макросом excel или в  макросом outloock  получить почту отправителя, сверить данные отправителя с базой контактов outloock, выгрузить наименование подразделения, далее  открыть файл excel ( с этого момента  моих знаний наверно хватит) по наименованию подразделению, провести фильтрацию по наименованию подразделения в файле, скопировать кусочек файла excel  в новый файл, сохранить новый файл, дальше отправить этот файл  ответным письмом на почтовый адрес с которого был направлен запрос (тут моих знаний снова не хватает).


Если все получится= как всегда по итогу выложу полную версию адаптированного рабочего кода, который смогут использовать другие для своих нужд. ;)
Заранее спасибо за любую помощь или добрый совет.
Изменено: Tesla_LOLa - 30.09.2019 18:24:59
 
Цитата
Tesla_LOLa написал:
Если все получится
У кого?

Цитата
Tesla_LOLa написал:
добрый совет.
ТЗ в ветку работа.  и потом - ваше дело,
Цитата
Tesla_LOLa написал:
по итогу выложу полную версию адаптированного рабочего кода
или нет. тем более что масса вопросов будет к специфике , например  
Цитата
Tesla_LOLa написал:
сверить данные отправителя с базой контактов outloock
- что за база? Если контакты, то какие, личные, GlobalAB ...
По вопросам из тем форума, личку не читаю.
 
БМВ спасибо за ответ и что нашел время.

Да у меня если все получиться= весь код который у меня получится приложу- основная помощь в подсказках нужна в этом куске:"По идее необходимо при получении входящего письма макросом excel или в  макросом outloock  получить почту отправителя, сверить данные отправителя с базой контактов outloock, выгрузить наименование подразделения" и в этом "дальше отправить этот файл  ответным письмом на почтовый адрес с которого был направлен запрос"
Цитата
БМВ написал:
- что за база? Если контакты, то какие, личные, GlobalAB ...
База хз как правильно называется- та которая нажимаешь на кому и открывается окошко "Глобальный список адресов", там есть раздел "Отдел"- вот ума не приложу как наименование отдела вытаскивать из входящего по почте адресата письма макросом. Возможно просто искать по адресу электронной почты в файле и уже по этому фильтровать большой файл excel(он содержит почты) = я не знаю как лучше  и куда правильнее начать копать= т.е. то что фактически реализуемо.

Мне бы образцы решений подглядеть подобных ( может были аналогичные решение где кусочек кода можно подсмотреть и понять откуда и что к  чему прикручивать)- или подсказать что из чего, какие это объекты может сама бы чего написала, а дальше я сама прикручу, что попроще.

Чуть попозже выложу  свою часть кода как его дошлифую и приведу в божеский вид.
Изменено: Tesla_LOLa - 30.09.2019 17:10:23
 
Цитата
Tesla_LOLa написал:
как наименование отдела вытаскивать из входящего по почте адресата письма макросом
так как указано что глобальная книга, то скорее всего сервер exchange, а тогда просто LDAP запрос с фильтром по почте и поле Department даст то что нужно.
http://qaru.site/questions/3428170/vbscript-ldap-custom-filter-queries-trying-to-search-for-all-computers-in-the-domain-but-excluding-an-ou-or-2
https://social.technet.microsoft.com/wiki/contents/articles/8077.active-directory-ldap-ru-ru.aspx
Можно и стандартный SQL синтаксис пользовать, но в данном случае совершенно не нужно.
Изменено: БМВ - 30.09.2019 17:23:57
По вопросам из тем форума, личку не читаю.
 
БМВ спасибо. Будем подтягивать мат часть  :*  . =это уже прогресс, а как автоматически по теме входящего письма  запускать макрос и отправить сфоррмированный макросом файл  ответным письмом на почтовый адрес с которого был направлен запрос?
 
Цитата
Tesla_LOLa написал:
а как автоматически по теме входящего письма  запускать макрос
https://www.slipstick.com/outlook/rules/outlooks-rules-and-alerts-run-a-script/
По вопросам из тем форума, личку не читаю.
 
ребята из безопасности не дали добро на изменение реестра= без него швах, печально.... :cry:

Для использования сценариев со скриптами  для автоматической обработки входящих писем необходимо внести изменения в реестр:
Чтобы это исправить, вам нужно установить значение 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 не заблокировано, то макросами все можно и сделать.
 
ZVI, Владимир, приветствую. Как отслеживать событие нового сообщения тогда? Правило - самый простой вариант.
По вопросам из тем форума, личку не читаю.
 
Подобным макаром можно по запросу (кнопке) шерстить папки 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 - 08.10.2019 17:39:36
 
Цитата
Anchoret написал:
Все содержимое писем в Outlook в HTML формате
нет. Есть просто .Body - это текст письма без разметки. Там хоть и будут присутствовать определенные теги(вроде href) - но в основном это будет чисто текст, который парсить в некоторых случаях куда проще. А есть и .HTMLBody - это с полноценной разметкой HTML.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Anchoret, это то понятно, но если в о входящих несколько тысяч сообщений, то …..
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
если в о входящих несколько тысяч сообщений, то …..
то лучше отбирать при помощи SQL DASL - здесь показывал пример: Как можно ускорить обработку писем из почты?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, во всяком случае таблицы из Excel вставленные в тело письма в HTML формате)
БМВ, так для фильтрации массива писем в Outlook же есть встроенный инструмент - "Правила" + возможность создавать папки и пр.. Хотя кому я рассказываю, Вы и так все это лучше меня знаете)
 
Цитата
Anchoret написал:
таблицы из Excel вставленные в тело письма в HTML формате
ну это да. Но зависит все от того, какая информация нужна будет из письма. Ни разу не встречал ситуацию, когда нужно было выдернуть из письма таблицу со всем форматированием :) Да и судя по описанию планируется не таблицу в письмо вставлять, а файл Excel.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Да и судя по описанию планируется не таблицу в письмо вставлять, а файл Excel.
+ (насколько я понял) еще проверять на соответствие адресата из входящего письма определенной группе рассылки. Группы пока не искал, но наверняка и это возможно. Надо поковырять объект Outlook)
----------
Порылся, но ничего относящегося к группам рассылок не нашел. Возможно они на главном сервере компании.
Изменено: Anchoret - 08.10.2019 18:55:19
 
Цитата
Anchoret написал:
определенной группе рассылки
вот тут ХЗ. Написано, что надо почту и подразделение - а где это подразделение взять не очень понятно. То ли это действительно группа, то ли это где-то в таблице соответствия адресов все записано...
Но адрес даже 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 имеет разные свойства. Оттуда можно и отдел и департамент получить, и телефон, если они записаны для адресата.
Изменено: Дмитрий(The_Prist) Щербаков - 08.10.2019 18:54:55
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
По поводу раскидать по папкам. Лично я не люблю. Поиск позволяет найти не хуже. Про группы писал выше. Добавлю даже если к оффлайн АВ обратится, то список членов динамической группы не получить. Да и группы дистрибюции могу не отдавать список скрывая его членов.
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал: ...Как отслеживать событие нового сообщения тогда?
Добрый вечер, Михаил.
В 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 - 08.10.2019 20:03:43
 
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")
Цитата
Мысль,что причина в версии аутлука либо в разрядности. Как можно сделать универсальной эту строку под любую версию офиса?
 
Anchoret,  сверху написал вопрос
 
Цитата
написал:
сверху написал вопрос
похвально :) Но лучше бы оформили его правильно, а не смешивали с цитированием всего сообщения. Ничего в итоге не понятно и читается с трудом.
По факту самого вопроса:
Цитата
написал:
Как можно сделать универсальной эту строку под любую версию офиса?
Эта строка и так универсальна и работает с любой версией офиса. Где Вы там увидели хоть намек на конкретную версию?
Дело не в строке, а в самом ПК. Там просто либо установлена урезанная версия офиса, либо Outlook установлен криво. Поэтому и не получается подключиться к нему методом позднего связывания.
Изменено: Дмитрий(The_Prist) Щербаков - 27.07.2022 15:54:21
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Когда в Excel при установленном Outlook возникает ошибка с СreateObject("Outlook.Application"), то причина - в отличии прав доступа к этим приложениям.
Решение -запуск Excel от имени  администратора, что можно вручную задать для Excel.exe.
Аналогично и для других приложений, например, для Word.
Изменено: ZVI - 27.07.2022 17:18:54
 
Цитата
написал:
Цитата
написал:
сверху написал вопрос
похвально  Но лучше бы оформили его правильно, а не смешивали с цитированием всего сообщения. Ничего в итоге не понятно и читается с трудом.
По факту самого вопроса:
Цитата
написал:
Как можно сделать универсальной эту строку под любую версию офиса?
Эта строка и так универсальна и работает с любой версией офиса. Где Вы там увидели хоть намек на конкретную версию?
Дело не в строке, а в самом ПК. Там просто либо установлена урезанная версия офиса, либо Outlook установлен криво. Поэтому и не получается подключиться к нему методом позднего связывания.
Цитата
Спасибо за ответ. Но с телефона у меня только так получается отвечать.... Не могу разобраться как корректно ответить.
Цитата
Я поменял createobject на getobject - вроде теперь работает нормально. Сильно изменил я логику работы макроса при этом?
 
Ромул РОМ,  Что за ..... вернитесь и исправьте или грохну и сообщения и учетку забаню. Злой я сегодня.
По вопросам из тем форума, личку не читаю.
 
Цитата
написал:
Ромул РОМ,  Что за ..... вернитесь и исправьте или грохну и сообщения и учетку забаню. Злой я сегодня.
Я не понимаю как с телефона исправить старые сообщения. Сегодня вечером с компа попробую сделать.
Страницы: 1
Наверх