.NET Framework - Envio de un Email

Asked By Federico Martinez on 13-Jan-09 01:48 PM
Hola grupo.

Estoy tratando de enviar un correo pero al hacer el send me marca el
siguiente error:

No se puede obtener acceso al objeto 'CDO.Message'

Este es mi codigo:

Imports System.Web.Mail

Imports System.IO

Imports System.Net



Module Module1

Sub Main()

Dim myMailParameters As New MIDOMINIO.classes.mail.MailParameters

myMailParameters.SMTPServer = "mail.MIDOMINIO.com.mx"

myMailParameters.SMTPUser = "serverdev@MIDOMINIO.com.mx"

myMailParameters.SMTPPassword = "MIPASWORD"

myMailParameters.SMTPPort = "25"

myMailParameters.From = "serverdev@MIDOMINIO.com.mx"

myMailParameters.To = "MIUSER@MIDOMINIO.com.mx"

myMailParameters.Bcc = "DESTINATARIO1@OTRODOMINIO.com.mx"

myMailParameters.Cc = "DESTINATARIO2@OTRODOMINIO.com.mx"

myMailParameters.Subject = "Esta es una prueba de envio de correo"

myMailParameters.Body = "Hola, estoy haciendo pruebas desde un programa de
VB.NET"

'myMailParameters.alAttachments.Add("C:\Aplicaciones\Log\COL12012009123247.log")

Dim myMailSender As New
MIDOMINIO.classes.mail.DatalogicEmail(myMailParameters)

Try

myMailSender.Enviar()

System.Console.WriteLine("Envio Exitoso!")

Catch ex As Exception

System.Console.WriteLine(ex.Message)

System.Console.Read()

End Try

End Sub

End Module

Namespace MIDOMINIO.classes.mail

Public Class DatalogicEmail


Private MailMsg As New MailMessage

Private SMTPSrv As String



Sub New(ByVal sSMTPServidor As String, ByVal sSMTPUsuario As String, ByVal
sSMTPPassword As String, ByVal sSMTPPuerto As String, _

ByVal sFrom As String, ByVal sTo As String, ByVal sBcc As String, ByVal sCc
As String, ByVal sSubject As String, _

ByVal sBody As String, ByVal sAttachments As ArrayList)

SMTPSrv = sSMTPServidor

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver",
sSMTPServidor)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport",
sSMTPPuerto)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",
1)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername",
sSMTPUsuario)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword",
sSMTPPassword)

MailMsg.From = sFrom

MailMsg.To = sTo

MailMsg.Bcc = sBcc

MailMsg.Cc = sCc

MailMsg.Body = sBody

Dim I As Integer

For I = 0 To sAttachments.Count

If File.Exists(sAttachments(I)) Then

MailMsg.Attachments.Add(sAttachments(I))

End If

Next

End Sub

Sub New(ByVal MailParams As MailParameters)

SMTPSrv = MailParams.SMTPServer

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver",
MailParams.SMTPServer)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport",
MailParams.SMTPPort)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate",
1)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername",
MailParams.SMTPUser)

MailMsg.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword",
MailParams.SMTPPassword)

MailMsg.From = MailParams.From

MailMsg.To = MailParams.To

MailMsg.Bcc = MailParams.Bcc

MailMsg.Cc = MailParams.Cc

MailMsg.Body = MailParams.Body

Dim I As Integer

For I = 0 To MailParams.alAttachments.Count - 1

If File.Exists(MailParams.alAttachments(I)) Then

MailMsg.Attachments.Add(MailParams.alAttachments(I))

End If

Next

End Sub



Public Sub Enviar()

System.Web.Mail.SmtpMail.SmtpServer = SMTPSrv

System.Web.Mail.SmtpMail.Send(MailMsg)

System.Console.WriteLine("Envio Exitoso!")

End Sub


End Class

Public Class MailParameters


'//Server Parameters

Private sSMTPServer As String '// Direccion del Servidor de SMTP

Private sSMTPUser As String '// Usuario de acceso al servidor SMTP

Private sSMTPPassword As String '// Contraseña de acceso al servidor SMTP

Private sSMTPPort As String '// Puerto de acceso al servidor SMTP

'//Mail Parameters

Private sFrom As String '// Remitente

Private sTo As String '// Destinatario

Private sBcc As String '// Destinatario con copia

Private sCc As String '// Destinatario con copia oculta

Private sSubject As String '// Descripcion del asunto del correo

Private sBody As String '// Cuerpo del mensaje

Public alAttachments As New ArrayList '// Arreglo que contiene la lista de
archivos a anexar al correo



Public Sub AddAttachment(ByVal sFile As String)

alAttachments.Add(sFile)

End Sub



Property SMTPServer() As String

Get

Return sSMTPServer

End Get

Set(ByVal Value As String)

sSMTPServer = Value

End Set

End Property

Property SMTPUser() As String

Get

Return sSMTPUser

End Get

Set(ByVal Value As String)

sSMTPUser = Value

End Set

End Property

Property SMTPPassword() As String

Get

Return sSMTPPassword

End Get

Set(ByVal Value As String)

sSMTPPassword = Value

End Set

End Property

Property SMTPPort() As String

Get

Return sSMTPPort

End Get

Set(ByVal Value As String)

sSMTPPort = Value

End Set

End Property

Property From() As String

Get

Return sFrom

End Get

Set(ByVal Value As String)

sFrom = Value

End Set

End Property

Property [To]() As String

Get

Return sTo

End Get

Set(ByVal Value As String)

sTo = Value

End Set

End Property

Property Bcc() As String

Get

Return sBcc

End Get

Set(ByVal Value As String)

sBcc = Value

End Set

End Property

Property Cc() As String

Get

Return sCc

End Get

Set(ByVal Value As String)

sCc = Value

End Set

End Property

Property Subject() As String

Get

Return sSubject

End Get

Set(ByVal Value As String)

sSubject = Value

End Set

End Property

Property Body() As String

Get

Return sBody

End Get

Set(ByVal Value As String)

sBody = Value

End Set

End Property


End Class

End Namespace




Alberto Poblacion replied on 13-Jan-09 04:46 PM
Sí, es una lata. El System.Web.Mail funciona por mediación de los
Collaboration Data Objects (CDO), que es un objeto COM que tiene que estar
previamente instalado en el ordenador. Si no lo tienes, te da un error.

A partir del Framework 2.0, esta forma de enviar correo se considera
obsoleta. En su lugar se usa System.Net.Mail, que funciona abriendo
directamente una conexión SMTP con el servidor, y por lo tanto no necesita
CDO.
IsakMt replied on 13-Jan-09 05:38 PM
A mi me paso que la libreria no esta bien registrada, prueba por ahi, igual y
te funciona.
Federico Martinez replied on 13-Jan-09 06:54 PM
Eso lei e instale el Framework 2.0 para poder importar System.Net.Mail, pero
no me reconoce ese paquete!
Federico Martinez replied on 13-Jan-09 06:54 PM
Que libreria tengo que registrar?
Alberto Poblacion replied on 14-Jan-09 02:06 AM
Tiene que funcionar. Viene en System.dll, que siempre está Referenciada
en el proyecto. Te tiene que funcionar si añades un "Imports
System.Net.Mail" y luego haces un New MailMessage...

Pero por supuesto, sólo funciona si estás programando con el Framework
2.0 o posterior (por ejemplo, con Visual Studio 2005 o 2008). Si el programa
está hecho con Visual Studio 2002 ó 2003 sólo es capaz de usar el Framework
1.0 ó 1.1, aunque el Framework 2.0 también se encuentre instalado en la
máquina.

Si estás usando VS 2002 o 2003 y no puedes actualizarte, entonces estás
limitado a System.Web.Mail, y para que funcione tendrás que instalar algún
producto que contenga el CDO. En este documento aparece una lista
(anticuada): http://support.microsoft.com/kb/171440