Will man aus seiner Anwendung eine E-Mail versenden, so hat man mit Oracle Java die Möglichkeit sich das Package javax.mail zu Hilfe zu nehmen.
In diesem kleinen Tutorial möchte ich erläutern, wie man dieses Package mithilfe von Maven in ein Programm einbindet und über die Konsole eine E-Mail versenden kann.
Das Hauptaugenmerk liegt hierbei auf die Verwendung der Klassen, welche für das Versenden der E-Mails benötigt werden.
Importieren der Maven Dependency in die pom.xml.
Da ich für mein Projekt Maven verwende, geschieht das Einbinden von externen Sourcen über die Datei „pom.xml“.
<!-- Mail versand --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency>
Der gesamte Mailversand kann wie hier in nur einer Klasse mit wenig Quellcode erfolgen.
Als erstes benötigen wir die Konfiguration des E-Mailservers sowie die Benutzerdaten.
/** * Liefert die E-Mail Konfiguration für das versenden von E-Mails. * * @return - {@link Properties} das befüllte Properties Objekt. */ private static Properties getMailProperties() { // Die Properties der JVM holen Properties properties = System.getProperties(); // Postausgangsserver properties.setProperty("mail.smtp.host", "smtp.stefan-draeger-software.de"); // Benutzername properties.setProperty("mail.user", "benutzername"); // Passwort properties.setProperty("mail.password", "passwort"); // Einstellungen für die SSL Verschlüsselte übermittlung von E-Mails properties.put("mail.smtps.auth", "true"); properties.put("mail.smtps.**ssl.enable", "true"); properties.put("mail.smtps.**ssl.required", "true"); return properties; }
Da es in der heutigen Zeit wichtig ist seine Kommunikation zu verschlüsseln, übertrage ich meine E-Mails immer mit dem SSL Protokol. Sollten Sie den unverschlüsselte Transport wählen, so entfallen die Zeilen.
properties.put("mail.smtps.auth", "true"); properties.put("mail.smtps.**ssl.enable", "true"); properties.put("mail.smtps.**ssl.required", "true");
Nun benötigen wir noch eine Methode welche wir aufrufen können, um unsere E-Mail zu versenden.
Wir benötigen die Parameter
- Empfänger
- Betreff
- Text
- Datei Anhänge
public static void sendMail(String empfaenger, String betreff, String text, File... anhaenge) { // Versender der E-Mail String versender = "absender@mail.de"; // Erstellt ein Session Objekt mit der E-Mail Konfiguration Session session = Session.getDefaultInstance(getMailProperties()); // Optional, schreibt auf die Konsole / in das Log, die Ausgabe des // E-Mail Servers, dieses kann bei einer Fehleranalyse sehr Hilfreich // sein. session.setDebug(true); try { // Erstellt ein MimeMessage Objekt. MimeMessage message = new MimeMessage(session); // Setzt die E-Mail Adresse des Versenders in den E-Mail Header message.setFrom(new InternetAddress(versender)); // Setzt die E-Mail Adresse des Empfängers in den E-Mail Header // hier können beliegig viele E-Mail Adressen hinzugefügt werden message.addRecipient(Message.RecipientType.TO, new InternetAddress(empfaenger)); // Der Empfänger erhält eine Kopie dieser E-Mail // message.addRecipient(Message.RecipientType.CC, new InternetAddress(empfaenger)); // Der Empfänger erhält eine "Blindkopie" dieser E-Mail d.h. er sieht nicht wer diese E-Mail noch erhalten hat. // message.addRecipient(Message.RecipientType.BCC, new InternetAddress(empfaenger)); // Setzt den Betreff der E-Mail message.setSubject(betreff); // Setzt den Text (Body) der E-Mail message.setText(text); // E-Mail versenden Transport.send(message); } catch (MessagingException mex) { mex.printStackTrace(); } }
Dieses Beispiel kann man nun mit der Methode
sendMail("empfaenger@mail.de", "Hallo Welt!", "Text123", null);
aufrufen.
Wie nun aber zu erkennen ist, fehlt der Quellcode für Datei Anhänge. Für den fall der Datei mit einer E-Mail versendet werden soll ändert sich der Code nicht wesentlich.
Dieses wird folgendermaßen gelöst.
// Erstellen des "Containers" für die Nachricht BodyPart messageBodyPart = new MimeBodyPart(); // Setzen des Textes messageBodyPart.setText(text); // Erstellen eines Multipart Objektes für das ablegen des Textes Multipart multipart = new MimeMultipart(); // Setzen des Textes multipart.addBodyPart(messageBodyPart); for (File file : anhaenge) { // Erstellen eines Multipart Objektes für das ablegen einer Datei messageBodyPart = new MimeBodyPart(); // Den Pfad zu der Datei abrufen. String filename = file.getAbsolutePath(); // Eine Datenquelle für die Datei anlegen und dem BodyPart zuweisen DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); // Dem Mulipart Objekt den erstellen BodyPart hinzufügen // dieses wird für jede Datei benötig welche der E-Mail hinzugefügt werden soll. multipart.addBodyPart(messageBodyPart); } // Setzt den Inhalt der E-Mail, Text + Dateianhänge message.setContent(multipart);
Hier nun die gesamte Klasse zum Herunterladen