|
|
|
|
Автор:
|
ambient
|
|
Тема:
|
kak ispolzovat' attachments s SMTP protokolom
|
|
Дата:
|
9/15/2002 11:16:00 PM
|
ja odnu funkciju pischu, s kotoroj mogno budet otsilat' e-maili. no problema v tom, 4to ja ne snaju kak integrirovat' v etu funkziju podderschku "Attachments".
jest' u kavota ideja?
(isvenite 4to ja ne russkime bukvami peschu)
Public Class Mail
' Implements IDisposable
Private Const CHARACTERS_TO_RECEIVE As Integer = 3
Private Enum _MailCommands
CONN = 0
HELO = 1
MAIL = 2
RCPT = 3
DATA = 4
SDAT = 5
RSET = 6
SEND = 7
SOML = 8
SAML = 9
VRFY = 10
EXPN = 11
HELP = 12
NOOP = 13
QUIT = 14
TURN = 15
End Enum
Private Enum _ReplyCodes
SystemStatus = 211
HelpMessage = 214
ServiceReady = 220
ServiceClosing = 221
ActionOkay = 250
WillForward = 251
StartInput = 354
NotAvailable = 421
MailboxBusy = 450
ActionAborted = 451
ActionNotTaken = 452
SyntaxErrorUnrecognized = 500
SyntaxErrorArguments = 501
CommandNotImplemented = 502
BadSequence = 503
NotParameter = 504
MailBoxUnavailable = 550
UserNotLocal = 551
StorageFull = 552
MailboxNotName = 553
TransactionFailed = 554
End Enum
Dim _sServer As String = "mail.gmx.de"
Dim _iPort As Short = 25
Dim _iTimeout As Short = 20
Dim _sUsername As String
Dim _sPassword As String
Dim _sFrom As String = "[Нажмите здесь, чтобы увидеть E-mail адрес]"
Dim _sTo As String = "[Нажмите здесь, чтобы увидеть E-mail адрес]"
Dim _sCC As String
Dim _sBCC As String
Dim _sSubject As String = "Betreff"
Dim _sBody As String = "Text"
Dim _bFormat As Boolean 'FALSE = Text; TRUE = HTML)
Dim _sAttachments As New System.Collections.ArrayList()
Dim _oNetworkStream As System.Net.Sockets.NetworkStream
Dim _oTCPClient As New System.Net.Sockets.TcpClient()
Dim _oNetworkData() As Byte
Dim _iLastCMD As _ReplyCodes
Dim _bExit As Boolean
Dim _bSuccess As Boolean 'TRUE = Erfolgreich gesendet; FALSE = Fehler)
Dim NetworkStreamDelegate As New AsyncCallback(AddressOf NetworkStream)
'Sendet Daten über Network Stream
Private Sub Send(ByVal sString As String)
Dim _byData() As Byte
'String in Byte-Array konvertieren
_byData = System.Text.Encoding.ASCII.GetBytes(sString)
_oNetworkStream.Write(_byData, 0, Len(sString))
'Befehl im Output-Fernster ausgeben
Console.WriteLine(sString)
End Sub
Private Function GetData() As String
Dim _sData As String
Dim _byTrash(_oTCPClient.ReceiveBufferSize) As Byte
Dim _sTrash As String
_sData = System.Text.Encoding.ASCII.GetString(_oNetworkData)
_oNetworkStream.Read(_byTrash, 0, _oTCPClient.ReceiveBufferSize)
Return _sData
End Function
Private Sub NetworkStream(ByVal p_asyncResult As IAsyncResult)
Dim _sData As String
'Daten aus dem Buffer lesen
_sData = GetData()
'Ergebniss auswerten
If IsNumeric(Left(_sData, 3)) Then
_iLastCMD = CType(Left(_sData, 3), _ReplyCodes)
DoMail()
Else
_iLastCMD = _ReplyCodes.ServiceReady
End If
'Daten-Buffer leeren
_oNetworkData.Clear(_oNetworkData, 0, _oNetworkData.GetUpperBound(0))
'Auf weitere Daten warten
If _iLastCMD <> _ReplyCodes.ServiceClosing Then
_oNetworkStream.BeginRead(_oNetworkData, 0, CHARACTERS_TO_RECEIVE, NetworkStreamDelegate, _oTCPClient)
End If
End Sub
Private Sub EndSession(ByVal _bSuccess As Boolean)
'Session beenden
Send("QUIT" & vbCrLf)
_bSuccess = _bSuccess
_bExit = True
End Sub
'Führt alle Mail-Funktionen aus
Private Sub DoMail()
Static _oMailState As _MailCommands
Select Case _oMailState 'Aktuelle Position auswerten
Case _MailCommands.CONN
Send("HELO " & System.Environment.UserDomainName & vbCrLf)
_oMailState = _MailCommands.MAIL
Case _MailCommands.MAIL
Select Case _iLastCMD
Case _ReplyCodes.ActionOkay
Send("MAIL FROM:" & _sFrom & vbCrLf)
_oMailState = _MailCommands.RCPT
Case Else
EndSession(False)
End Select
Case _MailCommands.RCPT
Select Case _iLastCMD
Case _ReplyCodes.ActionOkay
Send("RCPT TO:" & _sTo & vbCrLf)
_oMailState = _MailCommands.DATA
Case Else
EndSession(False)
End Select
Case _MailCommands.DATA
Select Case _iLastCMD
Case _ReplyCodes.ActionOkay
Send("DATA" & vbCrLf)
_oMailState = _MailCommands.SDAT
Case Else
EndSession(False)
End Select
Case _MailCommands.SDAT
Select Case _iLastCMD
Case _ReplyCodes.StartInput
Send("From: " & _sFrom & vbCrLf & "Date: " & Now() & vbCrLf & "To: " & _sTo & vbCrLf & "Subject: " & _sSubject & vbCrLf & vbCrLf & _sBody & vbCrLf & vbCrLf & "." & vbCrLf)
_oMailState = _MailCommands.QUIT
Case Else
EndSession(False)
End Select
Case _MailCommands.QUIT
Select Case _iLastCMD
Case _ReplyCodes.ActionOkay
EndSession(True)
Case Else
'
End Select
End Select
End Sub
' Private Sub Dispose() Implements IDisposable.Dispose
' _oNetworkStream = Nothing
' _oTCPClient = Nothing
' End Sub
Public Function SendMail() As Boolean
Dim _oAsyncResult As IAsyncResult
Dim _dbStartTime As Double
Dim _AppThread As System.Threading.Thread
ReDim _oNetworkData(_oTCPClient.ReceiveBufferSize)
'Verbinden
_oTCPClient.Connect(_sServer, _iPort)
_oNetworkStream = _oTCPClient.GetStream
_oAsyncResult = _oNetworkStream.BeginRead(_oNetworkData, 0, CHARACTERS_TO_RECEIVE, NetworkStreamDelegate, _oTCPClient)
_dbStartTime = Now.TimeOfDay.TotalSeconds
Do While Not _bExit
If _dbStartTime + _iTimeout < Now.TimeOfDay.TotalSeconds Then
_bExit = True
End If
'Warten
System.Threading.Thread.CurrentThread.Sleep(100)
Loop
Return _bSuccess
'Verbindung herunterfahren
'_oNetworkStream.EndRead(_oAsyncResult)
'_oNetworkStream.Close()
'_oTCPClient.Close()
End Function
End Class
|
|
|
|