Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » Разное - Проверка достоверности адреса исходящего письма в скрипте MS Outlook

Ответить
Настройки темы
Разное - Проверка достоверности адреса исходящего письма в скрипте MS Outlook

Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Привет чесной компании!
Вообще - то меня недавно жисть заставила заняться 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 (обязательно с поиском!). Буду очень благодарен.
Е. Шапиро

Отправлено: 23:22, 16-09-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


У меня — находит (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
---------------
Работаете по полному соответствию искомой строки полю «Тема»?

Отправлено: 04:52, 24-09-2011 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
Работаете по полному соответствию искомой строки полю «Тема»? »
Не-а, полное соответствие - это "==" ?. А может есть функция (метод) обрезки начальных и концевых пробелов, как ALLTRIM() в Фоксе?. Это удобнее, если использовать в фильтре поиска не символьную строку, а переменную.

.
Цитата Iska:
У меня — находит (VBScript):
Код: »
С VBScript не работал (просто быстренько слазил прямо из форума в Инет росмотреть- что это такое), но из примера вполне понятно, что нужен обычный тупой перебор почты на соответствие. Кстати тогда понятно, почему 1-ю строку находит сразу - она ведь первая в списке "Входящих". Так это у меня и без Find работало. Ну что-же по крайней мере с этим ясно, за что - спасибо

Цитата Iska:
Цитата:
Код: »
*************************************************************
Кус моего модуля под Фоксом :l
oCnt = loFldr.Items.Count && всего писем в "Входящих"
IF loCnt>0
FOR i=1 TO loCnt
WAIT loFldr.Items(i).Subject WINDOW NOWAIT
и т.д. ......
*************************************************************
так меня интересовало вычисление нумера " i " а не EntryID, ведь похоже,что " i " - это тоже свойсто только наверное папки, а не письма и без перебора писем в папке до него не добраться.

И все таки
Цитата Jean55:
В любом случае - помощь хорошая (да! - кстати не пойму как отправить благодарности на форуме, а надо бы). »
- хоть и мелочь но сделать это я должен, по правилам хорошего тона.
Е. Шапиро

Отправлено: 15:10, 24-09-2011 | #22


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Jean55:
Не-а, полное соответствие - это "==" ?. »
Нет, я про это:
Цитата:
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()».

Цитата Jean55:
Кус моего модуля под Фоксом :l
oCnt = loFldr.Items.Count && всего писем в "Входящих"
IF loCnt>0
FOR i=1 TO loCnt
WAIT loFldr.Items(i).Subject WINDOW NOWAIT
и т.д. ......
*************************************************************
так меня интересовало вычисление нумера " i " а не EntryID, ведь похоже,что " i " - это тоже свойсто только наверное папки, а не письма и без перебора писем в папке до него не добраться. »
«EntryID» был приведён мною просто для примера. Что Вам нужно, пока не понял.

Отправлено: 15:28, 24-09-2011 | #23


Аватара для Delirium

Ветеран


Сообщения: 5624
Благодарности: 936

Профиль | Отправить PM | Цитировать


Цитата Jean55:
Насчет Фокса: для файл-серверных систем малых предприятий еще очень даже... (имел возможность сравнить с наработками на других языках, кстати довольно свежими), мне уже не 30 да и коней на переправе не меняют. »
Соглашусь У меня на работе тоже половина всего софта на фоксе и 2 программера, которые постоянно доделывают и пишут новое. Сам я писал на C++, Visual FoxPro, теперь уже почти 5 лет пишу на C#.

Цитата Jean55:
кстати не пойму как отправить благодарности на форуме, а надо бы). »
Под каждым сообщением, есть кнопка с поднятым пальцем "полезное сообщение"

-------

Пройденные курсы:
[Microsoft №10174 Sharepoint], [SharePoint]
Мои проекты:[CheckAdmins], [NetSend7], [System Uptime], [Remote RAdmin LogViewer],[Netdom GDI], [Holidays - напоминалка о днях рождения]

А я офис-гуру :)


Отправлено: 15:50, 24-09-2011 | #24


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Iska:
То есть: поле Тема действительно полностью состоит из текста «Налоги_июнь_2011», ни больше, ни меньше? Если нет, то пробуйте пользовать указанный метод «AdvancedSearch()». »
Поле Тема действительно полностью состоит из текста «Налоги_июнь_2011»- один в один, я его для пробы посто передирал копированием из свойств письма в Outlook, хотя в реальности это будет переменная, формируемая мною автоматисски, в зависимости от месяца и года.

Цитата Iska:
«EntryID» был приведён мною просто для примера. Что Вам нужно, пока не понял. »
Цитата Jean55:
*************************************************************
Кус моего модуля под Фоксом :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. А если нет - то почему?
С уважением Е.Шапиро

Отправлено: 23:10, 24-09-2011 | #25


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Jean55:
Поле Тема действительно полностью состоит из текста «Налоги_июнь_2011»- один в один, я его для пробы посто передирал копированием из свойств письма в Outlook, хотя в реальности это будет переменная, формируемая мною автоматисски, в зависимости от месяца и года. »
Хмм… Тогда даже не знаю. Код Ваш визуально аналогичен моему в части поиска.

Jean55, а попробуйте пока просто проверить — сохранить мой код в файле с расширением «.vbs» в кодировке ANSI (windows-1251), и запустить его из командной строки на исполнение:
Код: Выделить весь код
cscript.exe //nologo "<путь к скрипту>\<имя скрипта>.vbs"
Найдёт ли он у Вас совпадения? Все ли совпадения переберёт? И отпишитесь сюда.
Цитата Jean55:
При изменении << i >> в цикле от 1 до oCnt…»
Спасибо, теперь ясно. Вот здесь у Вас не вполне верное рассуждение:
Цитата Jean55:
Т.е. << i >> определяет вполне конкретное письмо »
i — порядковый номер, определяющий конкретный объект «Item» в текущий момент. Добавится/удалится какой-либо «Item» (здесь это обычно «MailItem») — и всё, номера сдвинутся. А вот уникальное свойство «EntryID» по-прежнему будет однозначно определять данный «Item» среди прочих «Item'ов».
Цитата Jean55:
Кстати по моему в строке 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'

Отправлено: 01:06, 25-09-2011 | #26


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Общее и полное здрасьте всем. После отпусков и прочих дел (включая, естественно и самостоятельную работу и самостоятельные разборки с возникающими вопросами) можно сделать некоторые промежуточные выводы.
Модуль (пока что - тестовый, делающий усё от начала до конца единым файлом) работает!!!
Т.е. реально выполняется (и с вашей помощью):
- скачать общий .pdf файл налогов
- поделить на отдельные .pdf страницы
- из каждой страницы выделить фамилю и имя и из базы Фокса считать мэйл этого человека
(кстати, та ещё задачка! )
- производится отправка этих отдельных .pdf страниц на почту этих людей
Сейчас производится доводка (в основном вопросы сервиса)
- программная проверка загрузки и загрузка, при необходимости Outlook (ну не верю я что пользователли
работают всегда по инструкции и без проколов!!!)
- программная загрузна новых входящих писем Outlook
- создание (по требованию) списков работников, которые есть в общем .pdf файле и нет в базе Фокса и,
естественно наобормот.
Наверняка будут ишшо и другие. Но это в основном Фоксовские прибамбасы, а поэтому надеюсь без серьёзных промблем (тьфу-тьфу шобб не сглазить).

Затем надо будет расташшить эту программу по объектам модуля обработки почты, что тоже только вопрос техники и времени.

А у меня сейчас вопрос, чесно говоря не принципиальный (можно обойтись просто сообщением на экран
"Загрузите Outlook... ") , но усе равно интересно:
как программно обновить почту Outlook средствами Объектной модели Outlook? Как я понял это либо событие
NewMail, либо метод AddNew ( AddNew, похоже просто имеет больше параметров, что мне просто не надо,
мне надо просто обновить папку Входящие), а вот как это делать - не понял ни черта, хотя примеров дофига
и более. Два дня (с перерывами) копал.
Например в MSDN: "......NewMail используется для выполнения пользовательских действий при получении
пользователем сообщения электронной почты."
О каком пользователе и сообщении электронной почты идет речь? Ведь по логике Outlook, при нормальном
пуске все запрашивает самолежательно. Мне же нужно принудительное обновление, поскольку, похоже
обновление входящей почты при запуске Outlook из под Фокса не происходит... Ну и т.д.
Т.е. как реально желателен кус кода VBA на принудительное обновление входящей почты и если можно с разъяснениями. Буду очень благодарен
Е. Шапиро

Отправлено: 23:55, 11-11-2011 | #27


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Jean55:
как программно обновить почту Outlook средствами Объектной модели Outlook? »
Объект Outlook.Namespace, его свойства и методы - AskIt.RU
SyncObject Object --> Start Method.

Не забудьте убедиться, что в свойствах соответствующей группы отправки/получения почты в параметрах соответствующей учётной записи установлены флажки «[*] Отправка почты», «[*] Получение почты».
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:50, 12-11-2011 | #28


Новый участник


Сообщения: 15
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо, 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 " - только и остаётся драть не разбираясь да и нет времени). Т.е. реально ли он шустрее обычного тупого перебора и (хотя бы ориентировочно) при каком количестве записей почты? Может просто предусмотреть зачистку данных хотя-бы раз в год и "не морочить себе две пачки маргарина"?
Буду очень благодарен за ответ.
Е. Шапиро

Отправлено: 00:27, 18-11-2011 | #29


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Jean55:
И сразу же вопрос: количество чего? »
Цитата:
SyncObjects Interface

Contains a set of SyncObject objects representing the Send/Receive groups for a user.
Таким образом, сколько бы Вы раз не «прогоняли задачу» — количество групп отправки и получения от этого не изменится. «Все учетные записи» — одна из таких групп (возможно — единственная).

Цитата Jean55:
а событие ItemAdd нигде в примере не прописано. »
Вот обработчик события:
Код: Выделить весь код
Private Sub oItems_ItemAdd(ByVal Item As Object)
Само событие генерируется самим приложением. Вы получите столько вызовов этой процедуры, сколько будет добавлено объектов.

Цитата Jean55:
И ишшо стоит ли как-то ускорять поиск… »
Не могу дать Вам какого-либо определённого ответа, поскольку:

1) я не пользуюсь Microsoft Outlook, и никогда с ним не работал;
2) вытекающее из первого — если бы я даже захотел попробовать — у меня не найдётся подходящего объёма данных базы писем.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:24, 18-11-2011 | #30



Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » Разное - Проверка достоверности адреса исходящего письма в скрипте MS Outlook

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Проверка отправки письма с файлом абоненту dark-------13 Скриптовые языки администрирования Windows 1 05-05-2011 18:02
Интернет - Outlook Express не открывает письма Palomnik Microsoft Windows 2000/XP 1 14-11-2010 16:05
Проверка внешнего IP адреса Vanilla Dragon AutoIt 2 18-03-2009 18:55
Не отправляются письма из Outlook Express miikki Хочу все знать 3 22-12-2006 14:16
Outlook Express обрезает письма! grifius Хочу все знать 1 17-02-2005 07:13




 
Переход