Jump to content
Xtreme .Net Talk

Recommended Posts

Posted (edited)

I am developing a VB.Net application. I want to send email through application.

Can i only use System.Web.Mail to send emails in vb.net application or there is anything else?

Also using System.Web.Mail do i have to pass the SmtpServer Name? I am developing application for general user and i dont know what smtp server they will use........

this is the code i am using:

       SmtpMail.SmtpServer = "localhost"
       Dim email As New MailMessage
       email.Subject = "test"
       email.Body = "A Star Is Born"
       email.To = "abc@xyz.com"
       email.From = "pqr@xyz.com"
       SmtpMail.Send(email)

I am getting Could not create 'CDO.Message' object. ERROR

 

Any Help

Edited by PlausiblyDamp
Posted
I think not specifiying a SmtpServer makes the local computer act like a mail server even without IIS, I'm not sure though, you'll need to test it
.Net allows software to be written for any version of Windows and not break like Unmanaged applications unless using Unmanaged procedures like APIs. If your program uses large amounts of memory but releases it when something else needs it, then what's the problem?
Posted

I've this code for sending emails without CDO, hope it helps you, at the end you'll find some example on how to send an email, if you need a more complex code, I wrote one in C#, that code allows you to add attachments and more

Imports System
Imports System.Text
Imports System.Windows.Forms
Public Class cSMTP
Private m_sSender As String
Private m_sUser As String
Private m_sSenderName As String
Private m_sRecipient As String
Private m_sRecipientName As String
Private m_sServer As String
Private m_iPort As Integer
Private m_sSubject As String
Private m_sBody As String

Private m_iTimeOut As Integer
Private m_colCC As Collection
Private m_colCC_OK As Collection

Private Structure TRecipient
	Dim strEMail As String
	Dim strName As String
	Dim bBlind As Boolean
End Structure

Private tcpClient As System.Net.Sockets.TcpClient
Private networkStream As System.Net.Sockets.NetworkStream

Public Property Timeout() As Integer
	Get
		Timeout = m_iTimeOut
	End Get
	Set(ByVal Value As Integer)
		m_iTimeOut = Value
	End Set
End Property

Public Property User() As String
	Get
		User = m_sUser
	End Get
	Set(ByVal s As String)
		m_sUser = s
	End Set
End Property

Public Property Subject() As String
	Get
		Subject = m_sSubject
	End Get
	Set(ByVal s As String)
		m_sSubject = s
	End Set
End Property

Public Property Body() As String
	Get
		Body = m_sBody
	End Get
	Set(ByVal s As String)
		m_sBody = s
	End Set
End Property

Public Property Sender() As String
	Get
		Sender = m_sSender
	End Get
	Set(ByVal s As String)
		m_sSender = s
	End Set
End Property

Public Property SenderName() As String
	Get
		SenderName = m_sSenderName
	End Get
	Set(ByVal s As String)
		m_sSenderName = s
	End Set
End Property

Public Property Recipient() As String
	Get
		Recipient = m_sRecipient
	End Get
	Set(ByVal s As String)
		m_sRecipient = s
	End Set
End Property

Public Property RecipientName() As String
	Get
		RecipientName = m_sRecipientName
	End Get
	Set(ByVal s As String)
		m_sRecipientName = s
	End Set
End Property

Public Property Server() As String
	Get
		Server = m_sServer
	End Get
	Set(ByVal s As String)
		m_sServer = s
	End Set
End Property

Public Property Port() As Integer
	Get
		Port = m_iPort
	End Get
	Set(ByVal i As Integer)
		m_iPort = i
	End Set
End Property

Private Sub Init()
	m_sBody = ""
	m_sSubject = ""
	m_sSender = ""
	m_sSenderName = ""
	m_sRecipient = ""
	m_sRecipientName = ""
	m_sServer = ""
	m_iPort = -1
	m_iTimeOut = 30

	CloseCon()
	tcpClient = New System.Net.Sockets.TcpClient

	m_colCC = New Collection
	m_colCC_OK = New Collection
End Sub

Private Function ExtendedASCIIEncode(ByVal strMsg As String, ByRef arrByte() As Byte) As Boolean
	Dim i As Integer

	Try
		ReDim arrByte(strMsg.Length - 1)
		For i = 0 To strMsg.Length - 1
			arrByte(i) = CByte(Asc(strMsg.Substring(i, 1)))
		Next i

		ExtendedASCIIEncode = True
	Catch ex As Exception
		If i > 0 Then
			ReDim Preserve arrByte(i - 1)
		End If
		ExtendedASCIIEncode = False
	End Try
End Function

Private Sub SendText(ByVal strMsg As String)
	Dim sendBytes As [byte]()

	If Not ExtendedASCIIEncode(strMsg, sendBytes) Then
		Err.Raise(vbObjectError + 1, "SendText", "Error en el Byte-Array!")
		Exit Sub
	End If

	networkStream.Write(sendBytes, 0, sendBytes.Length)
End Sub

Private Function GetResponse() As String
	Dim Start As Double
	Dim Tmr As Double
	Dim bytes() As Byte

	Start = Now.TimeOfDay.TotalSeconds

	ReDim bytes(tcpClient.ReceiveBufferSize)

	While Not networkStream.DataAvailable

		Tmr = Now.TimeOfDay.TotalSeconds - Start

		Application.DoEvents()

		If Tmr > m_iTimeOut Then
			GetResponse = "TIMEOUT!"
			Exit Function
		End If
	End While

	If networkStream.DataAvailable Then
		networkStream.Read(bytes, 0, CInt(tcpClient.ReceiveBufferSize))
		GetResponse = Encoding.ASCII.GetString(bytes)
	Else
		GetResponse = "TIMEOUT!"
	End If
End Function

Private Sub CloseCon()
	If Not tcpClient Is Nothing Then
		tcpClient.Close()
	End If
	tcpClient = Nothing
End Sub

Public Sub New()
	Init()
End Sub

Public Sub Dispose()
	On Error Resume Next
	CloseCon()
	If Not m_colCC Is Nothing Then
		While m_colCC.Count > 0
			m_colCC.Remove(1)
		End While
	End If
	If Not m_colCC_OK Is Nothing Then
		While m_colCC_OK.Count > 0
			m_colCC_OK.Remove(1)
		End While
	End If

	m_colCC = Nothing
	m_colCC_OK = Nothing
End Sub

Public Sub Clear()
	Init()
End Sub

Public Function Add_cc(ByVal strCC_EMail As String) As Boolean
	Dim objCC As TRecipient
	Try
		objCC = New TRecipient
		objCC.strEMail = strCC_EMail
		objCC.strName = ""
		objCC.bBlind = False

		m_colCC.Add(objCC)

		objCC = Nothing
		Add_cc = True
	Catch
		Add_cc = False
		objCC = Nothing
	End Try
End Function

Public Function Add_cc(ByVal strCC_EMail As String, ByVal strCC_Name As String) As Boolean
	Dim objCC As TRecipient
	Try
		objCC = New TRecipient
		objCC.strEMail = strCC_EMail
		objCC.strName = strCC_Name
		objCC.bBlind = False

		m_colCC.Add(objCC)

		objCC = Nothing
		Add_cc = True
	Catch
		Add_cc = False
		objCC = Nothing
	End Try
End Function

Public Function Add_Bcc(ByVal strCC_EMail As String) As Boolean
	Dim objCC As TRecipient
	Try
		objCC = New TRecipient
		objCC.strEMail = strCC_EMail
		objCC.strName = ""
		objCC.bBlind = True

		m_colCC.Add(objCC)

		objCC = Nothing
		Add_Bcc = True
	Catch
		Add_Bcc = False
		objCC = Nothing
	End Try
End Function

Public Function Add_Bcc(ByVal strCC_EMail As String, ByVal strCC_Name As String) As Boolean
	Dim objCC As TRecipient
	Try
		objCC = New TRecipient
		objCC.strEMail = strCC_EMail
		objCC.strName = strCC_Name
		objCC.bBlind = True

		m_colCC.Add(objCC)

		objCC = Nothing
		Add_Bcc = True
	Catch
		Add_Bcc = False
		objCC = Nothing
	End Try
End Function

Public Function Send() As String
	Dim sResponseCode As String
	Dim sResponse As String
	Dim strMsg As String
	Dim sRegister As String
	Dim iCnt As Long
	Dim s As String
	Dim sTmp As String
	Dim bOK As Boolean
	Dim objCC As TRecipient

	Try
		Send = "OK"

		If m_sServer = "" Or m_iPort < 0 Then
			Send = "Tiene que inicializar el puerto del servidor para poder enviar mensajes"
			Exit Function
		End If

		tcpClient.Connect(m_sServer, m_iPort)
		networkStream = tcpClient.GetStream()

		sResponse = GetResponse()
		sResponseCode = Left(sResponse, 3)
		If sResponseCode <> "220" Then
			CloseCon()
			Send = sResponse
			Exit Function
		End If

		SendText("HELO " & m_sServer & vbCrLf)

		sResponse = GetResponse()
		sResponseCode = Left(sResponse, 3)
		If sResponseCode <> "250" Then
			CloseCon()
			Send = sResponse
			Exit Function
		End If

		If m_sUser = "" Then
			m_sUser = m_sSender
		End If
		SendText("MAIL FROM: " & m_sUser & vbCrLf)

		sResponse = GetResponse()
		sResponseCode = Left(sResponse, 3)
		If sResponseCode <> "250" Then
			CloseCon()
			Send = sResponse
			Exit Function
		End If

		SendText("RCPT TO: " & m_sRecipient & vbCrLf)

		sResponse = GetResponse()
		sResponseCode = Left(sResponse, 3)
		If sResponseCode <> "250" Then
			CloseCon()
			Send = sResponse
			Exit Function
		End If

		For Each objCC In m_colCC
			SendText("RCPT TO: " & objCC.strEMail & vbCrLf)

			sResponse = GetResponse()
			sResponseCode = Left(sResponse, 3)
			Select Case sResponseCode
				Case "550"
					'// Nada
				Case "250"
					m_colCC_OK.Add(objCC)
				Case Else
					CloseCon()
					Send = sResponse
					Exit Function
			End Select
		Next

		SendText("DATA" & vbCrLf)

		sResponse = GetResponse()
		sResponseCode = Left(sResponse, 3)
		If sResponseCode <> "354" Then
			CloseCon()
			Send = sResponse
			Exit Function
		End If

		strMsg = "Date: "
		strMsg = strMsg & Format(Now, "ddd, d. MMM yyyy ")
		strMsg = strMsg & Format(Now, "Long Time")
		SendText(strMsg & vbCrLf)

		If m_sRecipientName <> "" Then
			SendText("To: " & m_sRecipientName & " <" & m_sRecipient & ">" & vbCrLf)
		Else
			SendText("To: " & m_sRecipient & vbCrLf)
		End If

		If iCnt < 0 Then
			SendText("Cc: [email]office@ngs.at[/email]" & vbCrLf)
		End If

		For Each objCC In m_colCC_OK
			If Not objCC.bBlind Then
				If objCC.strName <> "" Then
					SendText("Cc: " & objCC.strName & " <" & objCC.strEMail & ">" & vbCrLf)
				Else
					SendText("Cc: " & objCC.strEMail & vbCrLf)
				End If
			End If
		Next

		If m_sSenderName <> "" Then
			SendText("From: " & m_sSenderName & " <" & m_sSender & ">" & vbCrLf)
		Else
			SendText("From: " & m_sSender & vbCrLf)
		End If

		SendText("Reply To: " & m_sSender & vbCrLf)
		SendText("Subject: " & m_sSubject & vbCrLf)
		SendText(vbCrLf & m_sBody & vbCrLf)
		SendText("." & vbCrLf)

		sResponse = GetResponse()

		SendText("QUIT" & vbCrLf)
		CloseCon()
	Catch ex As Exception
		Send = ex.ToString
	End Try
End Function
End Class

'Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'    Dim xx As SMTPSend.cSMTP = New SMTPSend.cSMTP()
'    Dim yy As String

'    xx.Sender = "rsandoval@ceo-system.com"
'    xx.SenderName = "Rodrigo Sandoval"
'    xx.Server = "ceo-system.com"
'    xx.Subject = "Test"
'    xx.Body = "Test Test Test Test Test"
'    xx.Recipient = "rodrigo_sandoval_v@msn.com"
'    xx.RecipientName = "RSV"
'    xx.Port = 25

'    yy = xx.Send()
'    MsgBox(yy)
'End Sub

Fat kids are harder to kidnap
  • 2 weeks later...
Posted

this is great code. Seems to me it implements an SMTP client from socket level up. Can you publish the C# version with attachments ?

 

I have a batch application which distributes emails.

 

- do I need IIS to be installed and running in order to use System.Web.Mail ?

 

- same question with CDO: do I need it if I want to use System.Web.Mail ?

 

Andrew

Posted

Why don't you just use the simple:

 


   Private Sub SendEmail()
       Dim objEmailMessage As System.Web.Mail.MailMessage
       Dim objSMTPServer As System.Web.Mail.SmtpMail

       objEmailMessage = New System.Web.Mail.MailMessage
       With objEmailMessage
           .To = "me@myemail.com"
           .From = "bill.gates@microsoft.com"
           .Subject = "Great Job!"
           .Body = "Want all my money?"
       End With

       objSMTPServer.SmtpServer = strSMTPServer
       objSMTPServer.Send(objEmailMessage)

   End Sub

Posted

With the example I posted, no, you don't need CDO or IIS installed on the computer.

The example samssmithnz posted is using Webmail, adn as far as I know you need CDO installed on the computer where you install the app.

The C# code is too long to be posted, so I'll prepare something in a simple class and I'll try to upload it in the next days, bout anyway, you can contact me at rodrigo_sandoval_v@msn.com

 

Greetings

Fat kids are harder to kidnap
Posted
yes, only that .NET Framework and a valid SMTP server, I'm creating SMTP Server under C#, but still under development, when I finish it I'll let everyone know, like 6 more months, I want to add many features on it.
Fat kids are harder to kidnap
  • 2 years later...
Posted

Error Message

 

I tried your sample code but I got a error for line:

.To = "me@myemail.com"

Error message said " Property To set to ReadOnly" How do I change it to not ready only?

 

Error Message for line of code: .From = "bill.gates@microsoft.com"

Error Message said " Value of String can't be converted to System.Web.Mail.MailAddress"

 

Are you coding in .net 2005 because the Imports are not Web anymore but Net.

 

Any ideas to get it running?

 

Why don't you just use the simple:

 


   Private Sub SendEmail()
       Dim objEmailMessage As System.Web.Mail.MailMessage
       Dim objSMTPServer As System.Web.Mail.SmtpMail

       objEmailMessage = New System.Web.Mail.MailMessage
       With objEmailMessage
           .To = "me@myemail.com"
           .From = "bill.gates@microsoft.com"
           .Subject = "Great Job!"
           .Body = "Want all my money?"
       End With

       objSMTPServer.SmtpServer = strSMTPServer
       objSMTPServer.Send(objEmailMessage)

   End Sub

Posted
I tried your sample code but I got a error for line:

.To = "me@myemail.com"

Error message said " Property To set to ReadOnly" How do I change it to not ready only?

 

Error Message for line of code: .From = "bill.gates@microsoft.com"

Error Message said " Value of String can't be converted to System.Web.Mail.MailAddress"

 

Are you coding in .net 2005 because the Imports are not Web anymore but Net.

 

Any ideas to get it running?

 

You're right, that is a 2003 version. For 2005, try this:

 

Imports System.Net.Mail

Private Sub SendEmail()

       Dim objMailMessage As MailMessage
       Dim objSmtpClient As SmtpClient

       Try
           'Create the email
           objMailMessage = New MailMessage("me@myaddress.com", "bill@microsoft.com", "Hi Bill", "Bye Bill")

           'Send the email
           objSmtpClient = New SmtpClient
           objSmtpClient.Host = "smtp.mine.com"
           objSmtpClient.Send(objMailMessage)

   End Function

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...