Cómo enviar correos electrónicos en Java

La mayoría de los sitios web de hoy en día ofrecen una suscripción a un boletín informativo de cualquier tipo para informarnos sobre sus excelentes ofertas, descuentos, nuevos productos, servicios y recibos....

Visión general

La mayoría de los sitios web de hoy en día ofrecen una suscripción a un boletín informativo de cualquier tipo para informarnos sobre sus excelentes ofertas, descuentos, nuevos productos, servicios y recibos.

Al registrarse en un sitio web, también (en la mayoría de los casos) recibimos un correo electrónico para verificar nuestra dirección de correo electrónico y vincularla a la cuenta en la que se está registrando.

Esta puede ser una excelente táctica de marketing y realmente puede hacer crecer su negocio y su plataforma, por lo que es imprescindible saber cómo crear un sistema simple para enviar correos electrónicos, especialmente si está lanzando una plataforma que ofrece un producto o servicio de cualquier tipo.

Para lograr esto, usaremos una de las bibliotecas principales de Java: javax.mail.

Envío de un correo electrónico de texto sin formato

Aunque nuestro correo electrónico de ejemplo a continuación no es tan emocionante como los correos electrónicos bien diseñados con botones e imágenes personalizados, un correo electrónico simple como este a menudo se envía para registrarse o restablecer la contraseña significa:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class EmailSender {
    public static void main(String[] args) {
        String recipient = "[correo electrónico protegido]";
        String sender = "[correo electrónico protegido]";
        String host = "localhost";

        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);

        Session session = Session.getDefaultInstance(properties);

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(sender));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            message.addRecipients(Message.RecipientType.TO, new Address[...]); // email to multiple recipients
            message.setSubject("Hello World!");
            message.setText("And hello from the body of the message!");

            Transport.send(message);

        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

Nos presentan un par de clases aquí:

  • Propiedades: representa cualquier conjunto de propiedades y valores predeterminados.
  • Session - Recopila las propiedades y los valores predeterminados utilizados por la API del correo.
  • MimeMessage: representa el mensaje de correo electrónico de estilo MIME.
  • InternetAddress - Representa una dirección de Internet de sintaxis RFC882 - "[correo electrónico protegido]"

Envío de correo electrónico con HTML

Los correos electrónicos HTML son muy comunes y probablemente los vea todos los días en su bandeja de entrada. Todos los nuevos catálogos elegantes y productos llamativos están decorados para atraer tanto como sea posible, al igual que sus contrapartes del sitio web.

Enviar un correo electrónico con HTML es un poco diferente del ejemplo anterior en una sola línea:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class EmailSender {

    public static void main(String[] args) {
        String recipient = "[correo electrónico protegido]l.com";
        String sender = "[correo electrónico protegido]";
        String host = "localhost";

        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);

        Session session = Session.getDefaultInstance(properties);

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(sender));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            message.setSubject("Hello World!");

            message.setContent("<h1>Message Header</h1>" +
                    "<p>This is a paragraph </p>" +
                    "<p>This is another paragraph</p>", "text/html");

            Transport.send(message);

        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

Al utilizar el método .setContent() y configurar el tipo para que sea text/html, podemos agregar HTML a nuestro mensaje de correo electrónico.

El método acepta un objeto MultiPart o un objeto/cadena y simplemente establece los argumentos como el contenido del mensaje.

Envío de correo electrónico con un archivo adjunto

En muchos casos, es posible que desee enviar un correo electrónico con un archivo adjunto de cualquier tipo. Por ejemplo, después de que un cliente ordene su producto o pague por su servicio, querrá enviar un recibo para confirmar la compra.

Si su producto o servicio requiere documentos legales, un cliente también puede recibir un documento legal para firmar y devolver, todo lo cual se puede hacer por correo electrónico.

En cualquiera de estos casos, esto requiere un enfoque un poco diferente al de nuestros ejemplos anteriores:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class EmailSender {

    public static void main(String[] args) {
        String recipient = "[correo electrónico protegido]";
        String sender = "[correo electrónico protegido]";
        String host = "localhost";

        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", host);

        Session session = Session.getDefaultInstance(properties);

        try {
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(sender));
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
            message.setSubject("Receipt for your product!");

            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText("Thank you for buying with us, here's a receipt for your product.");

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);

            messageBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource("receipt.txt");
            multipart.addBodyPart(messageBodyPart);

            message.setContent(multipart);

            Transport.send(message);

        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

Aquí, estamos siendo presentados a algunas clases nuevas:

  • BodyPart - Una clase abstracta que representa una parte de un Multipart
  • Multipart - Un contenedor para múltiples objetos BodyPart
  • DataSource: proporciona un tipo para una colección arbitraria de datos, así como acceso a ellos en forma de InputStreams y OutputStreams

Al agregar un ‘Multipart’ como contenido, podemos agregar tantos ‘BodyParts’ en él, y después de agregar uno, podemos usar la misma variable de referencia para inicializar uno nuevo y almacenarlo en el ‘Multipart’ también.

Conclusión

Estas son las tres cosas más comunes que necesita saber para enviar correos electrónicos de cualquier tipo en Java simple y antiguo, sin bibliotecas de terceros adicionales.