Feeds:
Записи
Комментарии

Archive for Декабрь 2013

Что нам потребуется:

  • Аккаунт на gmail.com
  • Включенный Imap(Настройки – Пересылка и POP/IMAP)

image

  • Скачать библиотеку ImapX — https://imapx.codeplex.com за авторством Павла Азанова – за что ему большая благодарность

Для использования данной библиотеки сначала ее надо загрузить:

Add-Type -Path "C:\IMAPX\v4.5\InterIMAP.dll"

1) Подключение к почтовому серверу Imap

ImapX позволяет указать сервер, порт и шифрование тремя различными способами:

1. С помощью одного из параметризованных конструкторов при инициализации нового ImapClient

2. Используя свойства клиента

3. Настройка параметров подключения прямо при вызове метода Connect


Инициализация клиента:

#Без SSL, порт по умолчанию (143) для соединения
$client= New-Object ImapX.ImapClient("imap.gmail.com") 

#С поддержкой SSL, порт по умолчанию (993) для соединения
$client = New-Object ImapX.ImapClient("imap.gmail.com",$true) 
#С поддержкой SSL, порт по умолчанию (993) для соединения, 
#    отключить проверку сертификата
$client = New-Object ImapX.ImapClient("imap.gmail.com",$true,$false)  

#Без SSL, с указанием порта для соединения
$client = New-Object ImapX.ImapClient("imap.gmail.com",888) 

#С поддержкой SSL, с указанием порта для соединения
$client = New-Object ImapX.ImapClient("imap.gmail.com",888,$true) 

#С поддержкой SSL, с указанием порта для соединения, 
#    отключить проверку сертификата
$client = New-Object ImapX.ImapClient("imap.gmail.com",888,$true,$false) 

#С поддержкой TLS, с указанием порта для соединения, 
#    отключить проверку сертификата
$client = New-Object ImapX.ImapClient("imap.gmail.com",888,
    [System.Security.Authentication.SslProtocols]::Tls,$false) 

Подключение:

if($client.Connect( # опциональные параметры # )) {# подключение прошло успешно}
else {
     # подключиться не удалось
}

Какие параметры можно передать методу Connect:

bool Connect()                                                                                                                                                           
bool Connect(string host, bool useSsl, bool validateServerCertificate)                                                                                                   
bool Connect(string host, int port, bool useSsl, bool validateServerCertificate)                                                                                         
bool Connect(string host, int port, 
    System.Security.Authentication.SslProtocols sslProtocol, 
    bool validateServerCertificate) 

2) Аутентификация

ImapX – поддерживает два встроенных метода: логин — пароль и OAuth2.

# Используя связку Логин - Пароль
$client = New-Object ImapX.ImapClient("imap.gmail.com","993",$true,$true)

if($client.Connect()) {  
    if($client.Login("address@gmail.com", "password")) {
        # подключение прошло успешно    }
}
else {
    # подключиться не удалось
}
# Используя OAuth2
$client = New-Object ImapX.ImapClient("imap.gmail.com","993",$true,$true)

if($client.Connect()) {   
    $credentials = New-Object`
        ImapX.Authentication.OAuth2Credentials("login", "token")

    if($client.Login(credentials)) {
        # подключение прошло успешно     
}
}
else {
    # подключиться не удалось
}

3) Работа с папками

В Gmail папки не используются,вместо них есть ярлыки,но будем считать папка = ярлык.

Для доступа к папкам воспользуемся свойством Folders(для нашего примера $client.Folders) класса ImapX.ImapClient.

Просмотр общих папок:

ImapX обеспечивает прямой доступ ко всем общим папкам как Inbox, Drafs, Trash и другие. Учтите, что это не всегда возможно определить эти папки, так как не все сервера предоставляют необходимую информацию .

Общие папки по умолчанию:

PS >  [ImapX.Collections.CommonFolderCollection].GetProperties().Name

All

Archive

Inbox

Drafts

Important

Flagged

Junk

Sent

Для выбора определенной папки,можно воспользоваться индексом массива или методом Item:

# Просмотр папок почтового ящика
PS > $client.Folders.Name
INBOX
[Gmail]
Личные
Путешествие
Работа
Счета

# Выберем папку вся почта
PS > $client.Folders.All

Exists                : 6
Recent                : 0
Recents               : 0
Unseen                : 0
SubFolders            : {}
Messages              : {}
GMailThreads          : {}
HasChildren           : False
Name                  : Вся почта
Selectable            : True
Path                  : [Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-
FolderPath            : [Gmail]/&BBIEQQRP- &BD8EPgRHBEIEMA-
Flags                 : {\HasNoChildren, \All}
AllowedPermanentFlags : {}
UidNext               : 1357
UidValidity           : 624695359
SubFolder             : 

# Выберем папку входящая почта
$client.Folders.Inbox
$client.Folders.Item("INBOX")
$client.Folders[0]
$client.Folders["INBOX"]
# Просмотр подпапок(свойство SubFolders)
PS > $client.Folders.Item("[Gmail]").SubFolders.Name
Важное
Вся почта
Корзина
Отправленные
Помеченные
Спам
Черновики

Создание папок:

# Создадим папку -  Новости
PS > $client.Folders.Add("Новости")

Exists                : 0
Recent                : 0
Recents               : 0
Unseen                : 0
SubFolders            : {}
Messages              : {}
GMailThreads          : {}
HasChildren           : False
Name                  : Новости
Selectable            : True
Path                  : &BB0EPgQyBD4EQQRCBDg-
FolderPath            : &BB0EPgQyBD4EQQRCBDg-
Flags                 : {}
AllowedPermanentFlags : {}
UidNext               : 1
UidValidity           : 624695382
SubFolder             : 

# Создадим подпапку BBC в разделе Новости
$client.Folders["Новости"].CreateFolder("BBC")

или

$client.Folders["Новости"].SubFolders.Add("BBC")

PS > $client.Folders["Новости"].SubFolders.Add("BBC")

Exists                : 0
Recent                : 0
Recents               : 0
Unseen                : 0
SubFolders            : {}
Messages              : {}
GMailThreads          : {}
HasChildren           : False
Name                  : BBC
Selectable            : True
Path                  : &BB0EPgQyBD4EQQRCBDg-/BBC
FolderPath            : &BB0EPgQyBD4EQQRCBDg-/BBC
Flags                 : {}
AllowedPermanentFlags : {}
UidNext               : 1
UidValidity           : 624695384
SubFolder             : 

Переименование папок:

# Для переименования достаточно изменить свойство Name

PS  >  $client.Folders[«Новости«].Name =«Кино«

 

Удаление папок:

# Удалим папку Кино
PS > $client.Folders["Кино"].Remove()
True

Для уменьшения обращений  к серверу, чтобы оптимизировать работу,можно воспользоваться :

Lazy или Full

По умолчанию ImapX загрузит два уровня  дерева папок при обращении к свойству Folders. Вложенные папки, которые глубже —  по требованию. Если вы хотите получить  всю структуру папок при первом запросе,  измените поведение клиента:

$client.Behavior.FolderTreeBrowseMode = «Full»

Автоматическая проверка папок

По умолчанию ImapX проверяет папки (например, запрашивает общее количество сообщений и последние сообщения), когда структура дерева загружается. Если вам не нужно эту информацию сразу же, вы можете отключить автоматическое обследование:

$client.Behavior.ExamineFolders = $false

4) Работа с сообщениями

ImapX позволяет выбрать способ, как запрашиваются сообщения. Вы можете установить режим загрузки глобально или индивидуально для поиска или одного сообщении.

Определить глобальный тип загрузки для сообщений:

По умолчанию, глобальный режим загрузки установлен на Basic. В этом режиме запрашиваются флаги, заголовки, структуру тела, размер, внутреннюю дату и тело сообщения (за исключением встроенных изображений и вложений).

# Возможные значения свойства — MessageFetchMode

PS > [enum]::GetNames("ImapX.Enums.MessageFetchMode")
Flags
InternalDate
Size
Headers
BodyStructure
Tiny
Minimal
Body
Basic
Attachments
Full
GMailMessageId
GMailThreads
GMailLabels
GMailExtendedData
None
ClientDefault

$client.Behavior.MessageFetchMode = «Basic»

MessageFetchMode.Tiny — флаги,заголовки и структура тела письма

MessageFetchMode.Minimal — флаги,заголовки,структура тела письма,размер и внутреннюю дату

MessageFetchMode.Basic — флаги,заголовки,структура тела и тело письма,размер и внутреннюю дату

MessageFetchMode.Full — флаги,заголовки,тело письма,вложения,размер и внутреннюю дату

Доступ к  сообщениям:

По умолчанию коллекция Messages  объекта Folder будет пустым. Для загрузки сообщений, воспользуемся метод Download:

# Загрузим все сообщения из папки All
$client.Folders.All.Messages.Download()

# Загрузим первые 3 сообщения из папки All
$client.Folders.All.Messages.Download("All",-1,3)
# Загрузим 1 сообщения из папки Inbox от YouTube
$client.Folders.Inbox.Messages.Download('FROM "YouTube"',-1,1)

Если вы не хотите вызвать метод Download  для каждой папки, можно просто задать поведение клиента для автоматического заполнения коллекции Folder.Messages.

$client.Behavior.AutoPopulateFolderMessages = $true

Запрос сообщений используя  метод Folder.Search:

Также можно использовать метод Folder.Search для запроса сообщений. Все найденные сообщения будут возвращены методом Search будут  добавлены к коллекции Folder.Messages. Метод Messages.Download() вызывает метод Folder.Search, поэтому оба метода принимают одинаковые параметры.

PS > $client.Folders.Inbox.Search

OverloadDefinitions
——————-
ImapX.Message[] Search(string query, ImapX.Enums.MessageFetchMode mode, int count)
ImapX.Collections.MessageCollection Search(string path, bool makeProcess) – Является устаревшим и не испольуется

# Найти все сообщения в папке INBOX
$client.Folders.Inbox.Search()

# Найти первое сообщение в папке INBOX
$client.Folders.Inbox.Search(1)

# Найти пятое сообщение в папке INBOX
$client.Folders.Inbox.Search(5)

# Найти первые пять сообщений в папке INBOX( 0x19 - MessageFetchMode.Tiny)
$client.Folders.Inbox.Search("All",0x19,5)

Для формирования фильтра,более подробно можно прочитать в RFC 3501 пункт 6.4.4.

# Найти все сообщения в папке INBOX
$client.Folders.Inbox.Search()

# Найти первое сообщение в папке INBOX
$client.Folders.Inbox.Search(1)

# Найти пятое сообщение в папке INBOX
$client.Folders.Inbox.Search(5)

# Найти первые пять сообщений в папке INBOX( 0x19 - MessageFetchMode.Tiny)
$client.Folders.Inbox.Search("All",0x19,5)

# Найдем сообщения, где в теле письма(BODY) есть YouTube
$client.Folders.Inbox.Search('BODY "YouTube"',0x19,-1)

# Найдем все сообщения от YouTube
$client.Folders.Inbox.Search('FROM "YouTube"')

# Найдем сообщения первое сообщение от YouTube
$client.Folders.Inbox.Search('FROM "YouTube"',0x19,1)

date            = date-day "-" date-month "-" date-year
date-day        =1*2DIGIT
date-month      ="Jan"/"Feb"/"Mar"/"Apr"/"May"/"Jun"/"Jul"/"Aug"/"Sep"/"Oct"/"Nov"/"Dec"
# Найдем сообщения полученные от 1 декабря 2013 года
$client.Folders.Inbox.Search('SINCE "01-DEC-2013"')

# Найдем сообщения полученные  30 ноября 2013 года
$client.Folders.Inbox.Search('ON "30-NOV-2013"') 

# Найдем сообщения в тему у которых есть слово Windows
$client.Folders.Inbox.Search('SUBJECT "Windows"')

Скачивание вложений:

# Просмотр вложений
$m.Attachments

# Имя файла
$m.Attachments.ContentType.Name

# Прежде,чем сохранить или работать с Steam,требуется загрузить Download()
$m.Attachments.Download()

# Проверить загрузку объекта
$m.Attachments.Downloaded

# Сохраним вложение
$m.Attachments.Save("C:\files",$m.Attachments.ContentType.Name)

Копирование сообщений:

# Скопируем сообщение в папку Trash
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m[0].CopyTo($client.Folders.Trash,$true)

Удаление сообщений:

# Найсти все сообщений от YouTube и удалить
$client.Folders.Inbox.Search('FROM "YouTube"') | 
    ForEach-Object {$_.Remove()}

Работа с флагами:

# Флаги сообщения
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m.Flags

# Добавим флаг \SEEN
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m.Flags.Add("\SEEN")

# Удалим флаг \SEEN
$m=$client.Folders.Trash.Search('FROM "test@xxx.ru"')
$m.Flags.Remove("\SEEN")

Экспорт сообщений:

# Экспорт сообщения в файл
$m=$client.Folders.Inbox.Messages[0]
$m.Save("C:\message.eml")
$m.SaveTo("C:\","message.eml")

5) Отключение от почтового сервера Imap

# Disconnect
$client.Disconnect()
Remove-Variable -Name client

PS. Если Вам понравилась библиотека ImapX, Вы можете выразить благодарность Павлу Азанову:

Donate

Реклама

Read Full Post »