А.Ю. Гончаров Access 2003 (960524), страница 45
Текст из файла (страница 45)
Программа MS Outlook должна быть настроена заранее дляосуществления физической отправки писем. В зависимости от настроек письмамогут отправляться немедленно по мере формирования, если активно подключение к Интернет)'. В другом случае письма накапливаются в папке «Исходящие»Outlook, а затем отправляются во время сеансового доступа к Интернету. Дляначала новой рассылки или продолжения текущей рассылки нажмите кнопку«Отправить письма» на вкладке «Письмо». Галочка «МОЖНО РАБОТАТЬ»должна быть установлена.
Для остановки рассылки снимите указанную галочку.260Глава 11Примечание. Во время формирования писем Outlook выводит на экран предупреждающие сообщения о том, что сторонняя программа пытается отправитьписьмо (это сделано с целью защиты от компьютерных вирусов). Вы должныдать разрешение на отправку писем.Выбор параметров рассылки.
На вкладке «Дополнительно» можно установитьдополнительные параметры: количество адресов, указанных в одном письме(минимальное значение 1), и временной интервал в секундах между отправкойписем.11.5. Создание дополнительных элементовуправленияНа вкладке Дополнительно сосредоточены элементы управления, которые неуместились на первой вкладке. Кроме того, лишняя вкладка позволяет сделать основную более простой, чтобы пользователь не запутался в обилии полей и кнопок.Логика работы программы требует использования еще двух параметров.Во-первых, надо указывать, сколько адресов можно размещать в одном письме.Во-вторых, письма могут отправляться с определенным временным интервалом.Многие почтовые серверы (в целях борьбы со спамом) настроены так, что прибольшом количестве исходящих писем в единицу времени приостанавливаютобслуживание клиента.На нашу вкладку поместим два поля.
Первое будет называться Kopii (значение по умолчанию 5), а второе — Interval (значение по умолчанию 30). Оба полябудут использоваться программой для считывания параметров.Для работы с таблицей адресов полезно сделать отдельную форму. Ее можносформировать при помощи мастера, выбрав все поля и параметры по умолчанию,или сделать автоформу. Назовем ее Адреса. Пример формы показан на рис. П.8.Главное здесь - выделить достаточно места для полей типа Memo.Теперь нам потребуется кнопка с надписью «Просмотр и правка адресов». Онадолжна открывать форму, и эту кнопку удобнее всего сделать при помощи мастера. В мастере кнопок на первом шаге выбрать категорию «Работа с формой»и кнопку «Открыть форму» (рис. 11.9).
На вторЬм шаге выберем форму Адреса.Третий шаг мастера пройдем без изменения параметров. На следующем шагенадо выбрать опцию «Текст-» и задать надпись на кнопке. Теперь можно нажатькнопку Готово, так как последний шаг мастера не имеет смысла.Пример базы данных рассылки почты261ФИО ]Виннн Иванович ПухРмупыаг 'ОргаюваадяJOOO "Винни Пу?По.цшделемнсРуководитель отдела!Рис. 11.8. Форма для работы с адресами электронной почтыВыберите действие, которое будет выполняться принажатии кнопки.Каждая категория содержит собственный набор действии,Действия;Закрыть форпуИзменить фильтр фориыОбновить данные формыОткрыть страницуПечать текущей формыПечать формыПрименить фильтр формыРис. 11.9.
Мастер стандартных кнопокПоследняя кнопка имеет надпись «Подготовить список адресов к новой рассылке». Когда программа отправляет письма, то для каждого обработанного адреса значение поля flag устанавливается как 1. Это позволяет прервать рассылкув любой момент, а потом продолжить с нужной записи. Но перед началом новойрассылки поле flag надо обнулить. Это делает связанная с кнопкой процедура:Private Sub Кнопка58_С11сК()' Сброс поля flagDim dbs As Database 'База данныхDim rst As Recordset 'Источник email-адресовDim i As Integer 'Счетчик262Глава 11Dim r As Integer 'Счетчик обработанных записейIf {МздВохС'Вы действительно хотите начать новую рассылку?_Данные о предыдущей рассылке будут уничтожены.", 4)) = vbYes ThenSet dbs = CurrentDb 'Выбор базы данных'Открываем таблицу с почтовыми адресамиSet rst = dbs.OpenRecordset("SELECT * FROM [ТаблицаАдреса];")If rst.RecordCount о 0 Then 'Проверяем записиrst.HoveLast 'Последняя записьrst.MoveFirst 'Первая записьг = ОFor i = 1 То rst.RecordCount 'Просматриваем адресаrst.Editrst!flag = 0 'Изменяем значениеrst.Updateг = г + 1rst.MoveNext 'Следующий адресNextMsgBox "Обработано записей: " & гEnd IfElseEndEnd IfEnd SubВ этой процедуре с помощью функции MsgBoxC) создается окно с контрольнымвопросом к пользователю.
Если последний отвечает «Да», то поле обнуляется.Вкладка с дополнительными параметрами показана на рис. 11.10. На ней естьсвободное место, что неплохо на тот случай, когда базу данных потребуется усовершенствовать.11.6. Программа для отправки писемМы уже создали кнопку с надписью «Отправить письма», а теперь создадимпрограмму, которая будет заниматься отправкой. В режиме конструктора формнадо открыть окно свойств кнопки и выбрать параметр Нажатие кнопки(щелчок мышью). С помощью кнопки с тремя точками надо выбрать опцию«Программа». Тогда будет создана заготовка процедуры, которая будет выполняться при нажатии кнопки:Пример базы данных рассылки почтыi Jil Рассылка : форма263U :ППисьма_„Адреса Инструкция - ДополнительноКоличество копий: 5Интеовал, сек:30[ Просиотр и правка адресовПодготовить список адресов к новой отправкеРис.
11.10. Вкладка дополнительных параметровPrivate Sub Otpravit_Click()End SubПри разработке формы эта кнопка получила имя Otpravit. Теперь можно дополнить процедуру стандартными операторами обработки ошибок. В случае возникновения ошибки будет выведено сообщение на экран. Теперь код программыстанет таким:Private Sub Otpravit_CHck()On Error GoTo Err_Otpravit_Click' место для кодаExit_Otpravit_Click:Exit SubErr_Otpravit_Click:MsgBox Err.DescriptionResume Exit_Otpravit_CHckEnd SubГлава 11гСмысл этой конструкции таков. При возникновении ошибки управлениедолжно передаваться на метку Err_Qtpravit_Click, а затем выполнение процедуры прекращается после перехода на метку Exit_Otpravit_Click.
В этомслучае обработку ошибки выполняет сам Access. Этот код универсален, и егоможно использовать в качестве шаблона при создании самых разных программ.Имена меток, разумеется, можно придумать свои, данные имена сгенерированыавтоматически, и поэтому они такие длинные и неудобочитаемые.
На время отладки программ бывает полезно отключать команду On E r r o r для того, чтобы привозникновении ошибки можно было сразу перейти в редактор Visual Basic и отладить код. Приведенный выше листинг можно использовать как заготовку для создания любых процедур обработки событий.Отправкой писем в нашем случае будет заниматься программа MS Outlook 2003.Для того чтобы работать с объектами Outlook, в редакторе Visual Basic надо подключить дополнительную библиотеку. С помощью команды Tools ^> Referencesнадо выбрать компонент «Microsoft Outiook 11.0 Object Library». На рис. 11.11 видно, какие библиотеки необходимы для работы этой базы данных.leferences - pochtaAvailable Refe'ences:<S Visual Basic For Actuation!V Wcrosof t Access 11.0 Object librae»У.
OLE Automation^.Microsoft DrtQ3.6 Object LibraryV Microsoft ActiveX 3ata Ob]ects 2.5 Lbraryv- Windows Media Player< Mfcrosoft Office Web Components 11.0/Mfcrosof t Office № We= Coupon ;ri:sасигта.пiMoosoft ActiveX Data Objects 2,1 Library1Д5 Helper COM Component L.OTypeLfaТД^ OUTlll К P.nfnrnl I П TvriB I ihrsrvMicrosoft Outlook 11.0 Obiect Library Location0;\Ргсдгагрр|1е!|0Language. StandardРис. 1 1 . 1 1 . Список необходимых объектных библиотекПолный текст процедуры выглядит так:Private Sub Otpravit_Click()On Error GoTo Err_Otpravit_Click1Отправка писемDim prog As Outlook.Application ' Объект - программа OutlookDim baza As Database ' Объект - база данныхПример базы данных рассылки почтыDim tablica As Recordset ' Таблица ТаблицаПисьмаDim i As Integer ' Счетчик циклаDim portion As Integer ' Счетчик порцийDim zapis As Integer ' Номер записиDim pismo As Mailltem ' Объект - почтовое сообщениеDim dopfail As String ' Присоединяемый файлDim Copies As Integer ' Число копий письмаDim pauza As Integer ' Величина интервала ожиданияDim PauseTime, Start ' Переменные для таймераDim Konec As Boolean ' Конец таблицыDim myNamespace As Outlook.NameSpace' Создание объектов для письмаSet prog = Mew Outlook.ApplicationSet myNamespace = prog.GetNamespaceC'MAPI")' Начальные значения переменныхdopfile = " "If Len(Trim(Me!Text9» > 0 Then dopfail = Me!Text9dopfile = Trim(dopfile)pauza = Me!IntervalKonec = FalseIf pauza < 0 Then pauza = 1Copies = MelKopiiIf Copies < 0 Then Copies = 11Подключение таблицыSet baza = CurrentDb ' Работаем с этой же БДSet tablica = baza.OpenRecordset("SElECT * FROM [ТаблицаАдреса] WHERE([Да]=Тгие);")' Основной циклDo While Me!Check34 And Not KonecMe.Refresh ' Пересчет данных формыIf tablica.RecordCount <> 0 Then ' Таблица не должна быть пустойtablica.MoveLast ' Последняя записьtablica.MoveFirst ' Первая записьzapis = 1'Ищем новые записиDo While tablica! flag = 1 And zapis < tablica.RecordCounttablica.MoveNext ' Выбор следующей записиzapis = zapis + 1Loop265266Глава 11If tablica.RecordCount - zapis >= Copies Then1Определение количества адресовportion = CopiesElseportion = tablica.RecordCount - zapis + 1End If' Формирование письма в формате OutlookSet pismo = prog.Createltem(olMailltem) ' Создание объектаpismo.Subject = MelTema ' Тема сообщенияpismo.Body = MelTekst ' Текст сообщенияIf dopfail <> "" Then pismo.Attachments.Add dopfail ' Дополнительный файлFor i = 1 To portion ' Перебор очередной порции адресовIf tablica!Да And Not Konec ThenIf tablicalflag <> 1 Thenpismo.Recipients.Add tablica!Email ' Еще один адресtablica.Edittablicalflag = 1 ' Адрес использованtablica.UpdateEnd IfEnd IfIf zapis < tablica.RecordCount Thentablica.MoveNext ' Выбор следующего адресаzapis = zapis + 1ElseKonec = TrueEnd IfNextMelObrab = zapis ' Индикация номера записи в форме1pismo.Display ' Показ письма в окне.