Страница: 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 |
Поиск по форуму