POP3-Забираем почту.

24 views
Skip to first unread message

ajax76

unread,
Mar 14, 2008, 2:38:27 PM3/14/08
to ru-powershell
#Отправляет команду на сервер
function Send ([string]$Msg)
{
$Encoder=New-Object System.Text.ASCIIEncoding
[byte[]]$Buffer=(,0)*1024
$Buffer=$Encoder.GetBytes($Msg)
$NetStream=$this.GetStream()
$NetStream.Write($Buffer, 0, $Buffer.Length)
}

#Получает ответ сервера
function Response ()
{
$Encoder=New-Object System.Text.ASCIIEncoding
[byte[]]$Buffer=(,0)*1024
$NetStream=$this.GetStream()
[int]$Count=0
While($true)
{
[byte[]]$buff=(,0)*2
$NotEnd=$NetStream.Read($buff, 0, 1)
if ($NotEnd)
{
if (($buff -eq 10) -and ($Buffer[0] -eq 0)) {continue}
$Buffer[$Count]=$buff[0]
$Count++
if ($buff[0] -eq 10) {break}
}
else {break}
}
return $Encoder.GetString($Buffer, 0, $Count)
}

#Возвращает экземпляр POP3 сообщения
function NewMessage ()
{
$Message=New-Object -Type PSobject
Add-Member -in $Message NoteProperty Number $([long]0) -Force
Add-Member -in $Message NoteProperty Size $([long]0) -Force
Add-Member -in $Message NoteProperty Recieved $([bool]0) -Force
Add-Member -in $Message NoteProperty Content $([string]::Empty) -
Force
return $Message
}

#Возвращает экземпляр POP3 клиента
function NewPOP3 ()
{
#Соединяет с сервером
$ConnectP=
{
[string]$Server='Ваш сервер'
[string]$User='Ваше имя'
[string]$Password='Ваш пароль'
$Res=''
$POP3.Connect($Server,110)
$Res=Response
if (! $Res.StartsWith('+OK')) {throw $Res}
Send "USER $User`r`n"
$Res=Response
if (! $Res.StartsWith('+OK')) {throw $Res}
Send "PASS $Password`r`n"
$Res=Response
if (! $Res.StartsWith('+OK')) {throw $Res}
}

#Отсоединяться тоже надо уметь
$DisconnectP=
{
$Res=''
Send "QUIT`r`n"
$Res=Response
if (! $Res.StartsWith('+OK')) {throw $Res}
}

#Возвращает номера и размер сообщений, если таковые имеются
$GetList=
{
$Res=''
$List=@()
Send "LIST`r`n"
$Res=Response
if (! $Res.StartsWith('+OK')) {throw "Error"}
While ($true)
{
$Res=Response
if ($Res -eq ".`r`n") {return $List}
else
{
$Message=NewMessage
[string[]]$Value=$Res.Split(" ")
$Message.Number=[int]$Value[0]
$Message.Size=[int]$Value[1]
$Message.Recieved=$false
$List+=$Message
$Message=$null
continue
}
}
}

#Возвращает конкретное сообщение
$Retrieve=
{
param ($Msg)
$Res=''
$Message=NewMessage
$Message.Size=$Msg.Size
$Message.Number=$Msg.Number
Send "RETR $($Msg.Number)`r`n"
$Res=Response
if (! $Res.StartsWith('+OK')) {throw $Res}
$Message.Recieved=$true
while ($true)
{
$Res=Response
if ($Res -eq ".`r`n") {break}
else {$Message.Content+=$Res}
}
return $Message
}

[PSObject]$TCPClient=New-Object System.Net.Sockets.TcpClient
Add-Member -in $TCPClient ScriptMethod ConnectP $ConnectP
Add-Member -in $TCPClient ScriptMethod DisconnectP $DisconnectP
Add-Member -in $TCPClient ScriptMethod GetList $GetList
Add-Member -in $TCPClient ScriptMethod Retrieve $Retrieve
return $TCPClient
}

$Result=@()
$POP3=NewPOP3
trap {$_;$POP3.Close();exit} $POP3.ConnectP()
trap {$_;$POP3.close();exit} $MessageList=$POP3.GetList()
foreach ($Msg in $MessageList)
{
trap {$_;$POP3.close();exit} $Result+=($POP3.Retrieve($Msg))
}
$POP3.DisconnectP()
$POP3.Close()

$Result|%{$_.Content}

Остаётся добавить остальные команды, разбор заголовков и обработку
ошибок.
Вопросы и коментарии приветствуются!
Reply all
Reply to author
Forward
0 new messages