Servlet – Envío de correo electrónico

El correo electrónico se considera la forma más segura, confiable, rápida y económica de comunicación oficial a través de Internet. Esa es la razón por la que cada segundo se envían casi 2,7 millones de correos electrónicos. Por lo tanto, su aplicación web puede necesitar un servicio de correo electrónico para muchas necesidades como: comunicación, autenticación multifactor, etc. Trabajar con el servicio de correo dentro de servlet requiere: servidor SMTP (local/remoto) y las dos API siguientes.

  1. API de correo Java (JMA) – javax.mail.jar
  2. API del marco de activación de JavaBeans (JAF): activación.jar

Requisitos previos: 

  • Si utiliza el servidor SMTP de Gmail, el intento de inicio de sesión puede bloquearse debido a
    • La verificación en dos pasos está activada,
    • El acceso a aplicaciones menos seguras está desactivado.
  • Puede cambiar la configuración de la cuenta de Google o utilizar Iniciar sesión con Google/código de aplicación generado por Google.
  • Comprender los protocolos del servicio de correo

   protocolos 

Descripción

     SMTP             

El Protocolo simple de transferencia de correo se utiliza para enviar un mensaje de un servidor de correo a otro.                                                                

ESTALLIDO

El Protocolo de oficina postal se utiliza para recuperar mensajes de un servidor de correo. Este protocolo transfiere todos los mensajes del servidor de correo al cliente de correo.

IMAP

El Protocolo de acceso a mensajes de Internet es utilizado por servicios de correo basados ​​en web como Gmail y Yahoo. Este protocolo permite que un navegador web lea mensajes que están almacenados en el servidor de correo. 

MÍMICA

El tipo de Extensión multipropósito de correo de Internet especifica el tipo de contenido que se puede enviar como mensaje o archivo adjunto.

Comprender el funcionamiento del correo electrónico

Ciclo de vida del correo electrónico

Pasos para asociar Java Mail API:

  1. Descargue el archivo javax.mail.jar.
  2. Copie el archivo javax.mail.jar en el directorio WEB-INF\lib de la aplicación.
  3. Agregue el archivo javax.mail.jar al classpath de su aplicación.

Pasos para asociar JavaBeans Activation Framework API:

  1. Descargue el archivo ZIP y extraiga los archivos.
  2. Copie el archivo activación.jar en el directorio WEB-INF\lib de la aplicación.
  3. Agregue el archivo de activación.jar al classpath para su aplicación.

Nota: JavaBeans Activation Framework API se incluye con Java SE 6. Como resultado, si usa Java SE 6 o posterior, no necesita instalar esta API.

Estructura de la aplicación web (Servlet):

Asociación de archivos en Servlet Web-Application

1] web.xml (configuración)

XML

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>Email</servlet-name>
        <servlet-class>mail.Servlet.Email</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Email</servlet-name>
        <url-pattern>/Email</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>

2] index.html (Ingresar detalles)

HTML

<!DOCTYPE html>
<html>
    <head>
        <title>GeeksforGeeks</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <form action="Email" method="post">
            <div align="center"> <h1>Enter the Credentials: </h1>
            <input type="hidden" name="action" value="add">
            
            <label for="sID">Sender ID :</label> <br>
            <input id="sID" type="text" name="id"> <br>
             
            <label for="sMail">Sender Email :</label> <br>
            <input id="sMail" type="email" name="emailSender"> <br>
            
            <label for="pw">Password :</label> <br>
            <input id="pw" type="password" name="password"> <br>
            
            <label for="rMail">Receiver Email :</label> <br>
            <input id="rMail" type="email" name="emailReceiver"> <br>
             
            <label for="sub">Subject :</label> <br>
            <input id="sub" type="text" name="subject"> <br>
             
            <label for="message">Message :</label> <br>
            <input id="message" type="text" name="message"><br>
            <input type="submit" value="Send">
             
            </div>
        </form>
    </body>
</html>

Producción:

Complete los detalles en la salida de Mail.java

3] Email.java (Servlet para manejar detalles)

Java

package mail.Servlet;
 
import static mail.Servlet.Mail.sendMail;
 
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class Email extends HttpServlet {
 
    protected void
    processRequest(HttpServletRequest request,
                   HttpServletResponse response)
        throws ServletException, IOException
    {
 
        String id, sender, receiver, password, subject,
            message;
 
        // check if directed url
        String action = request.getParameter("action");
        String url = "/index.html";
        if (action == null) {
            // directed to email interface
            action = "join";
        }
        if (action.equals("join")) {
            url = "/index.html";
        }
        if (action.equals("add")) {
            // retrieve the entered credentials
            id = request.getParameter("id");
            sender = request.getParameter("emailSender");
            receiver
                = request.getParameter("emailReceiver");
            password = request.getParameter("password");
            subject = request.getParameter("subject");
            message = request.getParameter("message");
            // get and set String value of email status
            request.setAttribute(
                "message",
                sendMail(id, receiver, sender, subject,
                         message, true, password));
            // directed to page showing the status of email
            url = "/confirmation.jsp";
        }
 
        getServletContext()
            .getRequestDispatcher(url)
            .forward(request, response);
    }
 
    @Override
    protected void doGet(HttpServletRequest request,
                         HttpServletResponse response)
        throws ServletException, IOException
    {
        processRequest(request, response);
    }
 
    @Override
    protected void doPost(HttpServletRequest request,
                          HttpServletResponse response)
        throws ServletException, IOException
    {
        processRequest(request, response);
    }
 
    // Returns a short description of the servlet.
    // @return a String containing servlet description
    @Override public String getServletInfo()
    {
        return "Short description";
    }
}

4] Mail.java (clase de ayuda para crear y enviar correo)

Clases esenciales:

Paquetes

Descripción

java.util

Contiene la clase de propiedades que se usa para establecer las propiedades de la sesión de correo electrónico.

javax.correo

Contiene las clases Session, Message, Address, Transport, MessagingException para enviar mensajes.
javax.correo.internet Contiene las clases MimeMessage e InternetAddress para enviar mensajes de correo electrónico a través de Internet.

Crear y enviar un mensaje de correo electrónico:

Crear sesión de correo:

  1. Tiene que crear una sesión de correo para crear y enviar un mensaje de correo electrónico.
  2. Antes de la creación de la sesión, debe crear un objeto de propiedades que contenga propiedades (par clave-valor) utilizando el método put (clave, valor) que la sesión necesita para enviar o recibir correo.
  3. Como mínimo, debe especificar la propiedad del host SMTP: use la palabra clave ‘localhost’ para especificar el servidor SMTP que se ejecuta en el mismo servidor que la aplicación web. Si está utilizando un servidor SMTP remoto (p. ej., un servidor de Gmail), utilice el protocolo SMTPS (conexión segura y autenticación).
  4. También puede usar otras propiedades para configurar sesiones de correo.
  5. Obtenga el objeto de sesión envolviendo el objeto de propiedades en el método getDefaultInstance (objeto de propiedades) de la clase de sesión.

Propiedades comunes

Descripción

correo.transporte.protocolo Especifica el protocolo que se utiliza para la sesión.

correo.smtp.host

Especifica la computadora host para el servidor SMTP.

correo.smtp.puerto

Especifica el puerto que utiliza el servidor SMTP.

correo.smtp.auth

Especifica si se requiere autenticación para iniciar sesión en el servidor SMTP.

correo.smtp.quitwait

Establézcalo en falso para evitar una SSLException en un intento de conectarse al servidor SMTP de Gmail.
// local SMTP server - Default 
Properties props = new Properties();
props.put("mail.smtp.host", "localhost");
Session session = Session.getDefaultInstance(props);
// local SMTP server - Configure
Properties props = new Properties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", "localhost");
props.put("mail.smtp.port", 25);
Session session = Session.getDefaultInstance(props);
session.setDebug(true);
// remote SMTP server
Properties props = new Properties();
props.put("mail.transport.protocol", "smtps");
props.put("mail.smtps.host", "smtp.gmail.com");
props.put("mail.smtps.port", 465);
props.put("mail.smtps.auth","true");
props.put("mail.smtps.quitwait","false");
Session session = Session.getDefaultInstance(props);
session.setDebug(true);

Crear mensaje:

  1. Para crear un mensaje, debe pasar un objeto Session al constructor de la clase MimeMessage para crear un objeto MimeMessage.
  2. Puede establecer el asunto, el cuerpo y las direcciones del mensaje.
  3. Si el cuerpo no es texto sin formato, utilice el método setContent() para cambiar el tipo de mensaje MIME.
Message message = new MimeMessage(session);
message.setSubject("Test");
// automatically sets to text/plain
message.setText("Test Successful"); 
message.setContent("<h1>Test Successful<h1>", "text/html");

Nota: Todos los métodos de mensajes utilizados anteriormente arrojan javax.mail.MessagingException.

// add attachments within email

// create 1'st part of body
BodyPart bodyPart = new MimeBodyPart(); 
bodyPart.setText("Body Message");

Multipart multiPart = new MimeMultipart();
// wrap up 1'st part
multiPart.addBodyPart(bodyPart); 

// create 2'nd part of body
bodyPart = new MimeBodyPart(); 
DataSource source = new FileDataSource("Filename.txt");
bodyPart.setDataHandler(new DataHandler(source));
bodyPart.setFileName("Filename.txt");

// wrap up 2'nd part.
multiPart.addBodyPart(bodyPart);
// adds wrapped parts in message 
message.setContent(multiPart); 

Dirigir un mensaje:

  1. Cree un objeto de InternetAddress (Subclase de la clase Address).
  2. El primer argumento especifica la dirección de correo electrónico.
  3. Puede agregar un segundo argumento para asociar una ID o dirección de correo electrónico para que se muestre.
  4. Para configurar la dirección DESDE. utilice el método setFrom(Address add) del objeto MimeMessage.
  5. Para configurar la dirección TO, CC (copia carbónica), BCC (copia carbónica oculta), use el método setRecipient(Type type, Address add) del objeto MimeMessage.
  6. Para varios destinatarios, puede usar el método setRecipients(Type type, Address[] add) del objeto MimeMessage.
// set sender
Address fromAdd = new InternetAddress("from@gmail.com", "from ID");
message.setFrom(fromAdd);
// set recipient
Address toAdd = new InternetAddress("to@gmail.com");
message.setRecipient(Message.RecipientType.TO, toAdd);
message.setRecipient(Message.RecipientType.CC, toAdd);
message.setRecipient(Message.RecipientType.BCC, toAdd);
// set recipients
message.setRecipients(Message.RecipientType.TO, new Address[]{new InternetAddress("to1@gmail.com"),new InternetAddress("to2@gmail.com")});
 
// add recipients
Address toAdd1 = new InternetAddress("to@gmail.com");
message.addRecipient(Message.RecipientType.TO, toAdd1);

Nota: Cuando envía una copia al carbón, las direcciones CC aparecen en el mensaje. Cuando envía una copia oculta, la dirección BCC no aparece en el mensaje. Si usa el constructor de dos argumentos de InternetAddress, genera la excepción java.io.UnsupportedEncoding.

Enviando un mensaje:

Si el SMTP no requiere autenticación, puede usar el método de envío estático (mensaje de mensaje) de la clase de transporte para enviar un mensaje.

Transport.send(message);
  1. Si SMTP requiere autenticación, puede usar el método getTransport() del objeto de sesión.
  2. Luego puede usar el método de conexión: public void connect (String user, String password), para especificar las credenciales (nombre de usuario, contraseña) para conectarse al servidor.
  3. Utilice el método abstract void sendMessage(Mensaje mensaje, Dirección[] direcciones) para enviar el mensaje.
  4. Debe cerrar la conexión con el método close() si no se usa el bloque de prueba con recursos.
Transport transport = session.getTransport();
transport.connect("email-id", "password");
transport.sendMessage("message", message.getAllRecipients());
transport.close();

Nota: Si el host SMTP es incorrecto, el método de envío de vacío estático (mensaje de mensaje) genera SendFailedException.

Java

package mail.Servlet;
 
import java.io.UnsupportedEncodingException;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
public class Mail {
    public static String
    sendMail(String id, String to, String from,
             String subject, String body, boolean content,
             String password)
    {
        String status = null;
        try {
            // acquire a secure SMTPs session
            Properties pros = new Properties();
            pros.put("mail.transport.protocol", "smtps");
            pros.put("mail.smtps.host", "smtp.gmail.com");
            pros.put("mail.smtps.port", 465);
            pros.put("mail.smtps.auth", "true");
            pros.put("mail.smtps.quitwait", "false");
            Session session
                = Session.getDefaultInstance(pros);
            session.setDebug(true);
            // Wrap a message in session
            Message message = new MimeMessage(session);
            message.setSubject(subject);
 
            if (content) {
                message.setContent(body, "text/html");
            }
            else {
                message.setText(body);
            }
            // specify E-mail address of Sender and Receiver
            Address sender = new InternetAddress(from, id);
            Address receiver = new InternetAddress(to);
            message.setFrom(sender);
            message.setRecipient(Message.RecipientType.TO,
                                 receiver);
            // sending an E-mail
            try (Transport tt = session.getTransport()) {
                // acqruiring a connection to remote server
                tt.connect(from, password);
                tt.sendMessage(message,
                               message.getAllRecipients());
                status = "E-Mail Sent Successfully";
            }
        }
        catch (MessagingException e) {
            status = e.toString();
        }
        catch (UnsupportedEncodingException e) {
            status = e.toString();
        }
        // return the status of email
        return status;
    }
}

5] confirm.jsp (Comprobar el estado del correo electrónico)

HTML

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>GeeksforGeeks</title>
    </head>
    <body>
        <h3 align="center">Status of E-Mail : </h3>
        <h1 align="center">${requestScope.message}</h1>
    </body>
</html>

Producción:

Estado del correo después del ciclo de vida

Publicación traducida automáticamente

Artículo escrito por pawardarshan461 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *