Many times in organizations you are unable to access CDO on production Web servers and the IIS SMTP service is forbidden to be installed on production Web servers or individual workstations for security reasons. However, you may still need to send mail in a production setting. With a little VB.NET (or C#.NET) you can just send SMTP messages to the server hosting your mail. For just these circumstances I wrote a simple VB.NET subroutine to send mail. You may need to adjust this subroutine, since it has a dependency on your SMTP server. That dependency is how you end the body of your message. My SMTP server, expects a dot on a line by itself. Consider the following source public domain.
Public Sub SendMail(ByVal smtpHost As String, ByVal fromEmail As String, ByVal toEmail As String, ByVal subject As String, ByVal message As String)
Dim client As TcpClient
Dim cns As NetworkStream
Dim reqBuffer(1024) As Byte
Dim rspBuffer(1024) As Byte
Dim reqMessage As String
Dim rspMessage As String
Dim nRead As Integer
Dim nWrite As Integer
Try
client = New TcpClient(smtpHost, 25)
cns = client.GetStream()
nRead = cns.Read(rspBuffer, 0, rspBuffer.Length)
rspMessage = Encoding.ASCII.GetString(rspBuffer, 0, nRead)
If Not rspMessage.StartsWith("220 ") Then
Throw New Exception("Expecting SMTP 220 response")
End If
reqMessage = "MAIL FROM: " & fromEmail & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
nRead = cns.Read(rspBuffer, 0, rspBuffer.Length)
rspMessage = Encoding.ASCII.GetString(rspBuffer, 0, nRead)
If Not rspMessage.StartsWith("250 ") Then
Throw New Exception("Expecting SMTP 250 response")
End If
reqMessage = "RCPT TO: " & toEmail & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
nRead = cns.Read(rspBuffer, 0, rspBuffer.Length)
rspMessage = Encoding.ASCII.GetString(rspBuffer, 0, nRead)
If Not rspMessage.StartsWith("250 ") Then
Throw New Exception("Expecting SMTP 250 response")
End If
reqMessage = "DATA" & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
nRead = cns.Read(rspBuffer, 0, rspBuffer.Length)
rspMessage = Encoding.ASCII.GetString(rspBuffer, 0, nRead)
If Not rspMessage.StartsWith("354 ") Then
Throw New Exception("Expecting SMTP 354 response")
End If
reqMessage = "From: " & Regex.Replace(fromEmail, "\s+", " ") & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
reqMessage = "To: " & Regex.Replace(toEmail, "\s+", " ") & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
reqMessage = "Subject: " & Regex.Replace(subject, "\s+", " ") & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
reqMessage = vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
reqMessage = message.Replace(vbCrLf, vbLf).Replace(vbLf & "." & vbLf, vbLf & ". " & vbLf)
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
reqMessage = vbLf & "." & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
nRead = cns.Read(rspBuffer, 0, rspBuffer.Length)
rspMessage = Encoding.ASCII.GetString(rspBuffer, 0, nRead)
If Not rspMessage.StartsWith("250 ") Then
Throw New Exception("Expecting SMTP 250 response")
End If
reqMessage = "QUIT" & vbLf
reqBuffer = Encoding.Convert(Encoding.Unicode, Encoding.ASCII, Encoding.Unicode.GetBytes(reqMessage))
cns.Write(reqBuffer, 0, reqBuffer.Length)
nRead = cns.Read(rspBuffer, 0, rspBuffer.Length)
rspMessage = Encoding.ASCII.GetString(rspBuffer, 0, nRead)
If Not rspMessage.StartsWith("221 ") Then
Throw New Exception("Expecting SMTP 221 response")
End If
client.Close()
Catch e As Exception
Throw e
End Try
Exit Sub
End Sub