![]() |
Проверка достоверности адреса исходящего письма в скрипте MS Outlook
Привет чесной компании!
Вообще - то меня недавно жисть заставила заняться MS Outlook (у меня основная специализация - VisualFox), но понадобился модуль приема-отправки почты через Инет, из под Fox_а, и использование MS Outlook выглядит предпочтительно. Хотя лично мне он не сильно нравится и это ещё мягко сказано (отправленные письма доставляются в папку "Исходящие", а не "Отправленные"; при работе с почтой нужно, чтобы MS Outlook был открыт и.т.д.). На данный момент модуль программы приема - отправки, по крайней мере в тестовом режиме работает (используется VBA), но возникла проблема проверки достоверности адреса ИСХОДЯЩИХ писем (это вроде бы должно быть ДО выполнения метода ....Send()?). Попытки поиска подходящих методов и событий Объектной модели MS Outlook в Инете ничего не дала, хотя копал долго. В Help_е русского Outlook, стоящего у меня - нет ничего (это прерогатива VBA). Help VBA под Outlook_ом - на аглицком ну и как сформулировать строку запроса?. Нашел и скачал отдельный русифицированный Help VBA (версия. 1.0.1.0, 1,65Мб) -> ни черта по объектам, методам и событиям для скриптов для Объектной модели MS Outlook. Единственный сайт на котором можно было кое-что найти по Объектной модели на русском (с контекстным поиском) - <<http://msdn.microsoft.com/ru-ru/library/ms268893.aspx>> - уже почти неделю не работает. Короче, пока - тупик. А начальство - то жаждет результата. В общем - может ли кто - нибудь подсказать, какие методы или свойства VBA для Объектной модели надоть для проверки достоверности адреса исходящего письма использовать и в каком месте скрипта? Было бы также неплохо получить ссылку на приличный русский справочник по описанию объектов, методов и событий для скриптов под VBA Объектной модели MS Outlook (обязательно с поиском!). Буду очень благодарен. Е. Шапиро |
Цитата:
Цитата:
|
Нужен метод Объектной модели MS Outlook , если конечно такой метод вааще есть, который производил бы попытку доступа по указанному адресу исходящей почты, без вылета в состояние ошибки. В каком виде будет ответ (.T.,.F.,True.....), ясное дело не важно, лишь бы можно было программно считать ответ. В принципе можно было бы сделать "методом полученя по морде" - обработкой ошибки после ...Send(), но программа при отправке на заведомо несуществующий адрес выдает не ошибку, а отпраляет сообщение ко мне на почту, что я не прав. А свойство метода ....Send() всегда выдает <<.T.>> , ведь он чесно отправил письмо в папку "Исходящие".
По поводу "CDO.Message" - пока пытаюсь подогнать под себя готовые решения с объектом MAPI - они и выглядят попроще и примеров побольше (по крайней мере под Fox_ом) . Ежели не выгорит - буду копать и в "CDO.Message". Е. Шапиро |
Цитата:
|
Насчет Тelnet (как я понял из Инета это протокол) - не знаю. Думаю переход на него простым не получится и покопаться чтобы разобраться придется изрядно. Также, как я понял черный и белый список - это фильтры адресов в почте Outlook не прокатит однозначно, проверки достоверности адреса ИСХОДЯЩИХ писем нужна для каждого конкретного мэйла только разово - далее (как вариант) в базе Fox_а в данных на этого клиента и его мэйла проставляется (автоматом) признак, что с мэйлом все в порядке и больше мэйл на этого человека не проверяется и отправка идет без проверок. В общем абсолютный стандарт для баз данных и без возни с настройкой списков Outlook.
Кстати рассылка будет немаленькой: на 120 - 150 мэйлов за раз (это не спам, а данные о налогах работников за месяц). Заодно придется наверное установить задержки между отправками, чтобы провайдер не заблокировал, как спам (надеюсь, 15 - 20 в минуту прокатит?). Теперь о проверке достоверности адреса ИСХОДЯЩИХ писем - ежели таких объектов,методов,свойств в Outlook все-таки нет, может кто-нибудь подскажет, какие установки Outlook нужно изменить, чтобы при попытке программно отправить письмо по несуществующему адресу выходило сообщение об ошибке, а не отправлялось сообщение на мой адрес?. Или хотя-бы, как отключить эти милые сообщансы на мой мэйл. Может есть вариант использования Win API для проверки исходящего адреса (очень жевательно бэсплатных)?. Е. Шапиро |
Цитата:
|
Цитата:
telnet mailserver 25 -адрес почтового сервера, куда отправляем письмо. 25 - номер SMTP порта. Может быть также 8025. выдается приветствие. Здороваемся командой HELO или EHLO. Далее mail from:mail@mail.com - это от кого будет письмо говорит sender ok. далее самое главное- rcpt to: rcpt@mail.com - это КОМУ письмо и вот если тут он скажет recipient OK, это значит, что адресат существует. Цитата:
Цитата:
|
Цитата:
|
Согласен, поторопился. Мой почтовик сразу дает отлуп с кодом 550 (Invalid mailbox). smtp.mail.ru не отправляет, пока не авторизуешься. Т.е. этот вариант отпадает.
Нарыл англоязычные решения: 1. http://www.webdigi.co.uk/blog/2009/h...ding-an-email/ (прилагается код на PHP) 2. http://my-addr.com/free-email-verifi...rify_email.php И наконец есть онлайн сервис для проверки. Можно программно распарсить результат и на его основе решать дальше: http://verify-email.org/ Примеры ответов сервиса: Цитата:
http://tools.email-checker.com/ - здесь можно загрузить кучку адресов(ОДНИМ ФАЙЛОМ) и результат выгрузить в Excel, ну а дальше уже дело техники. Все это нашел поиском - http://www.google.ru/search?hl=ru&so...3.4.5.4.2l32l0 |
По моему я понял свою ошибку. Она как обычно в постановке вопроса, что надоть выяснить у знающих людей....
Итак : имеется задача под Fox_ом по внесению и обработке результатов работы фирмы, в которой естественно есть список сотрудников и их данных (ФИО, специальность,адрес и т.д.). Другая фирма считает ей налоги на энтих людёв и раз в месяц сбрасывает фирме на мэйл, на всех сразу. Меня попросили, используя базу сотрудников сделать модуль рассылки налогов этим сотрудникам на их личные мэйлы. Тоесть (как простейший и основной вариант) шеф раз в месяц входит в этот модуль и жмет мышом кнопку "Разослать почту " - и усе!!!. Все должно делаться из под Fox_а. Единственное, что от него можно еще потребовать - это войти в перед этим в Инет и открыть (подвесить) Outlook. Поэтому никаких онлайн -сервисов, никаких выгрузок и обработок в Exel. Все должно быть на полном автомате. Далее - только (по необходимости)"навязчивый сервис" - вывод на экран или печать списка тех у кого не заданы мейлы (стандартно и без промблем) и СПИСКА ТЕХ У КОГО ЗАДАНЫ НЕСУЩЕСТВУЮЩИЕ мэйлы и вот в этом проблема. 99% за то, что в течение года такие мэйлы будут и это означает скандальчики, поиск ошибок и виноватых. И именно поэтому жевательно отследить эти ошибки при первом прогоне каждого мэйла. Теперь программные вопросы: 1. Как я уже спрашивал и это важно - "какие установки Outlook нужно изменить, чтобы при попытке программно отправить письмо по несуществующему адресу выходило сообщение об ошибке, а не отправлялось сообщение на мой адрес?. Или хотя-бы, как отключить эти милые сообщансы на мой мэйл." 2. Объект ReportItem (см. <<http://www.askit.ru/custom/vba_office/m13/13_06_outlook_items_objects.htm>>) создается автоматом при ошибках входа и выхода писем или только входа?. И ежели он работает и на исходящей почте то дайте, пожалуйста пример его использования (я их просто не нашел). С его использованием тоже возможны проблемы, т.к. вначале проиходит отправка почты в папку "Исходящие", и только там может возникнуть ошибка при отправке. И как ее дождаться под Fox_ом - пока не знаю. 3. Использование иных языков из под Fox_а (PHP, С, Delfi) как я понимаю возможно, но все-равно нужны знания и навыки, а также переделка и интерпретация под Fox. А это дополнительные (и немалые) проблемы. Поэтому крайне желательно использование VBA c Объектной моделью Outlook - там все проще и более-менее интуитивно понятно, по крайней мере для меня. P.S. Кстати, лазя по указанным Вами сайтам нашел интересную .ехе утилитку Email Tester - проверяющую заданный адрес, с использованием командной строки, но, увы - результат проверки отсылается на проверяемый адрес. А может кто- нибудь знает чевой-то подобное с ответом по месту запуска? Все равно всем спасибо за советы. Е.Шапиро |
Цитата:
Цитата:
Вы можете использовать блокирование по спискам серверов и ключевым словам в адресе/теме/содержимом письма. Т.е., обычная фильтрация. Но суть в том, что тогда Вы не узнаете, что Ваше письмо на данный почтовый адрес не дошло. Вам бы следовало попробовать то, что предлагал сделать выше Delirium, и в #7, и в #9 — Вам многое стало бы понятней. |
Ребята, извините ну не могу да и буду я ипользовать программы на РНР, С .... - это обязательная инсталляция программ, и их совмесное использование, много копания, чтобы понять что и как, (ведь я их, не знаю), обеспечение отсутствия конфликтов с Фоксом. Ну да что я Вам рассказываю - сами представляете, что значить хоть чуть-чуть освоить новый язык. Простым дёром чужих примеров, увы не обойтись. Насчет Telnet - покопал пару часов в Инете, ну кое-что конечно понял, но в результате вопросов больше, чем ответов - то есть опять же копать - спрашивать - копать. Хотя конечно интересно, чесное слово - это насчет #7, и наверное #8 (а не #9 в предыдущем письме). Без всяких обид, правда.
Повторюсь: лично мне решение надо искать под Объектной моделью MS Outlook и VBA - он более-менее прост, и как известно инсталлируется автоматом, при установке MS Office. Да и все они (VFP, Outlook, VBA) - продукты одной фирмы, т.е. меньше конфликтов. А решение, похоже есть и довольно простое - отследить уход письма из папки "Исходящие", затем проверить во "Входящих" появление служебного письма о неверном адресе (надеюсь, конечно, что удаление из "Исходящих", идет только после получения по SMTP подтверждения о доставке письма получателю, т.е. появления письма в папке "Входящие") , а затем его (служебное письмо) чесно грохнуть, сделав в Фоксе запись о неработоспособности этого мэйла. Поэтому, если можно подскажите, как пишутся строки методов: - "удалить письмо" (по моему - ????????.Remove.????????) -> кое что накопал, но все равно не все ясно - "выделить месяц" и "выделить год" (из даты письма) это нужно для поиска письма в другом месте программы-> вааще ничо не нашел (а по логике должны быть - к примеру в Фоксе это часто используемые функции) - "найти письмо" (по моему - ????????.Find.????????) -> кое что накопал, но все равно не все ясно Т.е. опять та же самая промблема - отсуствие толкового сайта, где Объектная модель нормально расписана желательно по русски (естественно с функцией поиска). Обычное лазанье по Инету - это собирание информации по крохам и как обычно, проблемы с составлением строки поиска. Так что еще раз прошу прощения и если можно подскажите по этим методам или с ссылкой на толковый сайт. Е. Шапиро |
Jean55, ты столкнешься с одной проблемой, причем сразу - да, по RFC почтовые серверы ОБЯЗАНЫ отправлять NDR (non-delivery report), если адресата не существует, но в реальности часто это отключают. К примеру, у меня отключено, т.к. 98% спама (а это около 350 000 писем/мес) не имеет верного SMTP адреса, и рассылать тонны сообщений о недоставке - лишний трафик и нагрузка. Да, это неверно, а что делать.
Именно поэтому ты можешь и не получить ответа о том, что адресат не существует. Я не могу понять, чем тебе не понравился совет в #9. Смотри: Ты ОДИН раз формируешь список своих адресатов. Загружаешь его на сайт проверки адресов. Получаешь результат, и потом в фоксе делаешь как хочешь - или удаляешь неработающий мейл, или ставишь пометку, что он рабочий. И ВСЕ. После этого перед отправкой достаточно будет проверить флаг напротив ящика и предпринять дальнейшие действия. Все, что мы писали в #7 и #8 - есть по сути, ручная обработка того, что я написал в #9. Не бейся в стену с одним решением, рассмотри и другие варианты. |
Jean55, я не понял при чём тут PHP или С. Я предлагал Вам попробовать отправить несколько писем посредством telnet, «ручками» набирая команды протокола SMTP, дабы Вы получили некоторое представление о том, из чего состоит и как именно работает протокол SMTP, не более.
Реализуйте рассылку через CDO непосредственно из-под Visual FoxPro — головной боли втрое меньше будет, изучать лишнего ничего не потребуется, кроме объектной модели самого CDO, где многие интерфейсы похожи на аналогичные из Microsoft Outlook. Можно даже непосредственно работать с протоколами через сокеты. Впрочем, решать Вам. Цитата:
Microsoft Outlook 2003: Outlook Object Model; Microsoft Outlook 2007: Outlook Object Model Reference Я сомневаюсь, чтобы кто-нибудь переводил полностью всю документацию: объектная модель Microsoft Outlook. |
PHP или Си - потому что команды под telnet написаны на PHP, а Си - просто так за компанию, я просто видел и примеры написания скриптов для OUTLOOK и на Си. А нужна ли инсталляция PHP для telnet - это тот вопрос, который я не стал задавать, да похоже и не надо уже и так ясно.
Цитата:
Фокс - это чистый файл-сервер и модуль отправки будет только на одном компе (у начхальника - остальные обойдутся), т.е. входящий мэйл всегда только один и на него же приходит аттачем почты общее письмо, которое надо поделить и отправить дальше. Теперь кусок из -под Фокса: ****************************************************************** **** MailItem — представляет собой сообщение электронной почты. **** LOCAL loMailItem As OUTLOOK.MailItem objMail = loOutlook.CreateItem(olMailItem) && новое письмо из под Outlook objMail.To = "bla_bla_bla@mail.ru" && адрес куды -> заранее неверный * и * т. * д. objMail.Send && посылаю письмо подальше ****************************************************************** Письмо попадает в "Исходящие", а затем OUTLOOK сам пытается спихнуть его дальше, без моего участия. Потом, если письмо прошло, то запись в Исходящих" ликвидируется, а в "Отправленных" появляется - все это и так, понятно. А вот ежели адреса мэйла не существует, то запись в Исходящих" также ликвидируется, а появляется служебное письмо в МОЕЙ почте "Входящие", что нэт такой партии. Текст письма формирует OUTLOOK и мой адрес наверняка берется из него же, родимого (при формировании данных исходящего письма мэйл моей почты не используется). Я тут экспериментировал со всяческими настойками OUTLOOK, при неверном адресе мэйла получателя, пытаясь отправить почту не в Исходящие", а в "Отправленные" - это позволило бы получить сообщанс об ошибке прямо в Фокс, обработать который было бы делом техники, но увы, похоже дело дохлое. А вот служебных писем об неверном адресе мэйла получателя на мою почту "Входящие получил по полной программе, что задрался удалять. Кстати, вопрос: через сколько времени, после удаления письма из Исходящих" может появиться служебное сообщение в моей почте "Входящие"?. По логике, вроде бы удаление из Исходящих" дожно происходить именно после окончания загрузки служебного сообщения в мою почту "Входящие"?. А если нет, то 10-20 сек достатосно? Цитата:
За ссылки - спасибо русская MSDN у меня была, но посление две недели не работала, выдавала ошибку (не ты ли ее включил? - шютка). А вот аглицких - не было. И не такой уж большой промблем с их чтением (к примеру, я же не идиот работать с переведенным Фоксом), хотя разобраться в деталях, при чтении документации бывает сложновато, просто по русски это получается быстрее. Е.Шапиро |
Цитата:
Цитата:
Цитата:
И ты пытаешься сделать операцию на клиенте, хотя это в корне неверно. Проверка существования адреса, отчеты о недоставке и прочее - это все таки больше серверные вопросы, и перекладывать их на клиента = создавать костыль. Вообще, конечно, основная проблема в том, что для работы используется устаревший язык программирования. Да, фокс гибок и удобен, прост в использовании(сам много лет писал на нем), но для современных технологий надо что то более приближенное к реальности. |
Да нет, дело тут не в языке. Просто коллега Jean55 пока плохо представляет себе всю эту механику изнутри, потому больше шаманством занимается.
Я бы вовсе отказался от Outlook и работал бы прямо через CDO. Сама библиотека «Collaboration Data Objects 1.2.1» бесплатна, доступна и легко распространяется посредством групповой политики. Проверку существования почтового адреса можно прикрутить либо непосредственно на этапе вводе адреса (если есть оттуда доступ к сети), либо перед рассылкой. В первом случае для этого будет вполне достаточно заполнить по указанному выше адресу http://verify-email.org/ и отослать форму в том же IE, а затем распарсить полученный результат (или просто проверить наличие «Result: Ok»/«Result: Bad»). Для второго — аналогично по второму вышеприведённому адресу — http://tools.email-checker.com/. 2Delirium: я тут ещё раз посмотрел на http://verify-email.org/ — для любого адреса на ***@mail.ru даёт результат, согласно ответа сервера — «Result: Ok». Выходит, что некоторые и так борются?! |
Цитата:
Угу, есть и такое дело :) Да, на указанных адресах есть утилита Email Verifier - http://www.email-unlimited.com/email_verifier.html Там есть очень интересная опция: Цитата:
И еще там есть Email Verifying Script - тоже очень полезная в твоем случае вещь. |
Да понял я люди понял, точнее начинаю понимать - недаром же почти месяц стенку лбом прошибаю.
Сначала, чтобы закрыть тему проверки через "Исходящие" и "Отправленные" - в свойствах письма есть и "From:" и "To:", так что примут его за спам - не знаю. На моем домашнем компе - проходит без промблем. Кстати чем у Вас отсекается спам?. Было бы интересно поэкспериментировать со служебным сообщением. Насчет почтового сервера: у меня, так он то как раз пропускает, а вок какой установлен у клиента - пока просто не знаю, не хоцца показываться без хоть какого - либо результата. Кстати , это тоже важно (почтовый сервер), но отложу на потом. А все остальные возражения и разъяснения вполне логичны и похоже понятны. Цитата:
Насчет Фокса: для файл-серверных систем малых предприятий еще очень даже... (имел возможность сравнить с наработками на других языках, кстати довольно свежими), мне уже не 30 да и коней на переправе не меняют. В общем, подожду, что там получится с Sedna, а там видно будет. В любом случае - помощь хорошая (да! - кстати не пойму как отправить благодарности на форуме, а надо бы). Да и с CDO думаю теперь можно попробовать (есть примеры с ним для Фокса, но тогда я там мало что понял). Спасибо, думаю еще обращусь с вопросами. Е.Шапиро |
И ишшо вопрос - думаю попроще. При использовании метода Find:
loOutlook = CREATEOBJECT("outlook.application") loMapi = loOutLook.GetNameSpace("MAPI") loFldr = loMapi.GetDefaultFolder(6) olFind = loFldr.Items.Find('[Subject] = "Налоги_июнь_2011"') -> заголовок входящего письма не находит, т.е. olFind = .NULL. (письмо где-то месячной давности) а вот поиск того же самого olFind с другой текстовой строкой olFind = loFldr.Items.Find('[Subject] = "Delivery Status Notification (Failure)"') где строка - это заголовок служебного сообщения об ошибке (письмо самое свежее в списке) -> находит!!!. Результат - объект. Наименования драл копированием из свойств письма в Outlook - так что без ошибок в строке. Совершено не понятно, в чем причина?. И как с объекта выцыганить нумер письма? А вот Email Verifier и проч. можно и нужно использовать в другом месте - на стадии записи мэйла в данные сотрудника, где запрос с использованием внешних программ вполне уместен (кстати, я эту программу находил, когда искал утилиту с проверкой мэйла из командной строки - одну нашел, но так и не понял, куды она ответ отсылает). Е.Шапиро |
У меня — находит (VBScript):
Код:
Option Explicit Цитата:
|
Цитата:
. Цитата:
Цитата:
Кус моего модуля под Фоксом :l oCnt = loFldr.Items.Count && всего писем в "Входящих" IF loCnt>0 FOR i=1 TO loCnt WAIT loFldr.Items(i).Subject WINDOW NOWAIT и т.д. ...... ************************************************************* так меня интересовало вычисление нумера " i " а не EntryID, ведь похоже,что " i " - это тоже свойсто только наверное папки, а не письма и без перебора писем в папке до него не добраться. И все таки Цитата:
Е. Шапиро |
Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Цитата:
Цитата:
А AdvancedSearch и LastName - гляну завтреча, сегодня уже лом. Кстати по моему в строке sFilter = "[LastName] > 'LZZZ' And [LastName] < 'N'" - по моему ошибка, не 'N' а 'M', ежели по Additional Notes. А если нет - то почему? С уважением Е.Шапиро |
Цитата:
Jean55, а попробуйте пока просто проверить — сохранить мой код в файле с расширением «.vbs» в кодировке ANSI (windows-1251), и запустить его из командной строки на исполнение: Код:
cscript.exe //nologo "<путь к скрипту>\<имя скрипта>.vbs" Цитата:
Цитата:
Цитата:
Код:
'M' > 'LZZZ' и 'M' < 'N' Код:
'M' > 'LZZZ' и 'M' < 'M' |
Общее и полное здрасьте всем. После отпусков и прочих дел (включая, естественно и самостоятельную работу и самостоятельные разборки с возникающими вопросами) можно сделать некоторые промежуточные выводы.
Модуль (пока что - тестовый, делающий усё от начала до конца единым файлом) работает!!! Т.е. реально выполняется (и с вашей помощью): - скачать общий .pdf файл налогов - поделить на отдельные .pdf страницы - из каждой страницы выделить фамилю и имя и из базы Фокса считать мэйл этого человека (кстати, та ещё задачка! ) - производится отправка этих отдельных .pdf страниц на почту этих людей Сейчас производится доводка (в основном вопросы сервиса) - программная проверка загрузки и загрузка, при необходимости Outlook (ну не верю я что пользователли работают всегда по инструкции и без проколов!!!) - программная загрузна новых входящих писем Outlook - создание (по требованию) списков работников, которые есть в общем .pdf файле и нет в базе Фокса и, естественно наобормот. Наверняка будут ишшо и другие. Но это в основном Фоксовские прибамбасы, а поэтому надеюсь без серьёзных промблем (тьфу-тьфу шобб не сглазить). Затем надо будет расташшить эту программу по объектам модуля обработки почты, что тоже только вопрос техники и времени. А у меня сейчас вопрос, чесно говоря не принципиальный (можно обойтись просто сообщением на экран "Загрузите Outlook... ") , но усе равно интересно: как программно обновить почту Outlook средствами Объектной модели Outlook? Как я понял это либо событие NewMail, либо метод AddNew ( AddNew, похоже просто имеет больше параметров, что мне просто не надо, мне надо просто обновить папку Входящие), а вот как это делать - не понял ни черта, хотя примеров дофига и более. Два дня (с перерывами) копал. Например в MSDN: "......NewMail используется для выполнения пользовательских действий при получении пользователем сообщения электронной почты." О каком пользователе и сообщении электронной почты идет речь? Ведь по логике Outlook, при нормальном пуске все запрашивает самолежательно. Мне же нужно принудительное обновление, поскольку, похоже обновление входящей почты при запуске Outlook из под Фокса не происходит... Ну и т.д. Т.е. как реально желателен кус кода VBA на принудительное обновление входящей почты и если можно с разъяснениями. Буду очень благодарен Е. Шапиро |
Цитата:
SyncObject Object --> Start Method. Не забудьте убедиться, что в свойствах соответствующей группы отправки/получения почты в параметрах соответствующей учётной записи установлены флажки «[*] Отправка почты», «[*] Получение почты». |
Спасибо, 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 " - только и остаётся драть не разбираясь да и нет времени). Т.е. реально ли он шустрее обычного тупого перебора и (хотя бы ориентировочно) при каком количестве записей почты? Может просто предусмотреть зачистку данных хотя-бы раз в год и "не морочить себе две пачки маргарина"? Буду очень благодарен за ответ. Е. Шапиро |
Цитата:
Цитата:
Цитата:
Код:
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
|
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!
Дополнение от модератора - гугл-перевод с вьетнамского Цитата:
|
Я пытался GreenAppleMail Чтобы проверить мои адреса электронной почты. Это было фантастическое впечатление! ... Я буквально не делать ничего, кроме загрузки моем списке, и получил результаты быстро. Кроме того, мне понравилось, что они держали меня в курсе каждого шага процесса. Я полностью удовлетворен!
|
Время: 10:32. |
Время: 10:32.
© OSzone.net 2001-