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.
- API de correo Java (JMA) – javax.mail.jar
- 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
Pasos para asociar Java Mail API:
- Descargue el archivo javax.mail.jar.
- Copie el archivo javax.mail.jar en el directorio WEB-INF\lib de la aplicación.
- Agregue el archivo javax.mail.jar al classpath de su aplicación.
Pasos para asociar JavaBeans Activation Framework API:
- Descargue el archivo ZIP y extraiga los archivos.
- Copie el archivo activación.jar en el directorio WEB-INF\lib de la aplicación.
- 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):
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:
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:
- Tiene que crear una sesión de correo para crear y enviar un mensaje de correo electrónico.
- 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.
- 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).
- También puede usar otras propiedades para configurar sesiones de correo.
- 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:
- Para crear un mensaje, debe pasar un objeto Session al constructor de la clase MimeMessage para crear un objeto MimeMessage.
- Puede establecer el asunto, el cuerpo y las direcciones del mensaje.
- 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:
- Cree un objeto de InternetAddress (Subclase de la clase Address).
- El primer argumento especifica la dirección de correo electrónico.
- Puede agregar un segundo argumento para asociar una ID o dirección de correo electrónico para que se muestre.
- Para configurar la dirección DESDE. utilice el método setFrom(Address add) del objeto MimeMessage.
- 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.
- 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);
- Si SMTP requiere autenticación, puede usar el método getTransport() del objeto de sesión.
- 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.
- Utilice el método abstract void sendMessage(Mensaje mensaje, Dirección[] direcciones) para enviar el mensaje.
- 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:
Publicación traducida automáticamente
Artículo escrito por pawardarshan461 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA