<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBScript: получение почты по POP3]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=3196</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=3196&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBScript: получение почты по POP3».]]></description>
		<lastBuildDate>Fri, 22 May 2009 05:54:14 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBScript: получение почты по POP3]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=23501#p23501</link>
			<description><![CDATA[<p>Скрипт получения почты с POP-серверов (тестировался на bk.ru, mail.ru, rambler.ru) на &quot;низком&quot; уровне (никакой почтовый клиент не нужен). </p><p>Для запуска задайте нужные значения переменным <strong>MailServer</strong>, <strong>MailPort_POP3</strong>, <strong>User</strong>, <strong>Password</strong> в начале скрипта. Скачанные письма записываются в формате <strong>.eml</strong> (открываются двойным щелчком в Outlook Express) в папку, которая создаётся там же, где лежит сам скрипт, и сортируются по датам. Для работы нужен <strong>MSWINSCK.OCX</strong> (должен идти вместе с MS Office, VB6).<br /></p><div class="codebox"><pre><code>Public Wsock
Public Connected
Public Recieved
Public Action
Public CurrentLetter

Public LOG_FILE
Public STARTT

HOST_EXE=Wscript.FullName
VBS=WScript.ScriptFullName
VBS_Name=WScript.ScriptName

If InStr(1,HOST_EXE,&quot;wscript.exe&quot;,1) Then
   HOST_EXE=Replace(HOST_EXE,&quot;wscript.exe&quot;,&quot;cscript.exe&quot;,1,1,1)
   WScript.CreateObject(&quot;WScript.Shell&quot;).Run HOST_EXE &amp; &quot; //NOLOGO &quot; &amp; VBS,1,False
   Wscript.Quit
End If

WHERE_WE=Replace(VBS,&quot;\&quot; &amp; VBS_NAME,&quot;&quot;)

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set WshShell = CreateObject(&quot;WScript.Shell&quot;)

WHERE_WRITE=CreateArxiv(WHERE_WE)


LOG_FILE=WHERE_WRITE &amp; &quot;\SESSION.LOG&quot; 
On Error Resume Next
Set LOG_FILE = fso.OpenTextFile(LOG_FILE  , 8, True)
If Err.Number&lt;&gt;0  Then
   MsgBox  &quot;Не создать файл &quot; &amp; LOG_FILE
   Wscript.Quit
End If
On Error GoTo 0

MailServer = &quot;pop.mail.ru&quot;
MailPort_POP3   =  110

User=&quot;USER&quot; 
Password=&quot;PASSWORD&quot;

Recieve_Mail MailServer,MailPort_POP3,User,Password,WHERE_WRITE


&#039;---------------Функции и процедуры---------------------
Sub Recieve_Mail(MailServer,MailPort_POP3,User,Password,WHERE_WRITE)
    On Error GoTo 0
    CurrentLetter=0
    Set Wsock = Wscript.CreateObject(&quot;MSWinsock.Winsock&quot;, &quot;WsockR_&quot;)
    WriteLog &quot;iMail&quot;,&quot;Объект создан...&quot;
    Wsock.Connect MailServer, MailPort_POP3
    STATUS=Wait(&quot;Connect_Server&quot;)
    If STATUS=&quot;Wsock.State=9&quot; Then
       WriteLog &quot;iMail&quot;,&quot;Не подключиться к серверу. &quot; &amp; STATUS
       Exit Sub
    End If
    WriteLog &quot;iMail&quot;,&quot;Подключились к серверу &quot; &amp; MailServer &amp; &quot;...&quot;    
    Wsock_SendData (&quot;USER &quot; &amp; User &amp; vbcrlf)
    Wait &quot;+&quot;
    Wsock_SendData (&quot;PASS &quot; &amp; Password  &amp; vbcrlf)
    Wait &quot;+&quot;
    Wsock_SendData (&quot;STAT&quot;  &amp; vbcrlf)
    Letters=Wait(&quot;+&quot;)
    Letters=NUM((Mid(Letters,5)))
    If Letters=0 Then
       Wsock_SendData &quot;QUIT&quot; &amp; vbCrLf
       Wsock.Close
       Set Wsock=Nothing
       WriteLog &quot;iMail&quot;,&quot;Писем нет &quot; 
       Exit Sub
    End If
    For i=1 To Letters
        CurrentLetter=fso.GetFolder(WHERE_WRITE).Files.Count &#039;Timer*100
        If CurrentLetter=0 Then CurrentLetter=1  
        WriteLog &quot;iMail&quot;,&quot;Запрос на получение &quot; &amp; i &amp; &quot;-го письма&quot;
        Wsock_SendData (&quot;RETR &quot; &amp; i  &amp; vbcrlf)
        Wait &quot;LETTER&quot;
        WriteLog &quot;iMail&quot;,&quot;Записали в файл &quot; &amp; i &amp; &quot;-е письмо&quot;
        CurrentLetter=0
        &#039;Если удалить письмо из ящика
        &#039;WriteLog &quot;iMail&quot;,&quot;Запрос на удаление &quot; &amp; i &amp; &quot;-го письма&quot;
        &#039;Wsock_SendData (&quot;DELE &quot; &amp; i &amp; &quot; &quot;   &amp; vbcrlf)
        &#039;Wait &quot;DELETE&quot;
        &#039;WriteLog &quot;iMail&quot;,&quot;Удалили  &quot; &amp; i &amp; &quot; письмо&quot; 
    Next
    CurrentLetter=0
    Wsock_SendData &quot;QUIT&quot; &amp; vbCrLf
    Wait &quot;QUIT&quot;
    Wsock.Close
    Set Wsock=Nothing 
End Sub

Sub Wsock_SendData (WHAT)
    On Error Resume Next
    Wsock.SendData (WHAT)
    If Err.Number&lt;&gt;0 Then
       WriteLog &quot;iMail&quot;,&quot;Wsock.SendData(&quot; &amp; WHAT &amp;  &quot;)=ERROR(&quot; &amp; Err.Number &amp; &quot;:&quot; &amp; Err.Description &amp; &quot;)&quot;
       ExitIt
    End If
    On Error GoTo 0
End Sub

Sub Wsock_Error(Number, Description, Scode, Source, _
        HelpFile, HelpContext, CancelDisplay)
    WriteLog &quot;iMail&quot;,&quot;Внутреняя ошибка &quot; &amp; Number &amp; &quot;:&quot; &amp; Description
    Wsock.Close
    Set Wsock=Nothing
    ExitIt
End Sub

Sub Wsock_Connect()
    Action=&quot;Connected&quot;
End Sub

Sub WsockR_DataArrival(ByVal reqid)
    STARTT=Now()
    Wsock.GetData RC ,8
    If CurrentLetter=0 Then 
       WriteLog &quot;iMail&quot;,&quot;From server &quot; &amp; RC
    End If  
    &#039;Технология с серого форума 
    If CurrentLetter&lt;&gt;0 Then 
      strRepeatingText=&quot;Saving e-Mail in File &quot; &amp; CurrentLetter &amp; &quot;.eml &quot; 
      Wscript.StdOut.Write Chr(13) &amp; strRepeatingText &amp; Time()
    End If
    If Instr(1,RC,&quot;-ERR&quot;) Then
       WriteLog &quot;iMail&quot;,&quot;Ошибка при &quot; &amp; Action &amp; &quot;:&quot; &amp; RC
       Wsock.Close
       Set Wsock=Nothing
       ExitIt
       Exit Sub       
    End If
    If ACTION=&quot;LETTER&quot; Then
       Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
       On Error Resume Next
          Set f = fso.OpenTextFile(WHERE_WRITE &amp;&quot;\&quot;&amp; CurrentLetter &amp; &quot;.eml&quot; , 8, True)
          If Err.Number&lt;&gt;0 Then ExitIt
          f.Write RC 
          If Err.Number&lt;&gt;0 Then ExitIt
          f.Close
          If Err.Number&lt;&gt;0 Then ExitIt
       On Error GoTo 0
       If InStr(1, RC, vbLf &amp; &quot;.&quot; &amp; vbCrLf) Then 
          Action=Recieved
       End If
     Else
       Action=RC
    End If
    STARTT=Now()
End sub

Function wait(what)
STARTT=Now()
Action=what
Do While Action=what
   Wscript.Sleep(500)
   If Wsock.State=9 Then &#039;Error 
      Action=&quot;Wsock.State=9&quot;
      Exit Do
   End If
   NOWW=Now()
   HOW_MANY = DateDiff(&quot;s&quot;,STARTT,NOWW)
   If HOW_MANY=60 Then
      WHAT_KEY=WshShell.Popup(&quot;Нет отклика от сервера минуту. Ждать?&quot;, 30, &quot;Самозакрывающееся окно&quot;, 4 + 32)
      If WHAT_KEY=7 Or WHAT_KEY=-1 Then 
         WriteLog &quot;iMail&quot;,&quot;Нет отклика от сервера.Выход&quot;
         ExitIt
      End If   
      STARTT=Now() 
   End If
Loop
wait=Action   
End Function

Function NUM(what)
For i=1 to Len(what)
    If Mid(what,i,1)=&quot; &quot; Then Exit Function
    NUM=NUM &amp; Mid(what,i,1)
Next
End Function

Sub ExitIt()
    LOG_FILE.Close
    On Error Resume Next    
    Wsock.Close
    Set Wsock=Nothing
    Wscript.Quit
End Sub


&#039;----------&#039;
&#039;Лог
&#039;
Function WriteLog(TITLE,WHAT)
On Error Resume Next
LOG_FILE.Write TITLE &amp; &quot;[&quot; &amp; Now &amp; &quot;]-&quot; &amp; WHAT &amp; vbCrLf
Wscript.StdOut.Write (vbCrLf &amp; WHAT &amp; vbCrLf)
End Function 
&#039;
&#039;Конец Лога
&#039;----------&#039;

Function CreateArxiv(WHERE)
&#039;Если надо, создадим архивный каталог
what=WHERE &amp; &quot;\ARXIV&quot; 
CreateIfNotExists what   
what=what &amp; &quot;\&quot; &amp; Year(Date)
CreateIfNotExists what
what=what &amp; &quot;\&quot; &amp; Month(Date) 
CreateIfNotExists what
what=what &amp; &quot;\&quot; &amp; Day(Date)
CreateIfNotExists what
WriteLOG &quot;&quot;,&quot;Подготовили архивный каталог...&quot; 
CreateArxiv=what
End Function

Function CreateIfNotExists(what)
If Not (fso.FolderExists(what)) Then 
   On Error Resume Next
   fso.CreateFolder(what)
   If Err.Number&lt;&gt;0 Then
      MsgBox &quot;Не создать &quot; &amp; what
      Wscript.Quit
   End If
End If 
End Function</code></pre></div><p>Автор скрипта — <strong>ingvar68</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (The gray Cardinal)]]></author>
			<pubDate>Fri, 22 May 2009 05:54:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=23501#p23501</guid>
		</item>
	</channel>
</rss>
