Страница: 1 | 
		
		
			
	
		 
		
			
  
    |   | 
    
Вопрос: Ещё один ~Почтовый клиент~
     | 
    
Добавлено: 06.08.11 05:49
     | 
      | 
  
		
			
			  
    
      
Автор вопроса:   Smith | ICQ: adamis@list.ru  
       | 
    
    
      
Хотел спросить, кто, что думает об этом безобразии.
 
 
Ехе’шник никто запускать не станет, сорцы на VB6 тоже не интересны, а так, обсудить ...
 
 
Прога одним файлом, портабельная, весит 222Кб.
 
Прием писем POP3 с поддержкой Proxy HTTP 1.1
 
Отправка службой SMTP (Microsoft cdosys.dll)
 
 
По-моему симпатично получилось. Альфа версия :)
 
Функция "Ответить" не дописана.
 
Нет оповещения о новом письме.
 
 
Определялки новое/неновое нет потому, что не решил как работать с письмами.
 
 
Сейчас прочитанное сохраняется локально в
 
ПапкаПроги\Входящие\ящик@сервак.ру\*.eml
 
При удалении два вопроса, удалять файл и удалять на серваке.
 
 
Думаю это неправильно.
 
Может лучше качнуть, чтоб показать и сразу удалить?
 
И так пас не шифрован, прикрыт от дурака, а тут ещё и письма читай нехочу :)
 
 
безобразие …
Ответить
        | 
    
  
		
			
		
		
			
		
	  
	  
	  
	  
	  
    
      
Номер ответа: 5 Автор ответа:
   Smith
  
    
  ICQ: adamis@list.ru  
  Вопросов: 153 Ответов: 3632 
       | 
      
 Профиль |  | #5
       | 
Добавлено:  07.08.11 01:56
       | 
    
    
      | 
 Прием писем POP3 с поддержкой Proxy HTTP 1.1. - как реализована. Винсокетом, таймером, костылями и чьей-то матерью  
 
 
- Option Explicit
  
-  
 
- Private Const WM_SETTEXT = &HC
  
- Private Const LB_ADDSTRING = &H180
  
- Private Const LB_SETITEMDATA = &H19A
  
- Private Const WM_USER = &H400
  
- Private Const PBM_SETPOS = (WM_USER + 2)
  
-  
 
- Private Const CPT = "Pochta "
  
- Private Const CnP = "> Соединение с почтой..."
  
- Private Const OK_ = "+OK"  
 
- Private Const STT = "STAT" & vbCrLf 
 
- Private Const PSS = "PASS "
  
- Private Const TP_ = "TOP"  
 
- Private Const LIS = "LIST" 
 
-  
 
- Private Host As String      
 
- Private Conn As String      
 
- Private Mail As String      
 
- Private Pass As String      
 
- Private MaxL As Integer     
 
- Private Wind As Long        
 
- Private Lst1 As Long        
 
- Private Prog As Long        
 
- Private Prxy As String      
 
- Private Port As String      
 
-  
 
- Private Index As Integer    
 
- Private Letters  As Integer 
 
-  
 
- Private HTTPErr  As Boolean 
 
- Private Flag As Boolean     
 
-  
 
- Private Log      As String  
 
- Private Stage    As Integer 
 
-                             
 
-                             
 
-                             
 
-                             
 
-                             
 
-                             
 
- Private sDat As String      
 
- Private tLet As String      
 
-  
 
-  
 
- Private Sub Form_Initialize()
  
-   InitCommonControlsXP
  
- End Sub
  
-  
 
- Private Sub Form_Load()
  
-   Dim Arr() As String
  
-  
 
-   Arr = Split(Command, "|")
  
-   Host = Arr(0)
  
-   Mail = "USER " & Arr(1) & vbCrLf
  
-   Pass = Arr(2)
  
-   MaxL = CInt(Arr(3))
  
-   Wind = CLng(Arr(4))
  
-   Lst1 = CLng(Arr(5))
  
-   Prog = CLng(Arr(6))
  
-   Prxy = Arr(7)
  
-   Port = Arr(8)
  
-   Conn = "CONNECT " & Host & ":110 HTTP/1.1" & vbCrLf & vbCrLf
  
-   tLet = PathWrk & "Temp.eml"
  
-  
 
-   If Len(Prxy) > 0 Then
  
-     Stage = 0
  
-   Else
  
-     Stage = 1
  
-   End If
  
-   Tim.Enabled = True
  
- End Sub
  
-  
 
- Private Sub Form_Unload(Cancel As Integer)
  
-   SendMessage Prog, PBM_SETPOS, 100, 0  
 
-   SendMessage Wind, WM_SETTEXT, 0, ByVal CPT
  
-   End
  
- End Sub
  
-  
 
- Private Sub Tim_Timer()
  
-  
 
-   Tim.Enabled = False
  
-  
 
-   With Sck
  
-  
 
-     Select Case Stage
  
-  
 
-       Case 0 
 
-         SendMessage Wind, WM_SETTEXT, 0, ByVal CPT & "> Соединение с прокси..."
  
-         Log = Stage & "> Proxy " & Prxy & ":" & Port & vbCrLf
  
-         .Close
  
-         .Connect Prxy, Port
  
-  
 
-       Case 1 
 
-         SendMessage Wind, WM_SETTEXT, 0, ByVal CPT & CnP
  
-         Log = Log & Stage & "> Mail " & Host & ":110" & vbCrLf
  
-         .Close
  
-         .Connect Host, 110
  
-  
 
-       Case 2 
 
-         SendMessage Wind, WM_SETTEXT, 0, ByVal CPT & "> Передача логина..."
  
-         Log = Log & Stage & "> " & Mail         
 
-         Sck.SendData Mail
  
-  
 
-       Case 3 
 
-         SendMessage Wind, WM_SETTEXT, 0, ByVal CPT & "> Передача пароля..."
  
-         Log = Log & Stage & "> " & PSS & vbCrLf 
 
-         Sck.SendData PSS & Pass & vbCrLf
  
-  
 
-       Case 4 
 
-         SendMessage Wind, WM_SETTEXT, 0, ByVal CPT & "> Запрос писем..."
  
-         Log = Log & Stage & "> " & STT          
 
-         Sck.SendData STT
  
-  
 
-       Case Else 
 
-         If Flag = False Then 
 
-           If Stage - 4 > MaxL Or _
  
-              Index < 1 Or _
  
-              Index > Letters Then 
 
-             Log = Log & Stage & ". Last" & Str$(Stage - 5) & " of" & Str$(Letters) & " letters" & vbCrLf
  
-             Sck_Close
  
-           Else
  
-             Log = Log & Stage & "> " & LIS & Str$(Index) & vbCrLf
  
-             Sck.SendData LIS & Str$(Index) & vbCrLf
  
-           End If
  
-  
 
-         Else 
 
-           Log = Log & Stage & "> " & TP_ & Str$(Index) & " 40" & vbCrLf 
 
-           Sck.SendData TP_ & Str$(Index) & " 40" & vbCrLf
  
-         End If
  
-  
 
-     End Select
  
-  
 
-   End With
  
-  
 
- End Sub
  
-  
 
- Private Sub Sck_Connect()
  
-   sDat = vbNullString
  
-  
 
-   If Stage = 0 Then 
 
-     SendMessage Wind, WM_SETTEXT, 0, ByVal CPT & CnP
  
-     Log = Log & Stage & "> " & Conn
  
-     Sck.SendData Conn
  
-   End If
  
-  
 
- End Sub
  
-  
 
- Private Sub Sck_DataArrival(ByVal bytesTotal As Long)
  
- Static Size As Double      
 
-   Dim strData As String
  
-   Dim sArry() As String
  
-  
 
-   Sck.GetData strData, vbString, bytesTotal
  
-   sDat = sDat & strData
  
-  
 
-   Select Case Stage
  
-  
 
-     Case 0 
 
-       Log = Log & Stage & "< " & sDat
  
-       If InStr(sDat, " 200 ") > 0 Then
  
-         sDat = vbNullString
  
-         Stage = 1
  
-       Else: HTTPErr = True 
 
-       End If
  
-  
 
-     Case 1 
 
-       Log = Log & Stage & "< " & sDat
  
-       If InStr(sDat, OK_) > 0 Then
  
-         sDat = vbNullString
  
-         Stage = 2
  
-         NewIndex
  
-         Tim.Enabled = True
  
-       Else: HTTPErr = True 
 
-       End If
  
-  
 
-     Case 2 
 
-       If InStr(sDat, OK_) > 0 Then
  
-         Log = Log & Stage & "< " & sDat
  
-         sDat = vbNullString
  
-         Stage = 3 
 
-         NewIndex
  
-         Tim.Enabled = True
  
-       End If
  
-  
 
-     Case 3 
 
-       Log = Log & Stage & "< " & sDat
  
-       If InStr(sDat, OK_) = 1 Then
  
-         sDat = vbNullString
  
-         Stage = 4 
 
-         NewIndex
  
-         Tim.Enabled = True
  
-       Else: HTTPErr = True 
 
-       End If
  
-  
 
-     Case 4 
 
-       If InStr(sDat, OK_) > 0 Then
  
-         sArry = Split(sDat, " ")
  
-         Letters = CInt(Val(sArry(1)))
  
-         Log = Log & Stage & "< " & sDat & vbCrLf
  
-         sDat = vbNullString
  
-         Stage = 5
  
-         NewIndex
  
-         Tim.Enabled = True 
 
-       End If
  
-  
 
-     Case Else
  
-       If Flag = False Then 
 
-         If InStr(sDat, OK_) > 0 Then
  
-           sArry = Split(sDat, " ")
  
-           Size = Val(sArry(2))
  
-           Log = Log & Stage & "< " & sDat
  
-           Flag = True
  
-           sDat = vbNullString
  
-           Tim.Enabled = True
  
-         End If
  
-  
 
-       Else 
 
-         If InStr(sDat, vbCrLf & "." & vbCrLf) > 0 Then
  
-           Log = Log & Stage & "< Received" & vbCrLf & vbCrLf
  
-           EML sDat, Size
  
-           Flag = False
  
-           sDat = vbNullString
  
-           Stage = Stage + 1
  
-           NewIndex
  
-           Tim.Enabled = True
  
-         End If
  
-       End If
  
-   End Select
  
- End Sub
  
-  
 
- Private Sub Sck_Error(ByVal Number As Integer, _
  
-                          Description As String, _
  
-                          ByVal Scode As Long, _
  
-                          ByVal Source As String, _
  
-                          ByVal HelpFile As String, _
  
-                          ByVal HelpContext As Long, _
  
-                          CancelDisplay As Boolean)
  
-  
 
-   Log = Log & Stage & ". " & Description & vbCrLf
  
-   HTTPErr = True
  
-   Err.Clear
  
-   Sck_Close
  
- End Sub
  
-  
 
- Private Sub Sck_Close()
  
-   Dim Ind As Long       
 
-   Dim Msg As String     
 
-   Dim Tmp As Integer    
 
-  
 
-   Log = Log & Stage & ". Connection closed"
  
-   Sck.Close
  
-   Open PathWrk & "Проверка ящика.txt" For Output As 1
  
-     Print #1, Log;
  
-   Close
  
 
  дальше там ещё куча всего.
 
Получаю то я 40 строк сверху каждого письма, это надо в письмо заглянуть, чтоб в список добавить (когда, от кого, тема, размер, вложения).
 
 
Отправка службой SMTP (Microsoft cdosys.dll) - как её едят. 
 
- Option Explicit
  
-  
 
- Public Sub SendLetter()
  
-   Dim Msg As New CDO.Message
  
-   Dim Max As Integer
  
-   Dim Tmp As Integer
  
-   Dim Text As String
  
-   Dim Arr() As String
  
-  
 
- On Error Resume Next
  
-   Open PathWrk & "\Текст.txt" For Input Access Read As 1
  
-     Text = Input(LOF(1), #1)
  
-   Close
  
-   Text = Text & vbCrLf & vbCrLf & vbCrLf & String$(30, "_") & vbCrLf & "Почтовый клиент Pochta"
  
-   Arr = Split(Command, "|")
  
-  
 
-  
 
-   With Msg.Configuration.Fields
  
-     .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
  
-     .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = Arr(0) 
 
-     .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
  
-     .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
  
-     .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = Arr(1) 
 
-     .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = Arr(2) 
 
-     
 
-     .Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
  
-     .Item("http://schemas.microsoft.com/cdo/configuration/languagecode") = 1049
  
-     
 
-     .Update
  
-   End With
  
-  
 
-   Max = UBound(Arr)
  
-   With Msg
  
-     .AddAttachment PathWrk & "\Текст.txt"
  
-     If Max > 4 Then
  
-       For Tmp = 5 To Max
  
-         .AddAttachment Arr(Tmp)
  
-       Next
  
-     End If
  
-     .From = Arr(1)
  
-     .Subject = Arr(3)
  
-     .To = Arr(4)
  
-     .TextBody = Text
  
-  
 
-     .Send
  
-   End With
  
-  
 
-   If Err.LastDllError <> 0 Or Err.Number <> 0 Then MsgBox Err.Number & Str$(Err.LastDllError) & vbCrLf & vbCrLf & Err.Description, vbCritical, "Ошибка отправки на: " & Arr(1)
  
- Err.Clear
  
-  
 
-   End
  
- End Sub
  
  тут моего минимум, выдрал где-то в инэте.
 
 
и... как ты письма с разметкой отображаешь? через IE? конечно Microsoft Internet Controls, тут тоже не без гемора, приходится блокировать контекстное меню, парсить EML, переписывать PNG на случай наличия тэгов в файлах, иначе IE их не тянет.
 
 
До серьезного/функционального как пешком до луны.
 
Думаю что-то изи ту юз, легковесное, шустрое и чтобы трафик экономило.
 
Но тем не менее яркое, чтоб запоминалось, я там даже PNG фон основной формы сделал, если приглядеться, видно.
Ответить
        | 
    
  
Страница: 1 | 
 
		
			Поиск по форуму