#GEDZAC Mitosis eZine Issue 4
#MITOSIS ARTICLE#
#Motor SMTP usando GMAIL bajo SSL en VB.NET
#Autor: eCORE[GEDZAC] <ecore[at]gedzac[dot]com>
Son muchas las veces que hemos intentado enviar correos usando diferentes servidores SMTP y en la inmensa mayoría de los casos nos hemos dado cuenta que estos requieren una autentificación y trabajar en un protocolo seguro como es SSL (Secure Socket Layer).
En este articulo vamos a pasar a ver un código para enviar correos Microsoft Visual .NET usando el servidor de correo de GMAIL trabajando en un protocolo seguro y usando una autentificación como es logico.
Las imports con las que trabajaremos son las siguientes:
Imports System.Net
Imports System.Net.Mail
Imports System.Net.Mime
Aqui les va la funcion para enviar correos comentada:
Module GEDZACSendEmail
Public Function SendMail(ByVal strMailTo As String, ByVal strSubject As String, ByVal strBody As String) As Integer
Dim MailInstance As System.Net.Mail.MailMessage = New System.Net.Mail.MailMessage()
'Declaramos MailClient como una instancia nueva de SmtpClient
Dim MailClient As New SmtpClient()
'Añadimos a quien le vamos a enviar el mail
MailInstance.To.Add(strMailTo)
'Definimos de donde procede el mail y el nombre del propietario del mail
'Aunque cambiemos el value de la direccion de la que procede, el mail se
'enviará con la direccion que se puso en los credenciales de red
MailInstance.From = New MailAddress("write_here_mail@gmail.com", "NAME", System.Text.Encoding.UTF8)
'Definimos el Subject del mail
MailInstance.Subject = strSubject
'Definimos la codificacion del Subject como UTF8
'Las codificaciones posibles para la codificacion del Subject son:
' ·BigEndianUnicode
' ·Unicode
' ·UTF7
' ·UTF8
' ·UTF32
' ·Ascii
MailInstance.SubjectEncoding = System.Text.Encoding.UTF8
'Definimos el cuerpo del mail
MailInstance.Body = strBody
'Definimos la codificacion del cuerpo como UTF8
'Las codificaciones posibles para la codificacion del cuerpo son:
' ·BigEndianUnicode
' ·Unicode
' ·UTF7
' ·UTF8
' ·UTF32
' ·Ascii
MailInstance.BodyEncoding = System.Text.Encoding.UTF8
'Definimos si el cuerpo del mail estara en HTML
MailInstance.IsBodyHtml = False
'Aqui escribimos las credenciales para que tengamos una autentificacion.
MailClient.Credentials = New System.Net.NetworkCredential("write_here_mail@gmail.com", "password")
'Definimos el SMTP de gmail
MailClient.Host = "smtp.gmail.com"
'Definimos el puerto en el que vamos a trabajar
MailClient.Port = 587
'Activamos trabajar sobre SSL que es necesario para trabajar con GMAIL
MailClient.EnableSsl = True
Try
MailClient.Send(MailInstance)
'Si el mail se envio sin problemas la funcion devuelve 0
Return 0
Catch ex As System.Net.Mail.SmtpException
'En caso de que el Mail no se haya enviado la funcion SendMail devuelve 1
Return 1
End Try
End Function
End Module
Si durante la ejecución de este codigo la ventana de inmediato devuelve el siguiente error:
‘System.Net.Mail.SmtpException’ occurred in System.dll
Entonces es probable que se este creando un bloqueo por parte del servidor, antivirus local, firewall local, etc.…
Para añadir un archivo adjunto, debemos crear un MIME (Multipurpose Internet Mail Extensions) y codificar el archivo a enviar en base 64. Para los que quieran aprender mas sobre mime le recomiendo que se lea todos los RFC que tiene MIME. Los RFCs que conforman MIME son: RFC 2045, RFC 2046, RFC 2047,RFC 4288,RFC 4289 y RFC 2077.
Aquí vamos a especificar un ejemplo de mensaje en MIME con un adjunto:
From: "mailfrom@server.com" <mailfrom@server.com>
Subject: GEDZAC
DATE: mié, 25 jun 2008 16:35:49
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="----=_NextPart_000_0002_01BD22EE.C1291DA0"
X-Priority: 3
X-MSMail - Priority: Normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
Esto es un mensaje multiparte en formato MIME de ejemplo
------=_NextPart_000_0002_01BD22EE.C1291DA0
Content-Type: text/html;
charset="x-user-defined"
Content-Transfer-Encoding: 8bit
Mensage del mail
------=_NextPart_000_0002_01BD22EE.C1291DA0
Content-Type: application/octet-stream;
Name="virus.zip"
Content-Disposition: attachment;
filename="virus.zip"
Content-Transfer-Encoding: base64
## VIRUS BASE64 HERE ##
------=_NextPart_000_0002_01BD22EE.C1291DA0--
En la linea “## VIRUS BASE64 HERE ##” deberia de ir añadido el codigo en base64 del source que se quiera añadir en el mail. Ahora vamos a pasar a ver como codificar archivos en BASE64 en Visual Basic .NET que no puede ser mas facil.
Private Function EncodeFile(ByVal strFilePath As String, ByVal strSaveAs As String)
Dim fLoadcBT As Byte()
Dim b64Buffer As String
Dim fLoad As New IO.FileStream(strFilePath, IO.FileMode.Open)
ReDim fLoadcBT(fLoad.Length)
fLoad.Read(fLoadcBT, 0, fLoad.Length)
fLoad.Close()
'Codificamos los bytes del fichero que hemos leido
b64Buffer = System.Convert.ToBase64String(fLoadcBT)
If IO.File.Exists(strSaveAs) Then
'Si el fichero existe lo eliminamos
IO.File.Delete(strSaveAs)
End If
'Guardamos el archivo y pasamos a cerrar el canal que abrimos
Dim nStream As New IO.StreamWriter(strSaveAs, False)
nStream.Write(b64Buffer)
nStream.Close()
Return 0
End Sub
Pues eso fue todo espero que os sea util.
Saludos
(C) Mitosis 4 - GEDZAC LABS