|
Посылка письма со списком ближайших дней рожденияКак и многие другие, я использую Microsoft Outlook для ведения базы данных о людях, с которыми я общаюсь. "Карточки" с записями находятся в папке Contacts (Контакты) и ее подпапках.В числе прочего, в этих карточках хранятся дни рождения. Чтобы не забывать о них и заранее к ним готовиться, я написал скрипт, который просматривает папку Contacts и ее подпапки, составляет список ближайших дней рождений, и посылает мне письмо с этой информацией. Этот скрипт вызывается каждое утро планировщиком задач Windows. Комментарии к коду:
Листинг: birthdays.vbsOption Explicit ' открываем сессию MAPI с помощью профайла по умолчанию Dim Session Set Session = CreateObject("MAPI.Session") Session.Logon GetDefaultMapiProfile ' в этой строке будет собираться информация о днях рождения Dim Body ' будет использоваться для приведения дня рождения к текущему году Dim CurrentYear CurrentYear = Year(Now) ' получаем корневую папку Contacts Dim Root Set Root = Session.GetDefaultFolder(5) ' 5 = CdoDefaultFolderContacts ' начинаем рекурсивную обработку папок ProcessFolder Root ' отсылаем самому себе письмо со списком ближайших дней рождения Dim Message Set Message = Session.Outbox.Messages.Add("Ближайшие дни рождения", Body) ' в качестве получателя указываем идентификатор текущего пользователя Message.Recipients.Add ,, 1, Session.CurrentUser.ID Message.Update Message.Send False, False ' закрываем сессию MAPI Session.Logoff Set Session = Nothing '--------------------------------------------------------------------- ' эта функция используется для рекурсивной обработки папок Sub ProcessFolder(Folder) ' просматриваем все карточки Dim Message For Each Message In Folder.Messages ' ищем день рождения Dim Value On Error Resume Next Err.Clear Value = Message.Fields(&H3A420040) ' 0x3A420040 = PR_BIRTHDAY If Err.Number <> 0 Then Value = "" On Error GoTo 0 If Len(Value) > 0 Then Dim Birthday Birthday = CDate(Value) ' приводим день рождения к текущему году Birthday = _ DateSerial(CurrentYear, Month(Birthday), Day(Birthday)) ' вычисляем разницу в днях между днем рождения и текущей датой Dim Diff Diff = DateDiff("y", Now, Birthday) If (Diff >= 0) And (Diff <= 7) Then ' если она меньше 7 - добавляем информацию о нем в письмо Body = Body & Birthday & vbTab & Message.Subject & vbNewLine End If End If Next ' рекурсивно просматриваем все подпапки Dim SubFolder For Each SubFolder In Folder.Folders ProcessFolder SubFolder Next End Sub '--------------------------------------------------------------------- ' эта функция возвращает имя MAPI-профайла по умолчанию Function GetDefaultMapiProfile() Dim Shell Set Shell = WScript.CreateObject("WScript.Shell") Dim RegKey9x, RegKeyNT RegKey9x = _ "HKCU\Software\Microsoft\Windows Messaging Subsystem\" & _ "Profiles\DefaultProfile" RegKeyNT = _ "HKCU\Software\Microsoft\Windows NT\CurrentVersion\" & _ "Windows Messaging Subsystem\Profiles\DefaultProfile" On Error Resume Next Err.Clear GetDefaultMapiProfile = Shell.RegRead(RegKey9x) If Err.Number <> 0 Then Err.Clear GetDefaultMapiProfile = Shell.RegRead(RegKeyNT) If Err.Number <> 0 Then GetDefaultMapiProfile = "" End If Set Shell = Nothing End Function '--------------------------------------------------------------------- Смотри также
|