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. In 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.-
Erstellen Sie ein Objekt ,
Session
indem Sie aufrufenSession.getDefaultInstance(properties)
, wobeiproperties
- alle wichtigen Eigenschaften enthält, beispielsweise den Hostnamen des SMTP-Servers. -
Erstellen Sie ein Objekt , indem Sie ihm das im vorherigen Schritt erhaltene
MimeMessage
Objekt übergeben .Session
Wir haben in diesem Objekt eine Reihe verschiedener Eigenschaften wie E-Mail-Empfänger, Betreff, Nachrichtentext, Anhänge usw. -
Verwenden Sie es
javax.mail.Transport
, um eine E-Mail zu senden, indem Sie eine statische Methode aufrufensend(email)
, wobei E-Mail ein Objekt sein kannMimeMessage
.
Session
hängt vom Typ des SMTP-Servers ab. Wenn Sie beispielsweise einen SMTP-Server verwenden, der keine Authentifizierung erfordert, können Sie ein Objekt Session
mit 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 , TO
indem Sie Message.RecipientType.TO
, zum Feld CC
verwenden Message.RecipientType.CC
und 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: connect
Es 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 namensNoClassDefFoundError
, 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
GO TO FULL VERSION