JavaRush /Java-Blog /Random-DE /So senden Sie eine E-Mail aus einer Java-Anwendung (mit B...
PodoBulge
Level 31
Минск

So senden Sie eine E-Mail aus einer Java-Anwendung (mit Beispiel)

Veröffentlicht in der Gruppe Random-DE
Das Senden einer E-Mail aus einer Java-Anwendung ist eine häufige Anforderung. Es spielt keine Rolle, ob Sie an einer Java-Kernanwendung, einer Webanwendung oder einer Java-Unternehmensanwendung arbeiten. Möglicherweise müssen Sie eine E-Mail senden, um das Support-Personal auf Fehler aufmerksam zu machen, oder einfach bei der Registrierung eine E-Mail an Benutzer senden. Setzen Sie ihr Passwort zurück oder bitten Sie sie, die E-Mail-Adresse nach der Registrierung zu bestätigen. Es gibt viele Szenarien, in denen Sie die Möglichkeit benötigen, E-Mails von einer Java-Anwendung aus zu versenden. So senden Sie eine E-Mail aus einer Java-Anwendung (mit Beispiel) - 1In vorgefertigten Anwendungen verfügen Sie bereits über ein Modul oder eine Bibliothek, die alle Funktionen zum Versenden von E-Mails bietet, z. B. die Möglichkeit, Anhänge, Bilder, einschließlich Signaturen und Rich Text in E-Mails zu senden. ABER wenn Sie etwas von Grund auf neu schreiben müssen, Dann ist die Java Mail API eine großartige Option. In diesem Artikel erfahren Sie, wie Sie E-Mails aus einer Java-Anwendung mithilfe der Mail-API ( javax.mail ) versenden. Bevor Sie Code schreiben, sollten Sie einige Grundlagen der Funktionsweise von E-Mail kennen. Beispielsweise benötigen Sie einen SMTP- Server (Simple Mail Transfer Protocol) . Wenn Sie Ihre Java-Anwendung unter Linux ausführen, sollten Sie wissen, dass der SMTP-Daemon Port 25 verwendet . Sie können jeden Mailserver zum Senden von Nachrichten mit Java verwenden, einschließlich öffentlicher Mailserver wie GMail, Yahoo oder andere Dienstanbieter Sie benötigen die Details zum SMTP-Server , z. B. Hostname, Port, Verbindungsparameter usw. Sie können auch SSL ( Secure Sockets Layer ) und TLS ( Transport Layer Security ) verwenden, um eine sichere Verbindung herzustellen und E-Mails zu senden. Wir haben dieses Beispiel jedoch einfach gehalten und uns auf eine minimale Logik zum Senden von Briefen aus einer Java-Anwendung konzentriert. In zukünftigen Artikeln erfahren Sie, wie Sie eine E-Mail mit Anhängen versenden, wie Sie eine E-Mail im HTML-Format versenden, wie Sie Bilder an eine E-Mail anhängen, wie Sie mithilfe der SSL-Authentifizierung eine Verbindung zum GMail-Server herstellen und E-Mails senden usw. Lassen Sie uns nun dieses einfache Java Mail-API- Beispiel verstehen (diskutieren) .

Beispiel-Java-Code zum Versenden einer E-Mail

Um einen Brief aus einem Java-Programm zu versenden, benötigen Sie die Java Mail API und das Java Activation Framework (JAF) ; Genauer gesagt benötigen Sie mail-1.4.5.jar , smtp-1.4.4.jar und activate-1.1.jar . Sie müssen diese JAR-Dateien herunterladen und in Ihren Classpath aufnehmen, um dieses Programm auszuführen. Alternativ können Sie Maven für das Abhängigkeitsmanagement verwenden und dort alle Abhängigkeiten einbinden. Sobald Sie alle diese JAR-Dateien haben, befolgen Sie einfach die folgenden Schritte, um eine E-Mail mit Java zu erstellen und zu versenden.
  1. Erstellen Sie ein Objekt , Sessionindem Sie aufrufen Session.getDefaultInstance(properties), wobei properties- alle wichtigen Eigenschaften enthält, beispielsweise den Hostnamen des SMTP-Servers.

  2. Erstellen Sie ein Objekt , indem Sie ihm das im vorherigen Schritt erhaltene MimeMessageObjekt übergeben . SessionWir haben in diesem Objekt eine Reihe verschiedener Eigenschaften wie E-Mail-Empfänger, Betreff, Nachrichtentext, Anhänge usw.

  3. Verwenden Sie es javax.mail.Transport, um eine E-Mail zu senden, indem Sie eine statische Methode aufrufen send(email), wobei E-Mail ein Objekt sein kann MimeMessage.

Die Anzahl der Eigenschaften, die Sie zum Erstellen eines Objekts übergeben, Sessionhängt vom Typ des SMTP-Servers ab. Wenn Sie beispielsweise einen SMTP-Server verwenden, der keine Authentifizierung erfordert, können Sie ein Objekt Sessionmit nur einer Eigenschaft erstellen, beispielsweise smtp .mail.host, und Sie müssen den Port nicht angeben, da er standardmäßig Port 25 hat. Wenn Sie hingegen eine Verbindung zu einem SMTP-Server herstellen, der eine TLS- oder SSL-Authentifizierung erfordert, wie z. B. der SMTP-Host von GMail, müssen Sie etwas mehr Eigenschaften angeben, z. B. mail.smtp.port=547 für TLS und E-Mail. smtp.port= 457 für SSL. Hierbei handelt es sich um ein vollständiges Java-Programm, das ohne Authentifizierung eine Verbindung zu einem Standard-SMTP-Server herstellt und über die Java Mail-API eine Textnachricht sendet.
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(); }

     }

}
Ausgabe: Sie können dieses Programm kompilieren und ausführen, um eine einfache E-Mail aus einem Java-Programm zu senden:
$ javac EmailSender.java
$ java EmailSender
E-Mail erfolgreich gesendet... Wie Sie sehen, ist es sehr einfach, E-Mails aus einem Java-Programm heraus zu versenden. Nachdem Sie das Objekt erstellt haben MimeMessage, müssen Sie Empfänger hinzufügen, die in den Feldern TO, CC, angegeben werden können BCC. Nachdem wir mit den Empfängern fertig sind, müssen wir den Betreff des Briefes und schließlich den Inhalt des Briefes selbst angeben, indem wir die Methode aufrufen message.setText(). Wenn Sie mehrere Mailings durchführen möchten, können Sie zur Angabe der Empfänger folgende Methoden nutzen:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Sie können dem Feld Personen hinzufügen , TOindem Sie Message.RecipientType.TO, zum Feld CCverwenden Message.RecipientType.CCund zu BCC- verwenden Message.RecipientType.BCC.

Fehler und Ausnahmen

Wenn viele Java-Programmierer zum ersten Mal damit beginnen, ein Programm zum Senden einer E-Mail zu schreiben, stoßen sie auf einen Fehler, weil die meisten von ihnen denken, dass mail.jar und activate.jar ausreichen, um eine E-Mail von einer Java-Anwendung aus zu senden, was nicht der Fall ist. insbesondere, wenn Sie E-Mails über einen lokalen SMTP-Server unter Linux senden. Wenn Sie dieses Programm nur mit mail.jar und activate.jar in Ihrem CLASSPATH ausführen, wird höchstwahrscheinlich dieser Fehler angezeigt.

Ausnahme 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
Obwohl die Lösung für diesen Fehler sehr einfach ist, kann sie Sie verwirren. java.net.ConnectException: Connection refused: connectEs stürzt normalerweise ab, wenn der Server nicht funktioniert oder der Port, zu dem Sie eine Verbindung herstellen, falsch angegeben ist. Lösung: Zusätzlich zu mail-1.4.5.jar benötigen Sie auch smtp-1.4.4.jar und activate-1.1.jar.

Ausnahme 2:

Dies ist ein weiterer Fehler namens NoClassDefFoundError, der sich normalerweise auf eine fehlende JAR-Datei in Classpath bezieht
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)
Lösung: Ich konnte mein Problem lösen, es lag an einem falschen Klassenpfad. Obwohl ich alle drei erforderlichen JARs, eine Java-Klassendatei für das Programm, im selben Verzeichnis hatte und das Programm von dort aus ausführte, konnte Java es nicht herausfinden. Ich habe versucht, die folgenden Befehle einzugeben, und das Programm hat einwandfrei funktioniert:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
E-Mail erfolgreich gesendet... Bitte beachten Sie, dass das aktuelle Verzeichnis mit einem Punkt am Ende des Classpath-Arguments markiert ist. Da ich das Programm unter Linux ausgeführt habe, habe ich einen Doppelpunkt (:) anstelle eines Semikolons (;) (wie in Windows) verwendet. Hier erfahren Sie, wie Sie mithilfe der Mail-API eine E-Mail aus einer Java-Anwendung senden. Das dürfte für Sie sehr einfach sein, da Sie nicht mehr als drei JAR-Dateien benötigen. Es ist viel einfacher, wenn Sie Gradle oder Maven zum Verwalten von Abhängigkeiten verwenden. In den folgenden Tutorials sehen wir komplexere Beispiele der Java Mail-API zum Versenden von E-Mails mit Anhängen, mit Bildern und schön formatierten E-Mails zum Versenden von Berichten und Tabellen. Übersetzung des Artikels: So senden Sie E-Mails aus einem Java-Programm mit Beispiel
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION