ajax76
unread,Mar 14, 2008, 2:38:27 PM3/14/08Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
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}
Остаётся добавить остальные команды, разбор заголовков и обработку
ошибок.
Вопросы и коментарии приветствуются!