Что нам потребуется:
- Аккаунт на gmail.com
- Включенный Imap(Настройки – Пересылка и POP/IMAP)
- Скачать библиотеку 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, Вы можете выразить благодарность Павлу Азанову: