29 de febrero de 2012

Enviar Correo VB-C#

En esta parte se muestra como enviar un correo en VB sobre VS2010, al final están los códigos para VB y C#,  si bien es cierto son lenguajes diferentes, el mismo formulario y razonamiento de partes del código aplica para ambos lenguajes.

Enviando Correo con VB
Para enviar un correo en VB se deben importar los siguientes espacios de nombres:

Imports System.Net.Mail
Imports System.Net

a continuación crearemos un formulario como el que se muestra en la figura, donde en el GroupBox con texto Correo Remitente se pondrá la información del SMTP, dirección de correo electrónico y respectiva contraseña de la persona que envía el correo, mientras en el GroupBox con texto Correo destinatario va la información de la persona(s) que recibirá(n) el correo y la información que se mandará :


Mandar un correo en breve es hacer dos cosas, preparar el correo con las direcciones remitente, destino, CC, BCC, archivos adjuntos, asunto, tipo de codifcacion, etc y por otro lado preparar el SMTPClient por eso se especifican las variables correo y Servidor, correo toma los valores de Usuario y A, como ambos son direcciones de correo se especifican como New MailAddress:

Dim Usuario As String = TxtUsuario.Text
Dim A As String = txtA.Text
Dim Remitente As MailAddress = New MailAddress(Usuario)
Dim Destinatario As MailAddress = New MailAddress(A)

Dim correo As New Mail.MailMessage(Remitente, Destinatario)
Dim Servidor As New Mail.SmtpClient

Ahora, en este ejemplo para no andar especificando el puerto ni el protocolo de mensajería(SMTP), lo que se creo en el formulario fue un ComboBox con las opciones de correo a los que la aplicación puede mandar mensajes, tal como se muestra a continuación con el respectivo código en el evento Load del formulario:



TxtCorreo.Items.Add("Direccion correo Hotmail")
TxtCorreo.Items.Add("Direccion correo Gmail")
TxtCorreo.Items.Add("Direccion correo Yahoo")
TxtCorreo.Items.Add("Direccion Correo Empresarial")
TxtCorreo.DropDownStyle = ComboBoxStyle.DropDownList

Ahora, el puerto que usaremos para mandar mensajes a cualquier servidor de correo será el mismo, por lo que una variable definirá el puerto a utilizar que será el 25:
Dim Puerto As Integer = 25
Lo que si cambiará será al SMTP utilizado y el valor para EnableSsl, esto porque para los SmtpClients Hotmail y Gmail no hay problema en utilizar Secure Sockets Layer para encriptar la conexión, pero Yahoo no lo acepta, así que debemos especificar en código utilizando una variable tipo string que llamaré sec si se activa o desactiva el SSL, dejando a SMTP y sec en string tal como se muestra:

Dim SMTP As String
Dim Puerto As Integer = 25
Dim sec As String


TxtCorreo es el ComboBox que da la opción de escoger a que SMTPClient se mandará el correo, lo que haré para tomar estos valores y saber asignar correctamente los valores a SMTP y sec será capturar el valor del ComboBox(TxtCorreo) y utilizar un IF para ir comparando con valores que pueda tomar el ComboBox:

Dim tipo As String = Convert.ToString(TxtCorreo.Text)

        If tipo = "Direccion correo Hotmail" Then
            SMTP = "SMTP.live.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Gmail" Then
            SMTP = "SMTP.gmail.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Yahoo" Then
            SMTP = "smtp.mail.yahoo.com"
            sec = "false"
        ElseIf tipo = "Direccion Correo Empresarial" Then
            SMTP = "127.0.0.1"
            sec = "true"
        End If

Listo, otra indicación seria el como adjuntar un archivo, esta es la parte del formulario que se encarga de eso:


Para adjuntar hago uso de esta variable:
Dim attachment As OpenFileDialog = New OpenFileDialog()
le especifico un filtro y un textbox que mostrará la ruta del archivo adjunto
attachment.Filter = "All Files(*.*)|*.*"
TxtAdjunto.ReadOnly = True

en el evento click del botón se tendría este código: 


Private Sub BExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BExaminar.Click
        If attachment.ShowDialog = Windows.Forms.DialogResult.OK Then
            TxtAdjunto.Text = attachment.FileName
        End If
    End Sub


Tambien notar que algunos correos pueden tener o no CC, BCC y archivos adjuntos por lo que se debe indicar al momento de mandar el correo, esta parte del codigo es así:
1. Tomar los valores en los textbox correspondientes a CC y BCC y verifico no esten vacios.
2. en caso de no estarlo creo la nueva direccion de correo
3. para el archivo adjunto en caso de existir un Filename es que se ha escogido un archivo, entonces lo adjunto al correo

Dim CopiaCarbon As String = TxtCC.Text
Dim BCopiaCarbon As String = TxtBCC.Text

If Not CopiaCarbon Is Nothing And CopiaCarbon <> vbNullString Then
                    correo.Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If Not CopiaCarbon Is Nothing And BCopiaCarbon <> vbNullString Then
                    correo.Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If attachment.FileName.Length > 0 Then
                    correo.Attachments.Add(New Attachment(attachment.FileName))
                End If
            End With



por ultimo el nombre de cada textbox y el código para mandar el correo desde VB...el ComboBox se llama TxtCorreo y el de adjuntar archivos es TxtAdjunto, ambos no admiten se escriba sobre ellos.



Imports System.Net.Mail
Imports System.Net
Imports System.IO

Public Class Form1
    Dim SMTP As String
    Dim Puerto As Integer = 25
    Dim sec As String
    Dim attachment As OpenFileDialog = New OpenFileDialog()

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TxtCorreo.Items.Add("Direccion correo Hotmail")
        TxtCorreo.Items.Add("Direccion correo Gmail")
        TxtCorreo.Items.Add("Direccion correo Yahoo")
        TxtCorreo.Items.Add("Direccion Correo Empresarial")
        TxtCorreo.DropDownStyle = ComboBoxStyle.DropDownList
        attachment.Filter = "All Files(*.*)|*.*"
        TxtAdjunto.ReadOnly = True
    End Sub

    Private Sub BExaminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BExaminar.Click
        If attachment.ShowDialog = Windows.Forms.DialogResult.OK Then
            TxtAdjunto.Text = attachment.FileName
        End If
    End Sub

    Private Sub BCorreo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BCorreo.Click

        Dim Usuario As String = TxtUsuario.Text
        Dim Contraseña As String = TxtContraseña.Text
        Dim A As String = txtA.Text
        Dim Contenido As String = txtContenido.Text.Trim() & vbCrLf
        Dim Asunto As String = txtAsunto.Text
        Dim Remitente As MailAddress = New MailAddress(Usuario)
        Dim Destinatario As MailAddress = New MailAddress(A)
        Dim CopiaCarbon As String = TxtCC.Text
        Dim BCopiaCarbon As String = TxtBCC.Text
        Dim tipo As String = Convert.ToString(TxtCorreo.Text)

        If tipo = "Direccion correo Hotmail" Then
            SMTP = "SMTP.live.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Gmail" Then
            SMTP = "SMTP.gmail.com"
            sec = "true"
        ElseIf tipo = "Direccion correo Yahoo" Then
            SMTP = "smtp.mail.yahoo.com"
            sec = "false"
        ElseIf tipo = "Direccion Correo Empresarial" Then
            SMTP = "127.0.0.1"
            sec = "true"
        End If

        Try
            Dim correo As New Mail.MailMessage(Remitente, Destinatario)
            Dim Servidor As New Mail.SmtpClient

            With correo
                'aqui puedo agregar mas destinatarios, se debe borrar Remitente y destinatario y modificar
                ' la declaracion de correo y ademas dejar codigo asi: Dim correo As New Mail.MailMessage()
                '.From = New Mail.MailAddress(Usuario)
                '.To.Add(New MailAddress(A))
                '.To = New Mail.MailAddress(A)  aqui solo especifica un destinatario con Add se agregan mas.
                'por ejemplo
                '.To.Add(New MailAddress(A1))
                '.To.Add(New MailAddress(A2))
                '.To.Add(New MailAddress(A3))
                .Subject = Asunto
                .Body = Contenido
                .BodyEncoding = System.Text.Encoding.UTF8
                .IsBodyHtml = False
                .Priority = MailPriority.Normal


                If Not CopiaCarbon Is Nothing And CopiaCarbon <> vbNullString Then
                    .Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If Not CopiaCarbon Is Nothing And BCopiaCarbon <> vbNullString Then
                    .Bcc.Add(New MailAddress(BCopiaCarbon))
                End If

                If attachment.FileName.Length > 0 Then
                    .Attachments.Add(New Attachment(attachment.FileName))
                End If
            End With

            With Servidor
                .Host = SMTP
                .Port = Puerto
                .EnableSsl = sec
                .Credentials = New System.Net.NetworkCredential(Usuario, Contraseña)
                .Send(correo)
            End With

            MessageBox.Show("Correo enviado!", "Correo", MessageBoxButtons.OK)
        Catch
            MessageBox.Show("Correo no se envio !", "Correo", MessageBoxButtons.OK)
        End Try
    End Sub
End Class




y el mismo formulario solo que esta vez con C#


using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Net.Mail;
using System.Net;
using System.IO;
using System.Windows.Forms;

public class Form1
{
    string SMTP;
    int Puerto = 25;
    string sec;

    OpenFileDialog attachment = new OpenFileDialog();
    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        TxtCorreo.Items.Add("Direccion correo Hotmail");
        TxtCorreo.Items.Add("Direccion correo Gmail");
        TxtCorreo.Items.Add("Direccion correo Yahoo");
        TxtCorreo.Items.Add("Direccion Correo Empresarial");
        TxtCorreo.DropDownStyle = ComboBoxStyle.DropDownList;
        attachment.Filter = "All Files(*.*)|*.*";
        TxtAdjunto.ReadOnly = true;
    }

    private void BExaminar_Click(System.Object sender, System.EventArgs e)
    {
        if (attachment.ShowDialog == System.Windows.Forms.DialogResult.OK)
        {
            TxtAdjunto.Text = attachment.FileName;
        }
    }


    private void BCorreo_Click(System.Object sender, System.EventArgs e)
    {
        string Usuario = TxtUsuario.Text;
        string Contraseña = TxtContraseña.Text;
        string A = txtA.Text;
        string Contenido = txtContenido.Text.Trim() + Constants.vbCrLf;
        string Asunto = txtAsunto.Text;
        MailAddress Remitente = new MailAddress(Usuario);
        MailAddress Destinatario = new MailAddress(A);
        string CopiaCarbon = TxtCC.Text;
        string BCopiaCarbon = TxtBCC.Text;
        string tipo = Convert.ToString(TxtCorreo.Text);

        if (tipo == "Direccion correo Hotmail")
        {
            SMTP = "SMTP.live.com";
            sec = "true";
        }
        else if (tipo == "Direccion correo Gmail")
        {
            SMTP = "SMTP.gmail.com";
            sec = "true";
        }
        else if (tipo == "Direccion correo Yahoo")
        {
            SMTP = "smtp.mail.yahoo.com";
            sec = "false";
        }
        else if (tipo == "Direccion Correo Empresarial")
        {
            SMTP = "127.0.0.1";
            sec = "true";
        }

        try
        {
            System.Net.Mail.MailMessage correo = new System.Net.Mail.MailMessage(Remitente, Destinatario);
            System.Net.Mail.SmtpClient Servidor = new System.Net.Mail.SmtpClient();

            var _with1 = correo;
            //aqui puedo agregar mas destinatarios, se debe borrar Remitente y destinatario y modificar
            // la declaracion de correo y ademas dejar codigo asi: Dim correo As New Mail.MailMessage()
            //.From = New Mail.MailAddress(Usuario)
            //.To.Add(New MailAddress(A))
            //.To = New Mail.MailAddress(A)  aqui solo especifica un destinatario con Add se agregan mas.
            //por ejemplo
            //.To.Add(New MailAddress(A1))
            //.To.Add(New MailAddress(A2))
            //.To.Add(New MailAddress(A3))
            _with1.Subject = Asunto;
            _with1.Body = Contenido;
            _with1.BodyEncoding = System.Text.Encoding.UTF8;
            _with1.IsBodyHtml = false;
            _with1.Priority = MailPriority.Normal;


            if ((CopiaCarbon != null) & CopiaCarbon != Constants.vbNullString)
            {
                _with1.Bcc.Add(new MailAddress(BCopiaCarbon));
            }

            if ((CopiaCarbon != null) & BCopiaCarbon != Constants.vbNullString)
            {
                _with1.Bcc.Add(new MailAddress(BCopiaCarbon));
            }

            if (attachment.FileName.Length > 0)
            {
                _with1.Attachments.Add(new Attachment(attachment.FileName));
            }

            var _with2 = Servidor;
            _with2.Host = SMTP;
            _with2.Port = Puerto;
            _with2.EnableSsl = sec;
            _with2.Credentials = new System.Net.NetworkCredential(Usuario, Contraseña);
            _with2.Send(correo);

            MessageBox.Show("Correo enviado!", "Correo", MessageBoxButtons.OK);
        }
        catch
        {
            MessageBox.Show("Correo no se envio !", "Correo", MessageBoxButtons.OK);
        }
    }
    public Form1()
    {
        Load += Form1_Load;
    }
}