Enviar correo electrónico con archivo adjunto en C#

Saad Aslam 12 octubre 2023
  1. Cree un formulario que se usará para enviar un correo electrónico con datos adjuntos en C#
  2. Enviar correo electrónico con archivo adjunto en C#
Enviar correo electrónico con archivo adjunto en C#

Este tutorial demostrará cómo usar el cliente SMTP en C# para enviar correos electrónicos con archivos adjuntos.

NET y .NET Core tienen una capacidad integrada para enviar correos electrónicos a través del espacio de nombres System.Net.Mail. Si bien puede ser la opción más fácil, requiere un servidor SMTP.

Use su cuenta de Gmail existente o cree una nueva para enviar correos electrónicos a través de SMTP. Debe habilitar el acceso a aplicaciones menos seguras en la pestaña de seguridad de su perfil para utilizar los servidores SMTP de Google.

Cree un formulario que se usará para enviar un correo electrónico con datos adjuntos en C#

Primero, cree una nueva aplicación de formulario de Windows en Visual Studio.

Abra su archivo de diseño .cs y cree un panel dentro de su formulario. Agregue una etiqueta con el texto Redactar, etiqueta1, y en el extremo derecho, X para cerrar este formulario.

Para agregar funcionalidad, haga doble clic en la etiqueta y lo llevará a la función label_Click. Escriba la siguiente línea dentro.

this.Dispose();

Cree 5 cuadros de texto llamados de la siguiente manera:

  • txtFrom
  • txtPassword
  • txtTo
  • txtTitle
  • txtBody

En el cuadro de texto txtPassword, agregue un carácter (* o ) en la propiedad passwordChar para ocultar la contraseña ingresada por el usuario en el panel inferior derecho del Explorador de soluciones.

Cree un botón llamado btnSend con Send dentro y asígnele un color azul. Este botón enviará el correo electrónico a su dirección de correo electrónico de destino.

Ahora, necesita un botón más para adjuntar un archivo con su correo electrónico antes de enviarlo y una etiqueta para mostrar la ruta del archivo seleccionado. Entonces, vamos a crear un LinkLabel y nombrarlo linkLabel1 y una etiqueta llamada lblLocation.

Asigne a LinkLabel una imagen y un texto Adjuntar archivo desde el Explorador de soluciones. Ahora, haga doble clic en esta LinkLabel en su archivo de diseño de formulario .cs, y lo llevará a este código de función en el que se hizo clic en el botón.

Dentro de esta función, necesitamos abrir un diálogo. Pero antes de eso, debe arrastrar y soltar OpenFileDialog en el diseño de su formulario y conectarlo al botón Adjuntar archivo.

Escribiremos el siguiente código dentro de la función linkLabel1_linkClicked para abrir el cuadro de diálogo y conectar su ruta de archivo seleccionada para mostrar en lblLocation.

openFileDialog1.ShowDialog();
lblLocation.Text = openFileDialog1.FileName;

Producción:

Formulario creado para ser utilizado para enviar correo electrónico con archivo adjunto

Ahora que todo está listo, recopile el correo electrónico y la contraseña del remitente, el correo electrónico del destinatario, el mensaje y el archivo adjunto. Escribamos el código funcional para enviar un correo electrónico usando el cliente SMTP.

Haga doble clic en el botón Send que creamos en nuestro diseño de formulario. Dentro de su función button1_Click, realizaremos las siguientes operaciones.

Enviar correo electrónico con archivo adjunto en C#

Para comenzar, cree un bloque de declaraciones try-catch. La ejecución del programa prueba el bloque try y, si se produce algún error, detecta automáticamente la excepción.

try {
} catch () {
}

Dentro del bloque try, declaramos una variable de tipo de datos MailMessage llamada mail e inicializamos su constructor predeterminado MailMessage() para usar sus propiedades en el proceso de envío de correo electrónico.

MailMessage mail = new MailMessage();

Ahora, declare otra variable, smtp, del tipo de datos SmtpClient, e inicialice una nueva instancia de SmtpClient que requiere un host de cadena. Pasamos smtp.gmail.com porque necesitamos intercambiar correos entre Gmail.

SmtpClient smtp = new SmtpClient("smtp.gmail.com");

Luego, usaremos .From, .To.Add(), .Subject y .Body de la clase MailMessage y les asignaremos los valores de nuestras cajas de texto.

mail.From = new MailAddress(txtFrom.Text);
mail.To.Add(txtTo.Text);
mail.Subject = txtTitle.Text;
mail.Body = txtBody.Text;

Luego, necesitamos adjuntar el archivo seleccionado con el correo. Crearemos un archivo adjunto variable del tipo de datos System.Net.Mail.Attachment y le asignaremos la ruta del archivo seleccionado.

Adjunte el archivo con el correo usando el método .Attachments.Add() pasándole el archivo adjunto.

System.Net.Mail.Attachment attachment;
attachment = new System.Net.Mail.Attachment(lblLocation.Text);
mail.Attachments.Add(attachment);

Necesitamos asignar algunos valores a SMTP, incluido el puerto que usa Gmail, la dirección de correo electrónico del remitente y la contraseña. Deberíamos habilitar SSL (Secure Sockets Layer) para transmitir los datos de forma segura.

Luego, llamamos al método Send() y pasamos nuestro correo. Después de enviar el correo, creemos un cuadro de mensaje que mostrará un mensaje con un icono de información y un botón Aceptar.

smtp.Port = 587;
smtp.Credentials = new System.Net.NetworkCredential(txtFrom.Text, txtPassword.Text);
smtp.EnableSsl = true;
smtp.Send(mail);
MessageBox.Show("Mail has been sent successfully!", "Email Sent", MessageBoxButtons.OK,
                MessageBoxIcon.Information);

Ahora, el bloque catch contendrá el siguiente código. Estas líneas de código detectarán cualquier excepción que ocurra y la generarán en un cuadro de mensaje.

catch (Exception ex) {
  MessageBox.Show(ex.Message);
}

Código fuente completo

using System;
using System.Net.Mail;

namespace send_email_with_attachment {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void label1_Click(object sender, EventArgs e) {
      this.Dispose();
    }

    private void label5_Click(object sender, EventArgs e) {}

    private void label7_Click(object sender, EventArgs e) {}

    private void button1_Click(object sender, EventArgs e) {
      try {
        MailMessage mail = new MailMessage();
        SmtpClient smtp = new SmtpClient("smtp.gmail.com");
        mail.From = new MailAddress(txtFrom.Text);
        mail.To.Add(txtTo.Text);
        mail.Subject = txtTitle.Text;
        mail.Body = txtBody.Text;

        System.Net.Mail.Attachment attachment;
        attachment = new System.Net.Mail.Attachment(lblLocation.Text);
        mail.Attachments.Add(attachment);

        smtp.Port = 587;
        smtp.Credentials = new System.Net.NetworkCredential(txtFrom.Text, txtPassword.Text);
        smtp.EnableSsl = true;
        smtp.Send(mail);
        MessageBox.Show("Mail has been sent successfully!", "Email Sent", MessageBoxButtons.OK,
                        MessageBoxIcon.Information);

      } catch (Exception ex) {
        MessageBox.Show(ex.Message);
      }
    }

    private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) {
      openFileDialog1.ShowDialog();
      lblLocation.Text = openFileDialog1.FileName;
    }

    private void txtFrom_TextChanged(object sender, EventArgs e) {}
  }
}

Producción:

Formulario completado para enviar correo electrónico con archivo adjunto

Presione enviar y aparecerá el siguiente cuadro de mensaje.

Correo electrónico enviado correctamente con archivo adjunto

Autor: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn

Artículo relacionado - Csharp Email