JavaRush /Blog Java /Random-ES /Cómo enviar un correo electrónico desde una aplicación Ja...
PodoBulge
Nivel 31
Минск

Cómo enviar un correo electrónico desde una aplicación Java (con ejemplo)

Publicado en el grupo Random-ES
Enviar un correo electrónico desde una aplicación Java es un requisito común. No importa si está trabajando en una aplicación Java central, una aplicación web o una aplicación Java empresarial, es posible que deba enviar un correo electrónico para alertar al personal de soporte sobre errores o simplemente enviar un correo electrónico a los usuarios al registrarse. restablecer su contraseña o pedirles que confirmen la dirección de correo electrónico después del registro. Hay muchos escenarios en los que necesita la capacidad de enviar correos electrónicos desde una aplicación Java. Cómo enviar un correo electrónico desde una aplicación Java (con ejemplo) - 1En las aplicaciones listas para usar, ya tiene un módulo o biblioteca que funciona con todas las funciones para enviar correos electrónicos, como la capacidad de enviar archivos adjuntos, imágenes, incluidas firmas y texto enriquecido en correos electrónicos, PERO si necesita escribir algo desde cero, entonces Java Mail API es una gran opción. En este artículo, aprenderemos cómo enviar correos electrónicos desde una aplicación Java utilizando la API de correo ( javax.mail ). Antes de escribir código debes conocer algunos conceptos básicos de cómo funciona el correo electrónico, por ejemplo necesitas un servidor SMTP (Protocolo simple de transferencia de correo) . Si está ejecutando su aplicación Java en Linux, debe saber que el demonio SMTP usa el puerto 25. Puede usar cualquier servidor de correo para enviar mensajes usando Java, incluidos servidores de correo públicos como GMail, Yahoo o cualquier otro proveedor de servicios, todos Lo que necesita son los detalles de su servidor SMTP , como el nombre de host, el puerto, los parámetros de conexión, etc. También puede utilizar SSL ( capa de conexión segura ), TLS ( seguridad de la capa de transporte ) para conectarse y enviar correos electrónicos de forma segura, pero hicimos este ejemplo simple y nos centramos en una lógica mínima para enviar cartas desde una aplicación Java. En futuros artículos aprenderemos cómo enviar un correo electrónico usando archivos adjuntos, cómo enviar un correo electrónico con formato HTML, cómo adjuntar imágenes a un correo electrónico, cómo usar la autenticación SSL para conectarse al servidor de GMail y enviar correos electrónicos, etc. Ahora, comprendamos (discutamos) este sencillo ejemplo de API de correo de Java .

Ejemplo de código Java para enviar un correo electrónico

Para enviar una carta desde un programa Java, necesitará Java Mail API y Java Activation Framework (JAF) ; para ser más precisos, necesitará mail-1.4.5.jar , smtp-1.4.4.jar y activación-1.1.jar . Debe descargar estos archivos JAR e incluirlos en su Classpath para ejecutar este programa. Alternativamente, puede usar Maven para la gestión de dependencias e incluir todas las dependencias allí. Una vez que tenga todos estos archivos JAR, simplemente siga los pasos a continuación para crear y enviar un correo electrónico usando Java.
  1. Cree un objeto Sessionllamando a Session.getDefaultInstance(properties), donde properties- contiene todas las propiedades importantes, por ejemplo, el nombre de host del servidor SMTP.

  2. Crea un objeto MimeMessagepasándole el objeto Sessionobtenido en el paso anterior. Tenemos un conjunto de propiedades diferentes en este objeto, como destinatario del correo electrónico, asunto, cuerpo del mensaje, archivos adjuntos, etc.

  3. Úselo javax.mail.Transportpara enviar un correo electrónico llamando a un método estático send(email), donde el correo electrónico puede ser un objeto MimeMessage.

La cantidad de propiedades que pasa para crear un objeto Sessiondifiere según el tipo de servidor SMTP; por ejemplo, si está utilizando un servidor SMTP que no requiere ninguna autenticación, puede crear un objeto Sessioncon una sola propiedad, por ejemplo, smtp. .mail.host y no es necesario especificar el puerto porque tiene el puerto 25 de forma predeterminada. Por otro lado, si se está conectando a un servidor SMTP que requiere autenticación TLS o SSL, como el host SMTP de GMail, entonces necesita proporcionar un poco más de propiedades, como mail.smtp.port=547 para TLS y correo. smtp.port= 457 para SSL. Este es un programa Java completo que se conecta a un servidor SMTP estándar sin autenticación y envía un mensaje de texto utilizando la API de correo de Java.
import java.util.Properties;
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;

/**
* Java Program to send text mail using default SMTP server and without authentication.
* You need mail.jar, smtp.jar and activation.jar to run this program.
*
* @author Javin Paul
*/

public class EmailSender{
     public static void main(String args[]){

           String to = "receive@abc.om";         // sender email
           String from = "sender@abc.com";       // receiver email
           String host = "127.0.0.1";            // mail server host

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

           Session session = Session.getDefaultInstance(properties); // default session

           try {
                MimeMessage message = new MimeMessage(session); // email message

                message.setFrom(new InternetAddress(from)); // setting header fields

                message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));

                message.setSubject("Test Mail from Java Program"); // subject line

                // actual mail body
                message.setText("You can send mail from Java program by using mail API, but you need" +
                                "couple of more JAR files e.g. smtp.jar and activation.jar");

                // Send message
                Transport.send(message); System.out.println("Email Sent successfully....");
               } catch (MessagingException mex){ mex.printStackTrace(); }

     }

}
Salida: Puede compilar y ejecutar este programa para enviar un correo electrónico simple desde un programa Java:
$ javac EmailSender.java
$ java EmailSender
Correo electrónico enviado correctamente.... Como puede ver, es muy fácil enviar correos electrónicos desde un programa Java. Una vez que haya creado el objeto MimeMessage, deberá agregar destinatarios, que se pueden especificar en TO, CC, BCC. Habiendo terminado con los destinatarios, debemos especificar el asunto de la carta y, finalmente, el contenido de la carta en sí llamando al método message.setText(); Si desea realizar varios envíos por correo, se pueden utilizar los siguientes métodos para especificar los destinatarios:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Puede agregar personas al campo TOusando Message.RecipientType.TO, al campo CCusando Message.RecipientType.CCy a BCC- Message.RecipientType.BCC.

Errores y excepciones

Cuando muchos programadores de Java comienzan a escribir un programa para enviar un correo electrónico, se encuentran con un error porque la mayoría piensa que mail.jar y activación.jar serán suficientes para enviar un correo electrónico desde una aplicación Java, lo cual no es el caso. especialmente si envía correo electrónico a través de un servidor SMTP local en Linux. Si ejecuta este programa sólo con mail.jar y activación.jar en su CLASSPATH, lo más probable es que obtenga este error.

Excepción 1:

com.sun.mail.util.MailConnectException: Couldn't connect to host, port: localhost, 25; timeout -1;
        nested exception is:
            java.net.ConnectException: Connection refused: connect
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1984)
            at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:656)
            at javax.mail.Service.connect(Service.java:345)
            at javax.mail.Service.connect(Service.java:226)
            at javax.mail.Service.connect(Service.java:175)
            at javax.mail.Transport.send0(Transport.java:253)
            at javax.mail.Transport.send(Transport.java:124)
            at Testing.main(Testing.java:62)
        Caused by: java.net.ConnectException: Connection refused: connect
            at java.net.DualStackPlainSocketImpl.connect0(Native Method)
            at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
            at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
            at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
            at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
            at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
            at java.net.Socket.connect(Socket.java:579) at java.net.Socket.connect(Socket.java:528)
            at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:301)
            at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:229)
            at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1950)
       ... 7 more
Aunque la solución a este error es muy sencilla, puede confundirte. java.net.ConnectException: Connection refused: connectPor lo general, falla cuando el servidor no funciona o el puerto al que se está conectando no está especificado correctamente. Solución: además de mail-1.4.5.jar, también necesita smtp-1.4.4.jar y activación-1.1.jar.

Excepción 2:

Este es otro error llamado NoClassDefFoundError, que generalmente se refiere a que falta un archivo JAR en Classpath
Exception in thread "main" java.lang.NoClassDefFoundError: javax/mail/MessagingException
           at java.lang.Class.getDeclaredMethods0(Native Method)
           at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
           at java.lang.Class.getMethod0(Class.java:2764)
           at java.lang.Class.getMethod(Class.java:1653)
           at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
           at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: javax.mail.MessagingException
           at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
           at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
           at java.security.AccessController.doPrivileged(Native Method)
           at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
           at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
           at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Solución: Logré resolver mi problema, se debía a un Classpath incorrecto. Aunque tenía los tres JAR necesarios, un archivo de clase Java para el programa en el mismo directorio, y ejecuté el programa desde allí, Java no pudo resolverlo. Probé los siguientes comandos y el programa funcionó bien:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
Correo electrónico enviado correctamente.... Tenga en cuenta que el directorio actual está marcado con un punto al final del argumento Classpath. Como estaba ejecutando el programa en Linux, utilicé dos puntos (:) en lugar de punto y coma (;) (como en Windows). Se trata de cómo enviar un correo electrónico desde una aplicación Java utilizando la API de correo. Puede que esto le resulte muy sencillo, ya que no necesita más de tres archivos JAR. Es mucho más fácil si usa Gradle o Maven para administrar dependencias. En los siguientes tutoriales veremos ejemplos más complejos de la API Java Mail para enviar correos electrónicos con archivos adjuntos, con imágenes y correos electrónicos bellamente formateados para enviar informes y tablas. Traducción del artículo: Cómo enviar correo electrónico desde un programa Java con ejemplo
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION