Как правильно посылать. Как правильно принемать. Электронная почта на службе у админа.



Задача проста и ясна. Почту нужно отправить и принять. Допустим у нас 2 удаленные системы выходят в интернет раз в сутки и им нужно обмениваться данными. Ну или представим, что мы спамеры =)
Мне эта задача пришла совсем странно, захотелось сделать так, чтобы все входящие письма при появлении печатались на термоленте (термопринтер TSC). Для начала экспериментов я решил написать скрипт, который эту самую почту отсылает:

Const cdoBasic = 1
Set objMessage = CreateObject("CDO.Message")
'Текст письма
objMessage.Subject = "Привед!" ' Тема письма
objMessage.From = """Некто"" <blablabla@gmail.com>" ' От кого письмо
objMessage.To = "*ha*i*o*v_*v@p*e.ru" ' Кому письмо
objMessage.TextBody = "Проверочное сообщение отправлено автоматически" & vbCRLF & "Пробуем печатать" 
' Собственно все письмо. Разумеется в текст письма можно запилить и действительно нужную информацию и даже прицепить файл, например objMessage.AddAttachment(«file://C:\blabla.txt»)
'Подключаемся к SMTP серверу gmail. Для яндекса и мэйлру не получилось отправить почему то, поэтому gmail
With objMessage.Configuration.Fields
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
    'Тип аутентификации Basic (Base64 encoded), NTLM
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
    'Пользователь SMTP сервера. Нам понадобится имя юзера gmail без @gmail.com
    .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "ma****er"
    'Пароль от SMTP сервера в явном виде
    .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "gfhjkm"
    'Порт сервера (25 вроде)
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
    'Использование SSL шифрования
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
    'Время простоя до разъединения. В секундах. 
    .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60   
    .Update
End With
'Как бы всё

On Error Resume Next
objMessage.Send
If Err <> 0 Then
    Msgbox "Не ушло: " & Err.Description
Else
    Msgbox "Ушло!"
End if

По интернетам этот скрипт гуляет давно, и найти его можно введя в гугле "vbs скрипт для отправки почты"
Отправили письмо. Теперь надо его принять. Тут возникает проблема. На сервере письма хранятся в виде *.eml формата, который далек от текста. По сути это html с кучей дополнительной инфы. Чтобы вытащить текст в чистом виде нужно иметь настроенную POP3 учетную запись Outlook или Outlook Expres (есть в любой винде). Именно POP3 (!)
Const olFolderInbox = 6
Set objOutlook = CreateObject("Outlook.Application") ' Цепляемся к оутлуку
Set objNamespace = objOutlook.GetNamespace("MAPI")
Set objFolder = objNamespace.GetDefaultFolder(olFolderInbox) ' Папка "Входящие"
Set colItems = objFolder.Items
Set colFilteredItems = colItems.Restrict("[UnRead] = True") ' Нас интересуют только не прочитанные сообщения
For Each objMessage In colFilteredItems
    strName = strName+  objMessage.SenderName +"  "+ objMessage.SenderEmailAddress+vbCr+objMessage.Subject+vbCr
	colFilteredItems.UnRead="False" ' Помечаем как прочитанные
Next
        strText = strName
        Set objFSO = CreateObject("Scripting.FileSystemObject")
        strFileName = "temporary_print_file.txt" ' Имя текстового файла, куда складываем все письма
        Set objFile = objFSO.CreateTextFile(strFileName)
        objFile.Write strText
        objFile.Close

Теперь у нас есть все нужно. Принемать почту с сервера можно еще при помощи WinSoc, но это друзья мои совсем другая история.