Показать полную графическую версию : Проверка достоверности адреса исходящего письма в скрипте MS Outlook
У меня — находит (VBScript):
Option Explicit
Const olFolderInbox = &H06
Dim objOutlook
Dim objNameSpace
Dim objMAPIFolder
Dim collItems
Dim objMailItem
Set objOutlook = WScript.CreateObject("Outlook.Application")
Set objNameSpace = objOutlook.GetNameSpace("MAPI")
Set objMAPIFolder = objNameSpace.GetDefaultFolder(olFolderInbox)
Set collItems = objMAPIFolder.Items
Set objMailItem = collItems.Find("[Subject] = 'Налоги_июнь_2011'")
Do Until objMailItem Is Nothing
With objMailItem
WScript.Echo "EntryID:", .EntryID
WScript.Echo "==============="
WScript.Echo "To: ", .To
WScript.Echo "Subject:", .Subject
WScript.Echo "Body:"
WScript.Echo "---------------"
WScript.Echo .Body
WScript.Echo "---------------"
WScript.Echo
End With
Set objMailItem = collItems.FindNext
Loop
Set objMailItem = Nothing
Set collItems = Nothing
Set objMAPIFolder = Nothing
Set objNameSpace = Nothing
Set objOutlook = Nothing
WScript.Quit 0
EntryID: 00000000FEECAA007BA93142AA08FBF8921FB867C4092000
===============
To: someuser1@mail.com
Subject: Налоги_июнь_2011
Body:
---------------
Hello1
---------------
EntryID: 00000000FEECAA007BA93142AA08FBF8921FB867040A2000
===============
To: someuser2@mail.com
Subject: Налоги_июнь_2011
Body:
---------------
Hello2
---------------
Работаете по полному соответствию искомой строки полю «Тема»?
Работаете по полному соответствию искомой строки полю «Тема»? »
Не-а, полное соответствие - это "==" ?. А может есть функция (метод) обрезки начальных и концевых пробелов, как ALLTRIM() в Фоксе?. Это удобнее, если использовать в фильтре поиска не символьную строку, а переменную.
.У меня — находит (VBScript):
Код: »
С VBScript не работал (просто быстренько слазил прямо из форума в Инет росмотреть- что это такое), но из примера вполне понятно, что нужен обычный тупой перебор почты на соответствие. Кстати тогда понятно, почему 1-ю строку находит сразу - она ведь первая в списке "Входящих". Так это у меня и без Find работало. Ну что-же по крайней мере с этим ясно, за что - спасибо
Цитата:
Код: »
*************************************************************
Кус моего модуля под Фоксом :l
oCnt = loFldr.Items.Count && всего писем в "Входящих"
IF loCnt>0
FOR i=1 TO loCnt
WAIT loFldr.Items(i).Subject WINDOW NOWAIT
и т.д. ......
*************************************************************
так меня интересовало вычисление нумера " i " а не EntryID, ведь похоже,что " i " - это тоже свойсто только наверное папки, а не письма и без перебора писем в папке до него не добраться.
И все таки В любом случае - помощь хорошая (да! - кстати не пойму как отправить благодарности на форуме, а надо бы). » - хоть и мелочь но сделать это я должен, по правилам хорошего тона.
Е. Шапиро
Не-а, полное соответствие - это "==" ?. »
Нет, я про это:
Find Method
…
Additional Notes
If you are trying to use the Find or Restrict methods with user-defined fields, the fields must be defined in the folder, otherwise an error will occur. There is no way to perform a "contains" operation. For example, you cannot use Find or Restrict to search for items that have a particular word in the Subject field. Instead, you can use the AdvancedSearch method, or you can loop through all of the items in the folder and use the InStr function to perform a search within a field. You can use the Find and Restrict methods to search for items that begin within a certain range of characters. For example, to search for all contacts with a last name beginning with the letter M, use this filter:
sFilter = "[LastName] > 'LZZZ' And [LastName] < 'N'"
…
То есть: поле Тема действительно полностью состоит из текста «Налоги_июнь_2011», ни больше, ни меньше? Если нет, то пробуйте пользовать указанный метод «AdvancedSearch()».
Кус моего модуля под Фоксом :l
oCnt = loFldr.Items.Count && всего писем в "Входящих"
IF loCnt>0
FOR i=1 TO loCnt
WAIT loFldr.Items(i).Subject WINDOW NOWAIT
и т.д. ......
*************************************************************
так меня интересовало вычисление нумера " i " а не EntryID, ведь похоже,что " i " - это тоже свойсто только наверное папки, а не письма и без перебора писем в папке до него не добраться. »
«EntryID» был приведён мною просто для примера. Что Вам нужно, пока не понял.
Delirium
24-09-2011, 15:50
Насчет Фокса: для файл-серверных систем малых предприятий еще очень даже... (имел возможность сравнить с наработками на других языках, кстати довольно свежими), мне уже не 30 да и коней на переправе не меняют. »
Соглашусь :) У меня на работе тоже половина всего софта на фоксе и 2 программера, которые постоянно доделывают и пишут новое. Сам я писал на C++, Visual FoxPro, теперь уже почти 5 лет пишу на C#.
кстати не пойму как отправить благодарности на форуме, а надо бы). »
Под каждым сообщением, есть кнопка с поднятым пальцем "полезное сообщение" :)
То есть: поле Тема действительно полностью состоит из текста «Налоги_июнь_2011», ни больше, ни меньше? Если нет, то пробуйте пользовать указанный метод «AdvancedSearch()». »
Поле Тема действительно полностью состоит из текста «Налоги_июнь_2011»- один в один, я его для пробы посто передирал копированием из свойств письма в Outlook, хотя в реальности это будет переменная, формируемая мною автоматисски, в зависимости от месяца и года.
«EntryID» был приведён мною просто для примера. Что Вам нужно, пока не понял. »
*************************************************************
Кус моего модуля под Фоксом :l
oCnt = loFldr.Items.Count && всего писем в "Входящих"
IF loCnt>0
FOR i=1 TO loCnt
WAIT loFldr.Items(i).Subject WINDOW NOWAIT
и т.д. ......
************************************************************* »
При изменении << i >> в цикле от 1 до oCnt - на экран выводятся .....Items(i).Subject - наименования тем писем в соответствующей папке, с самого раннего до последнего. Т.е. << i >> определяет вполне конкретное письмо и соответственно, и именно по этому << i >> наверное можно выйти на конкретное письмо, но << i >> - похоже свойство письма в папке и как до него (до этого самого << i >> ) добраться - вопрос конечно интересный, но похоже неважный - всё равно идет полный прогон по папке, я это << i >> и так получаю .
А AdvancedSearch и LastName - гляну завтреча, сегодня уже лом.
Кстати по моему в строке sFilter = "[LastName] > 'LZZZ' And [LastName] < 'N'" - по моему ошибка, не 'N' а 'M', ежели по Additional Notes. А если нет - то почему?
С уважением Е.Шапиро
Поле Тема действительно полностью состоит из текста «Налоги_июнь_2011»- один в один, я его для пробы посто передирал копированием из свойств письма в Outlook, хотя в реальности это будет переменная, формируемая мною автоматисски, в зависимости от месяца и года. »
Хмм… Тогда даже не знаю. Код (http://forum.oszone.net/post-1759127.html#post1759127) Ваш визуально аналогичен моему (http://forum.oszone.net/post-1759191.html#post1759191) в части поиска.
Jean55, а попробуйте пока просто проверить — сохранить мой код (http://forum.oszone.net/post-1759191.html#post1759191) в файле с расширением «.vbs» в кодировке ANSI (windows-1251), и запустить его из командной строки на исполнение:
cscript.exe //nologo "<путь к скрипту>\<имя скрипта>.vbs"
Найдёт ли он у Вас совпадения? Все ли совпадения переберёт? И отпишитесь сюда.
При изменении << i >> в цикле от 1 до oCnt…»
Спасибо, теперь ясно. Вот здесь у Вас не вполне верное рассуждение:
Т.е. << i >> определяет вполне конкретное письмо »
i — порядковый номер, определяющий конкретный объект «Item» в текущий момент. Добавится/удалится какой-либо «Item» (здесь это обычно «MailItem») — и всё, номера сдвинутся. А вот уникальное свойство «EntryID» по-прежнему будет однозначно определять данный «Item» среди прочих «Item'ов».
Кстати по моему в строке sFilter = "[LastName] > 'LZZZ' And [LastName] < 'N'" - по моему ошибка, не 'N' а 'M', ежели по Additional Notes. А если нет - то почему? »
Потому что верно именно 'N':
'M' > 'LZZZ' и 'M' < 'N'
'Mail' > 'LZZZ' и 'Mail' < 'N'
'MMM' > 'LZZZ' и 'MMM' < 'N'
'MZZ' > 'LZZZ' и 'MZZ' < 'N'
но не 'M':
'M' > 'LZZZ' и 'M' < 'M'
'Mail' > 'LZZZ' и 'Mail' < 'M'
'MMM' > 'LZZZ' и 'MMM' < 'M'
'MZZ' > 'LZZZ' и 'MZZ' < 'M'
Общее и полное здрасьте всем. После отпусков и прочих дел (включая, естественно и самостоятельную работу и самостоятельные разборки с возникающими вопросами) можно сделать некоторые промежуточные выводы.
Модуль (пока что - тестовый, делающий усё от начала до конца единым файлом) работает!!!
Т.е. реально выполняется (и с вашей помощью):
- скачать общий .pdf файл налогов
- поделить на отдельные .pdf страницы
- из каждой страницы выделить фамилю и имя и из базы Фокса считать мэйл этого человека
(кстати, та ещё задачка! )
- производится отправка этих отдельных .pdf страниц на почту этих людей
Сейчас производится доводка (в основном вопросы сервиса)
- программная проверка загрузки и загрузка, при необходимости Outlook (ну не верю я что пользователли
работают всегда по инструкции и без проколов!!!)
- программная загрузна новых входящих писем Outlook
- создание (по требованию) списков работников, которые есть в общем .pdf файле и нет в базе Фокса и,
естественно наобормот.
Наверняка будут ишшо и другие. Но это в основном Фоксовские прибамбасы, а поэтому надеюсь без серьёзных промблем (тьфу-тьфу шобб не сглазить).
Затем надо будет расташшить эту программу по объектам модуля обработки почты, что тоже только вопрос техники и времени.
А у меня сейчас вопрос, чесно говоря не принципиальный (можно обойтись просто сообщением на экран
"Загрузите Outlook... ") , но усе равно интересно:
как программно обновить почту Outlook средствами Объектной модели Outlook? Как я понял это либо событие
NewMail, либо метод AddNew ( AddNew, похоже просто имеет больше параметров, что мне просто не надо,
мне надо просто обновить папку Входящие), а вот как это делать - не понял ни черта, хотя примеров дофига
и более. Два дня (с перерывами) копал.
Например в MSDN: "......NewMail используется для выполнения пользовательских действий при получении
пользователем сообщения электронной почты."
О каком пользователе и сообщении электронной почты идет речь? Ведь по логике Outlook, при нормальном
пуске все запрашивает самолежательно. Мне же нужно принудительное обновление, поскольку, похоже
обновление входящей почты при запуске Outlook из под Фокса не происходит... Ну и т.д.
Т.е. как реально желателен кус кода VBA на принудительное обновление входящей почты и если можно с разъяснениями. Буду очень благодарен
Е. Шапиро
как программно обновить почту Outlook средствами Объектной модели Outlook? »
Объект Outlook.Namespace, его свойства и методы - AskIt.RU (http://www.askit.ru/custom/vba_office/m13/13_04_outlook_namespace_object.htm)
SyncObject Object (http://msdn.microsoft.com/en-us/library/aa211062(v=office.11).aspx) --> Start Method (http://msdn.microsoft.com/en-us/library/aa210308(v=office.11).aspx).
Не забудьте убедиться, что в свойствах соответствующей группы отправки/получения почты в параметрах соответствующей учётной записи установлены флажки « Отправка почты», « Получение почты».
Спасибо, SyncObject Object и Start Method - вполне пошло и работает. Хотя конечно не без некоторых непоняток : при прогоне всей задачи несколько раз подряд - свойство ....SyncObjects.Count своего значения не меняет. Описание: "Возвращает указание на количество объектов в указанной коллекции. Только для чтения."
И сразу же вопрос: количество чего? Если новых объектов (записей почты???) - то после первого же прогона значение ....SyncObjects.Count должно быть равно нулю, ведь данные уже синхронизированы, а оно не обнуляется. Или это только сегодняшняя почта - а если компунтер (или даже просто Outlook) несколько дней не включали, то будет ли качать от последнего включения (синхренизации данных)?
Конечно, как мед- так и ложкой: а можно ли как-то закачивать почту по выбору, например по свойству .Subject. Ни у SyncObject, ни у SyncObjects этого свойства нетути - нужно что-то иное.
В ссылке "Объект Outlook.NameSpace, его свойства и методы - Asklt.RU" (см выше) есть такие строки:
**************************************************************
...
...
oNamespace.SyncObjects("Все учетные записи").Start
End Sub
'… и ловим события появления нового сообщения
Private Sub oItems_ItemAdd(ByVal Item As Object)
MsgBox Item.Subject
End Sub
В документации Microsoft для события ItemAdd указано, что оно.....
**************************************************************
Вроде бы то шо надоть и если зацепиться за Item.Subject то можно все раскрутить в куче с .SyncObject, но абсолютно не понятно, почему ".... и ловим события появления нового сообщения " ПОСЛЕ программной загрузки почты ,а событие ItemAdd нигде в примере не прописано.
И ишшо стоит ли как-то ускорять поиск конкретного письма во "Входящих" с помощью метода AdvancedSearch()
(мутный он какой-то, как деревенский самогон - поиск в асинхронном режиме, который пока непонятно как прерывать; какие-то странные строки фильтра - "urn:schemas:mailheader:subject " - только и остаётся драть не разбираясь да и нет времени). Т.е. реально ли он шустрее обычного тупого перебора и (хотя бы ориентировочно) при каком количестве записей почты? Может просто предусмотреть зачистку данных хотя-бы раз в год и "не морочить себе две пачки маргарина"?
Буду очень благодарен за ответ.
Е. Шапиро
И сразу же вопрос: количество чего? »
SyncObjects Interface
Contains a set of SyncObject objects representing the Send/Receive groups for a user.
…
Таким образом, сколько бы Вы раз не «прогоняли задачу» — количество групп отправки и получения от этого не изменится. «Все учетные записи» — одна из таких групп (возможно — единственная).
а событие ItemAdd нигде в примере не прописано. »
Вот обработчик события:
Private Sub oItems_ItemAdd(ByVal Item As Object)
Само событие генерируется самим приложением. Вы получите столько вызовов этой процедуры, сколько будет добавлено объектов.
И ишшо стоит ли как-то ускорять поиск… »
Не могу дать Вам какого-либо определённого ответа, поскольку:
1) я не пользуюсь Microsoft Outlook, и никогда с ним не работал;
2) вытекающее из первого — если бы я даже захотел попробовать — у меня не найдётся подходящего объёма данных базы писем.
Нашел такую процедуру, на MSDN (к сожалению для того, чтобы задать вопрос, вынужден цитировать ее полностью - здесь важно почти все):
----------------------------------------------------------------------------------------------
Public Sub Sync()
Dim nsp As Outlook.NameSpace
Dim sycs As Outlook.SyncObjects
Dim syc As Outlook.SyncObject
Dim i As Integer
Dim strPrompt As Integer
Set nsp = Application.GetNamespace("MAPI")
Set sycs = nsp.SyncObjects
For i = 1 To sycs.Count
Set syc = sycs.Item(i)
strPrompt = MsgBox( _
"Do you wish to synchronize " & syc.Name &"?", vbYesNo)
If strPrompt = vbYes Then
syc.Start
End If
Next
End Sub
Все вполне ясно и понятно, но хотелось бы кой-чё уточнить.
------------------------------------------------------------------------------------------------------------------
итак : если sycs.Count -> это количество групп отправки и получения »
то идет ли синхренизация последовательно, т.е. вначале, предположим идет вопрос по папке
"Входящие" и сверяется усе по этой папке, затем - вопрос по следующей по списку папке и ее
сихронизация и т.д., до достижения конечного значения sycs.Count?
При этом, если этот модуль будет вставлен в мою задачу (точнее модуль, подогнанный под Фокс, но
логика не меняется абсолютно), то программа НЕ пойдет выполняться дальше, пока не будет
достигнут ...End Sub?
Для меня это принципиально важно, т.к. я должен тормознуть задачу до окончания принудительного обновления Outlook из под Фокса (программа используется ориентировочно раз в месяц, почты может много накопиться и качать она будет долго), а программа, если она до окончания ...End Sub не остановится, за это время может проскочить далеко вперед, и нужное письмо просто не не успеет загрузиться.
Попытки найти подходящие обработчики событий пока ничего не дают.
Промблема вот в чем (возможно это Вы знаете но все-таки думаю стоит все-таки ето расписать):
Outlook из под Фокса, как объект определяется функцией CREATEOBJECT(......)
loOutlook = CREATEOBJECT("Outlook.application") здесь -> loOutlook - это созданная мной переменная Фокса типа объект в данной задаче. И фоксовская программа распознает все что относится к программированию под Outlook только, если строка постоена на элементе loOutlook или элементах на его основе, например:
loMapi = loOutLook.GetNameSpace("MAPI") - поймет прекрасно, как объект Outlook
loInbox = loMapi.GetDefaultFolder(6) |иначе loInbox = loOutLook.GetNameSpace("MAPI").GetDefaultFolder(6)|
тоже поймет прекрасно
а вот модуль отслеживания окончания сихронизации:
"[http://msdn.microsoft.com/en-us/library/bb147657(v=office.12).aspx"
Public WithEvents oItems As Outlook.Items
********************************
********************************
Private Sub mySync_SyncEnd()
MsgBox "Synchronization is complete."
End Sub
- не поймет т.к. нет возможности свести конструкцию к объектам на основе loOutlook цельной строкой
т.е. не удается создать конструкцию loOutlook......WithEvents или loOutlook....SyncEnd
а попытка Фокса интертрепировать конструкцию VBA, как фоксовские операторы, приведет к ошибке, либо
работе с непредсказуемым результатом. И свести его к конструкции с loOutLook, увы,увы. Копал долго, но без
результата.
А теперь - чем хороша Sub Sync(), что прописана в начале :
если я прав в в тех вопросах, что я задал в начале то программа вполне интерпретируется под Фокс и не пойдет дальше просто по автомату или с элементарной доработкой.
Прошу извинить за многословность, но она вынужденная чтобы было ясно о чем речь.
Думаю ответ будет значительно короче.
Е. Шапиро
М-да, я тут ишшо покопал и похоже все-таки не прав. Ситуация по Макаревичу: "... И каждый пошел своею дорогой...". Т.е. вопросы по группам и их синхренизация - отдельно, а выполнение кода программы - отдельно.
А есть ли какой - нибудь другой способ обработки событий в OutLook, без ... WithEvents ?
Е. Шапиро
Jean55, я, помнится, Вам уже предлагал отказаться от Outlook и задействовать работу с почтой в самом приложении.
Это я помню, спасибо и обязательно покопаю в эту сторону. А пока просто надо довести хоть что-то до рабочего состояния. Плюсы и минусы OutLook мы в общем обсуждали - где то 50 на 50 (а вообще-то OutLook - гадость редкосная). И кстати, есть такая штука, как "СОМ - Автоматизация", которая позволяет делать что угодно из под Фокса в основных приложениях MS Office и из под VBA. Но попытка разобраться в ней по хелпам и книгам - еще на месяц копания (на каждую строку текста примера - букет вопросов без ответов, а строк там...). Пару дней уже ухлопал. Бэсс результату. Да и время жмет.
Поэтому вопрос об использовании двух отдельных почтовиков - на прием и отправление остается актуальным.
И еще: "....в самом приложении"- это где? Под Фоксом? Так работа с Интернетом вааще и с почтой в частности - самое слабое его место (при всем моем глубочайшем уважении к его разработчикам).
А все-таки есть ли какой - нибудь другой способ обработки событий в OutLook, без ... WithEvents ?
Е. Шапиро
Вот еще один, который проверяет сообщения электронной почты навалом www.freeemailverifier.com
PeterSan
26-05-2013, 07:42
Một dịch vụ tương tự: http://www.GreenAppleMail.com - ở đây bạn có thể tải về một số ít các địa chỉ (tập tin duy nhất) và tải lên các kết quả sang Excel. Sự khác biệt là mức độ của họ chính xác là cách tốt hơn để kết hợp công nghệ tiên tiến với các kỹ năng con người / chuyên môn. Tôi rất khuyên Green Apple Mail để tất cả mọi người!
[hr]
Дополнение от модератора - гугл-перевод с вьетнамского
Аналогичный сервис: http://www.GreenAppleMail.com - здесь вы можете скачать несколько адресов (одним файлом) и загружать результаты Excel. Разница в том, их уровень точности лучшего способа сочетаются инновационные технологии и человеческих навыков / опыта. Я настоятельно рекомендую зеленый почты компании Apple для всех!
JayPepito
26-06-2013, 00:14
Я пытался GreenAppleMail Чтобы проверить мои адреса электронной почты. Это было фантастическое впечатление! ... Я буквально не делать ничего, кроме загрузки моем списке, и получил результаты быстро. Кроме того, мне понравилось, что они держали меня в курсе каждого шага процесса. Я полностью удовлетворен!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC