| 
  Посылка письма со списком ближайших дней рожденияКак и многие другие, я использую Microsoft Outlook для ведения базы данных о людях, с которыми я общаюсь. "Карточки" с записями находятся в папке Contacts (Контакты) и ее подпапках.В числе прочего, в этих карточках хранятся дни рождения. Чтобы не забывать о них и заранее к ним готовиться, я написал скрипт, который просматривает папку Contacts и ее подпапки, составляет список ближайших дней рождений, и посылает мне письмо с этой информацией. Этот скрипт вызывается каждое утро планировщиком задач Windows. Комментарии к коду: 
 Листинг: birthdays.vbs
Option 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
'---------------------------------------------------------------------
	Смотри также
  |