JavaRush /Java Blog /Random-IT /Come inviare un'e-mail da un'applicazione Java (con esemp...
PodoBulge
Livello 31
Минск

Come inviare un'e-mail da un'applicazione Java (con esempio)

Pubblicato nel gruppo Random-IT
L'invio di un'e-mail da un'applicazione Java è un requisito comune. Non importa se stai lavorando su un'applicazione Java principale, un'applicazione Web o un'applicazione Java aziendale, potresti dover inviare un'e-mail per avvisare il personale di supporto degli errori o semplicemente inviare un'e-mail agli utenti al momento della registrazione, reimpostare la password o chiedere loro di confermare l'indirizzo e-mail dopo la registrazione. Esistono molti scenari in cui è necessaria la possibilità di inviare e-mail da un'applicazione Java. Come inviare un'e-mail da un'applicazione Java (con esempio) - 1Nelle applicazioni già pronte hai già un modulo o una libreria che funziona con tutte le funzionalità per l'invio di email, come la possibilità di inviare allegati, immagini, comprese firme e rich text nelle email, MA se hai bisogno di scrivere qualcosa da zero, allora l'API Java Mail è un'ottima opzione. In questo articolo impareremo come inviare e-mail da un'applicazione Java utilizzando l'API di posta ( javax.mail ). Prima di scrivere codice dovresti conoscere alcune nozioni di base su come funziona la posta elettronica, ad esempio hai bisogno di un server SMTP (Simple Mail Transfer Protocol) . Se stai eseguendo la tua applicazione Java su Linux, dovresti sapere che il demone SMTP utilizza la porta 25. Puoi utilizzare qualsiasi server di posta per inviare messaggi utilizzando Java, inclusi server di posta pubblici come GMail, Yahoo o qualsiasi altro fornitore di servizi, tutti ciò di cui hai bisogno sono i dettagli del server SMTP , come nome host, porta, parametri di connessione, ecc. Puoi anche utilizzare SSL ( secure sockets layer ), TLS ( Transport Layer Security ) per connetterti in modo sicuro e inviare e-mail, ma abbiamo reso questo esempio semplice e focalizzato sulla logica minima per l'invio di lettere da un'applicazione Java. Nei prossimi articoli impareremo come inviare un'e-mail utilizzando gli allegati, come inviare un'e-mail in formato HTML, come allegare immagini a un'e-mail, come utilizzare l'autenticazione SSL per connettersi al server GMail e inviare e-mail, ecc. Ora, comprendiamo (discutiamo) questo semplice esempio di API Java Mail .

Esempio di codice Java per l'invio di un'e-mail

Per inviare una lettera da un programma Java, avrai bisogno di Java Mail API e Java Activation Framework (JAF) ; per essere più precisi, avrai bisogno di mail-1.4.5.jar , smtp-1.4.4.jar e activation-1.1.jar . È necessario scaricare questi file JAR e includerli nel Classpath per eseguire questo programma. In alternativa, puoi utilizzare Maven per la gestione delle dipendenze e includere lì tutte le dipendenze. Una volta che hai tutti questi file JAR, segui semplicemente i passaggi seguenti per creare e inviare un'e-mail utilizzando Java.
  1. Crea un oggetto Sessionchiamando Session.getDefaultInstance(properties), dove properties- contiene tutte le proprietà importanti, ad esempio il nome host del server SMTP.

  2. Creare un oggetto MimeMessagepassandogli l'oggetto Sessionottenuto nel passaggio precedente. Abbiamo una serie di proprietà diverse in questo oggetto come destinatario dell'e-mail, oggetto, corpo del messaggio, allegati, ecc.

  3. Usalo javax.mail.Transportper inviare un'e-mail chiamando un metodo statico send(email), dove email può essere un oggetto MimeMessage.

Il numero di proprietà che passi per creare un oggetto Sessionvaria a seconda del tipo di server SMTP, ad esempio, se stai utilizzando un server SMTP che non richiede alcuna autenticazione, puoi creare un oggetto Sessioncon una sola proprietà, ad esempio, smtp .mail.host e non è necessario specificare la porta perché ha la porta 25 per impostazione predefinita. D'altra parte, se ti connetti a un server SMTP che richiede l'autenticazione TLS o SSL, come l'host SMTP di GMail, devi fornire alcune proprietà in più, come mail.smtp.port=547 per TLS e posta. smtp.porta=457 per SSL. Questo è un programma Java completo che si connette a un server SMTP standard senza autenticazione e invia un messaggio di testo utilizzando l'API Java Mail.

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(); } 

     } 

}
Output: puoi compilare ed eseguire questo programma per inviare una semplice email da un programma Java:

$ javac EmailSender.java
$ java EmailSender
E-mail inviata con successo.... Come puoi vedere, è molto semplice inviare e-mail da un programma Java. Una volta creato l'oggetto MimeMessage, è necessario aggiungere i destinatari, che possono essere specificati nei campi TO, CC, BCC. Terminato con i destinatari, bisogna specificare l'oggetto della lettera, e, infine, il contenuto della lettera stessa richiamando il metodo message.setText(); Se si desidera inviare più invii, è possibile utilizzare i seguenti metodi per specificare i destinatari:

void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
È possibile aggiungere persone al campo TOutilizzando Message.RecipientType.TO, al campo CCutilizzando Message.RecipientType.CCe a BCC- Message.RecipientType.BCC.

Errori ed eccezioni

Quando molti programmatori Java iniziano a scrivere un programma per inviare un'e-mail, si imbattono in un errore perché la maggior parte di loro pensa che mail.jar e activation.jar saranno sufficienti per inviare un'e-mail da un'applicazione Java, ma non è così, soprattutto se invii e-mail tramite un server SMTP locale in Linux. Se esegui questo programma solo con mail.jar e attivazione.jar nel tuo CLASSPATH, molto probabilmente riceverai questo errore.

Eccezione 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
Sebbene la soluzione a questo errore sia molto semplice, può confonderti. java.net.ConnectException: Connection refused: connectDi solito si blocca quando il server non funziona o la porta a cui ti stai connettendo è specificata in modo errato. Soluzione: oltre a mail-1.4.5.jar, sono necessari anche smtp-1.4.4.jar e attivazione-1.1.jar.

Eccezione 2:

Questo è un altro errore chiamato NoClassDefFoundError, che di solito si riferisce a un file JAR mancante in 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)
Soluzione: sono riuscito a risolvere il mio problema, era dovuto a un Classpath errato. Anche se avevo tutti e tre i JAR richiesti, un file di classe Java per il programma nella stessa directory, e avevo eseguito il programma da lì, Java non riusciva a capirlo. Ho provato i seguenti comandi e il programma ha funzionato correttamente:

java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
E-mail inviata con successo.... Tieni presente che la directory corrente è contrassegnata con un punto alla fine dell'argomento Classpath. Dato che eseguivo il programma su Linux, ho usato i due punti (:) invece del punto e virgola (;) (come in Windows). Questo è tutto su come inviare un'e-mail da un'applicazione Java utilizzando l'API di posta. Potresti trovarlo molto semplice, poiché non hai bisogno di più di tre file JAR. È molto più semplice se usi Gradle o Maven per gestire le dipendenze. Nei seguenti tutorial vedremo esempi più complessi dell'API Java Mail per l'invio di e-mail con allegati, con immagini ed e-mail ben formattate per l'invio di report e tabelle. Traduzione dell'articolo: Come inviare e-mail dal programma Java con esempio
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION