JavaMail-Beispiel – E-Mails in Java über SMTP senden

Heute werden wir uns ein JavaMail-Beispiel ansehen, um E-Mails in Java-Programmen zu versenden. Das Senden von E-Mails ist eine der häufigen Aufgaben in Anwendungen des realen Lebens, und deshalb stellt Java eine robuste JavaMail-API bereit, die wir verwenden können, um E-Mails über den SMTP-Server zu senden. Die JavaMail-API unterstützt sowohl TLS- als auch SSL-Authentifizierung zum Senden von E-Mails.

JavaMail-Beispiel

Heute werden wir lernen, wie man die JavaMail-API verwendet, um E-Mails über den SMTP-Server ohne Authentifizierung, mit TLS- und SSL-Authentifizierung sendet, und wie man Anhänge sendet und Bilder im E-Mail-Text einbindet. Für TLS- und SSL-Authentifizierung verwende ich den GMail-SMTP-Server, weil er beide unterstützt. Sie können auch entscheiden, einen Java-Mail-Server je nach den Anforderungen Ihres Projekts zu verwenden. Die JavaMail-API ist kein Bestandteil des standardmäßigen JDK, daher müssen Sie sie von der offiziellen Website herunterladen, d. h. von der JavaMail-Startseite. Laden Sie die neueste Version der JavaMail-Referenzimplementierung herunter und fügen Sie sie dem Build-Pfad Ihres Projekts hinzu. Der Name der JAR-Datei wird javax.mail.jar sein. Wenn Sie ein Maven-basiertes Projekt verwenden, fügen Sie einfach die untenstehende Abhängigkeit Ihrem Projekt hinzu.

<dependency>
	<groupId>com.sun.mail</groupId>
	<artifactId>javax.mail</artifactId>
	<version>1.5.5</version>
</dependency>

Das Java-Programm zum Senden von E-Mails enthält folgende Schritte:

  1. Erstellen des javax.mail.Session-Objekts
  2. Erstellen des javax.mail.internet.MimeMessage-Objekts; wir müssen verschiedene Eigenschaften in diesem Objekt setzen, wie die E-Mail-Adresse des Empfängers, den E-Mail-Betreff, die Antwort-E-Mail-Adresse, den E-Mail-Text, Anhänge usw.
  3. Verwendung von javax.mail.Transport zum Senden der E-Mail-Nachricht

Die Logik zur Erstellung der Sitzung unterscheidet sich je nach Typ des SMTP-Servers. Zum Beispiel, wenn der SMTP-Server keine Authentifizierung erfordert, können wir das Session-Objekt mit einigen einfachen Eigenschaften erstellen, während wenn er TLS- oder SSL-Authentifizierung erfordert, wird sich die Logik zur Erstellung unterscheiden. Daher werde ich eine Hilfsklasse mit einigen Hilfsmethoden erstellen, um E-Mails zu senden, und dann werde ich diese Hilfsmethode mit verschiedenen SMTP-Servern verwenden

JavaMail-Beispielprogramm

Unsere EmailUtil-Klasse, die eine einzige Methode zum Senden von E-Mails hat, sieht wie folgt aus. Sie benötigt javax.mail.Session und einige andere erforderliche Felder als Argumente. Um es einfach zu halten, sind einige der Argumente fest codiert, aber Sie können diese Methode erweitern, um sie zu übergeben oder sie aus einigen Konfigurationsdateien zu lesen.

package com.journaldev.mail;

import java.io.UnsupportedEncodingException;
import java.util.Date;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class EmailUtil {

	/**
	 * Utility method to send simple HTML email
	 * @param session
	 * @param toEmail
	 * @param subject
	 * @param body
	 */
	public static void sendEmail(Session session, String toEmail, String subject, String body){
		try
	    {
	      MimeMessage msg = new MimeMessage(session);
	      // Nachrichtenheader setzen
	      msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
	      msg.addHeader("format", "flowed");
	      msg.addHeader("Content-Transfer-Encoding", "8bit");

	      msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));

	      msg.setReplyTo(InternetAddress.parse("[email protected]", false));

	      msg.setSubject(subject, "UTF-8");

	      msg.setText(body, "UTF-8");

	      msg.setSentDate(new Date());

	      msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
	      System.out.println("Message is ready");
    	  Transport.send(msg);  

	      System.out.println("EMail Sent Successfully!!");
	    }
	    catch (Exception e) {
	      e.printStackTrace();
	    }
	}
}

Beachten Sie, dass ich einige Header-Eigenschaften in der MimeMessage setze. Sie werden von E-Mail-Clients verwendet, um die E-Mail-Nachricht ordnungsgemäß zu rendern und anzuzeigen. Der Rest des Programms ist einfach und selbsterklärend. Jetzt erstellen wir unser Programm, um E-Mails ohne Authentifizierung zu senden.

E-Mail in Java über SMTP ohne Authentifizierung senden

package com.journaldev.mail;

import java.util.Properties;

import javax.mail.Session;

public class SimpleEmail {
	
	public static void main(String[] args) {
		
	    System.out.println("SimpleEmail Start");
		
	    String smtpHostServer = "smtp.example.com";
	    String emailID = "[email protected]";
	    
	    Properties props = System.getProperties();

	    props.put("mail.smtp.host", smtpHostServer);

	    Session session = Session.getInstance(props, null);
	    
	    EmailUtil.sendEmail(session, emailID,"SimpleEmail Testing Subject", "SimpleEmail Testing Body");
	}

}

Beachten Sie, dass ich Session.getInstance() verwende, um das Session-Objekt zu erhalten, indem ich das Properties-Objekt übergebe. Wir müssen die Eigenschaft mail.smtp.host mit dem Host des SMTP-Servers festlegen. Wenn der SMTP-Server nicht auf dem Standardport (25) läuft, müssen Sie auch die Eigenschaft mail.smtp.port festlegen. Führen Sie dieses Programm einfach mit Ihrem nicht authentifizierten SMTP-Server aus und setzen Sie die Empfänger-E-Mail-Adresse auf Ihre eigene E-Mail-Adresse, und Sie erhalten die E-Mail sofort. Das Programm ist einfach zu verstehen und funktioniert gut, aber im wirklichen Leben verwenden die meisten SMTP-Server einige Formen der Authentifizierung wie TLS- oder SSL-Authentifizierung. Daher werden wir nun sehen, wie man ein Session-Objekt für diese Authentifizierungsprotokolle erstellt.

E-Mail in Java SMTP mit TLS-Authentifizierung senden

package com.journaldev.mail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class TLSEmail {

	/**
	   Outgoing Mail (SMTP) Server
	   requires TLS or SSL: smtp.gmail.com (use authentication)
	   Use Authentication: Yes
	   Port for TLS/STARTTLS: 587
	 */
	public static void main(String[] args) {
		final String fromEmail = "[email protected]"; //requires valid gmail id
		final String password = "mypassword"; // correct password for gmail id
		final String toEmail = "[email protected]"; // can be any email id 
		
		System.out.println("TLSEmail Start");
		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
		props.put("mail.smtp.port", "587"); //TLS Port
		props.put("mail.smtp.auth", "true"); //enable authentication
		props.put("mail.smtp.starttls.enable", "true"); //enable STARTTLS
		
                // Erstellen Sie ein Authenticator-Objekt, das an das Argument Session.getInstance übergeben wird
		Authenticator auth = new Authenticator() {
			// Überschreiben Sie die getPasswordAuthentication-Methode
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(fromEmail, password);
			}
		};
		Session session = Session.getInstance(props, auth);
		
		EmailUtil.sendEmail(session, toEmail,"TLSEmail Testing Subject", "TLSEmail Testing Body");
		
	}

	
}

Da ich den GMail-SMTP-Server verwende, der für alle zugänglich ist, können Sie die richtigen Variablen im obigen Programm einstellen und es selbst ausführen. Glauben Sie mir, es funktioniert!! 🙂

Java SMTP Beispiel mit SSL-Authentifizierung

package com.journaldev.mail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;

public class SSLEmail {

	/**
	   Outgoing Mail (SMTP) Server
	   requires TLS or SSL: smtp.gmail.com (use authentication)
	   Use Authentication: Yes
	   Port for SSL: 465
	 */
	public static void main(String[] args) {
		final String fromEmail = "[email protected]"; //requires valid gmail id
		final String password = "mypassword"; // correct password for gmail id
		final String toEmail = "[email protected]"; // can be any email id 
		
		System.out.println("SSLEmail Start");
		Properties props = new Properties();
		props.put("mail.smtp.host", "smtp.gmail.com"); //SMTP Host
		props.put("mail.smtp.socketFactory.port", "465"); //SSL Port
		props.put("mail.smtp.socketFactory.class",
				"javax.net.ssl.SSLSocketFactory"); //SSL Factory Class
		props.put("mail.smtp.auth", "true"); //Enabling SMTP Authentication
		props.put("mail.smtp.port", "465"); //SMTP Port
		
		Authenticator auth = new Authenticator() {
			// Überschreibe die getPasswordAuthentication-Methode
			protected PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication(fromEmail, password);
			}
		};
		
		Session session = Session.getDefaultInstance(props, auth);
		System.out.println("Session created");
	        EmailUtil.sendEmail(session, toEmail,"SSLEmail Testing Subject", "SSLEmail Testing Body");

	        EmailUtil.sendAttachmentEmail(session, toEmail,"SSLEmail Testing Subject with Attachment", "SSLEmail Testing Body with Attachment");

	        EmailUtil.sendImageEmail(session, toEmail,"SSLEmail Testing Subject with Image", "SSLEmail Testing Body with Image");

	}

}

Das Programm ist fast dasselbe wie die TLS-Authentifizierung, nur einige Eigenschaften sind unterschiedlich. Wie Sie sehen können, rufe ich einige andere Methoden aus der EmailUtil-Klasse auf, um Anhänge und Bilder per E-Mail zu senden, aber ich habe sie noch nicht definiert. Tatsächlich habe ich sie behalten, um sie später zu zeigen und den Anfang des Tutorials einfach zu halten.

JavaMail Beispiel – E-Mail in Java mit Anhang senden

Um eine Datei als Anhang zu senden, müssen wir ein Objekt von javax.mail.internet.MimeBodyPart und javax.mail.internet.MimeMultipart erstellen. Fügen Sie zunächst den Body-Teil für die Textnachricht in der E-Mail hinzu und verwenden Sie dann FileDataSource, um die Datei im zweiten Teil des mehrteiligen Body anzuhängen. Die Methode sieht wie folgt aus.

/**
 * Utility method to send email with attachment
 * @param session
 * @param toEmail
 * @param subject
 * @param body
 */
public static void sendAttachmentEmail(Session session, String toEmail, String subject, String body){
	try{
         MimeMessage msg = new MimeMessage(session);
         msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
	     msg.addHeader("format", "flowed");
	     msg.addHeader("Content-Transfer-Encoding", "8bit");
	      
	     msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));

	     msg.setReplyTo(InternetAddress.parse("[email protected]", false));

	     msg.setSubject(subject, "UTF-8");

	     msg.setSentDate(new Date());

	     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
	      
         // Erstelle den Nachrichtenteil
         BodyPart messageBodyPart = new MimeBodyPart();

         // Fülle die Nachricht
         messageBodyPart.setText(body);
         
         // Erstelle eine mehrteilige Nachricht für den Anhang
         Multipart multipart = new MimeMultipart();

         // Setze den Textnachrichtenteil
         multipart.addBodyPart(messageBodyPart);

         // Der zweite Teil ist der Anhang
         messageBodyPart = new MimeBodyPart();
         String filename = "abc.txt";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);

         // Sende die vollständigen Nachrichtenteile
         msg.setContent(multipart);

         // Sende die Nachricht
         Transport.send(msg);
         System.out.println("EMail Sent Successfully with attachment!!");
      }catch (MessagingException e) {
         e.printStackTrace();
      } catch (UnsupportedEncodingException e) {
		 e.printStackTrace();
	}
}

Das Programm mag auf den ersten Blick komplex aussehen, aber es ist einfach, einfach einen Textteil für die Nachricht und einen anderen Teil für den Anhang zu erstellen und sie dann dem Multipart hinzuzufügen. Sie können diese Methode erweitern, um auch mehrere Dateien anzuhängen.

JavaMail-Beispiel – E-Mail in Java mit Bild senden

Da wir eine HTML-Nachricht erstellen können, können wir, wenn sich die Bilddatei an einem Serverstandort befindet, das img-Element verwenden, um sie in der Nachricht anzuzeigen. Manchmal möchten wir jedoch das Bild in der E-Mail anhängen und es dann selbst im E-Mail-Text verwenden. Sie haben sicherlich schon viele E-Mails gesehen, die Bildanhänge enthalten und auch in der E-Mail-Nachricht verwendet werden. Der Trick besteht darin, die Bilddatei wie jeden anderen Anhang anzuhängen und dann den Content-ID-Header für die Bilddatei festzulegen und dieselbe Content-ID in der E-Mail-Nachricht mit <img src='cid:image_id'> zu verwenden.

/**
 * Utility method to send image in email body
 * @param session
 * @param toEmail
 * @param subject
 * @param body
 */
public static void sendImageEmail(Session session, String toEmail, String subject, String body){
	try{
         MimeMessage msg = new MimeMessage(session);
         msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
	     msg.addHeader("format", "flowed");
	     msg.addHeader("Content-Transfer-Encoding", "8bit");
	      
	     msg.setFrom(new InternetAddress("[email protected]", "NoReply-JD"));

	     msg.setReplyTo(InternetAddress.parse("[email protected]", false));

	     msg.setSubject(subject, "UTF-8");

	     msg.setSentDate(new Date());

	     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail, false));
	      
         // Nachrichtenteil erstellen
         BodyPart messageBodyPart = new MimeBodyPart();

         messageBodyPart.setText(body);
         
         // Mehrteilige Nachricht für Anhang erstellen
         Multipart multipart = new MimeMultipart();

         // Textnachrichtenteil festlegen
         multipart.addBodyPart(messageBodyPart);

         // Der zweite Teil ist der Bildanhang
         messageBodyPart = new MimeBodyPart();
         String filename = "image.png";
         DataSource source = new FileDataSource(filename);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         // Trick besteht darin, hier den Content-ID-Header hinzuzufügen
         messageBodyPart.setHeader("Content-ID", "image_id");
         multipart.addBodyPart(messageBodyPart);

         // Dritter Teil zum Anzeigen des Bildes im E-Mail-Text
         messageBodyPart = new MimeBodyPart();
         messageBodyPart.setContent("

Attached Image

" + "", "text/html"); multipart.addBodyPart(messageBodyPart); // Die mehrteilige Nachricht auf die E-Mail-Nachricht setzen msg.setContent(multipart); // Nachricht senden Transport.send(msg); System.out.println("EMail Sent Successfully with image!!"); }catch (MessagingException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } }

JavaMail-API-Fehlerbehebungstipps

  1. java.net.UnknownHostException tritt auf, wenn Ihr System die IP-Adresse des SMTP-Servers nicht auflösen kann. Möglicherweise ist sie falsch oder nicht aus Ihrem Netzwerk erreichbar. Zum Beispiel ist der GMail-SMTP-Server smtp.gmail.com, und wenn ich smtp.google.com verwende, erhalte ich diese Ausnahme. Wenn der Hostname korrekt ist, versuchen Sie, den Server über die Befehlszeile zu pingen, um sicherzustellen, dass er von Ihrem System aus erreichbar ist.

    pankaj@Pankaj:~/CODE$ ping smtp.gmail.com
    PING gmail-smtp-msa.l.google.com (74.125.129.108): 56 Datenbytes
    64 Bytes von 74.125.129.108: icmp_seq=0 ttl=46 Zeit=38,308 ms
    64 Bytes von 74.125.129.108: icmp_seq=1 ttl=46 Zeit=42,247 ms
    64 Bytes von 74.125.129.108: icmp_seq=2 ttl=46 Zeit=38,164 ms
    64 Bytes von 74.125.129.108: icmp_seq=3 ttl=46 Zeit=53,153 ms
    
  2. Wenn Ihr Programm im Aufruf der Transport send() Methode stecken bleibt, überprüfen Sie, ob der SMTP-Port korrekt ist. Wenn er korrekt ist, verwenden Sie Telnet, um zu überprüfen, ob er von Ihrem Computer aus erreichbar ist. Sie erhalten eine Ausgabe wie unten gezeigt.

    pankaj@Pankaj:~/CODE$ telnet smtp.gmail.com 587
    Trying 2607:f8b0:400e:c02::6d...
    Connected to gmail-smtp-msa.l.google.com.
    Escape character is '^]'.
    220 mx.google.com ESMTP sx8sm78485186pab.5 - gsmtp
    HELO
    250 mx.google.com at your service
    

Das ist alles für das JavaMail-Beispiel zum Senden von E-Mails in Java mit dem SMTP-Server unter Verwendung verschiedener Authentifizierungsprotokolle, Anhängen und Bildern. Ich hoffe, es wird alle Ihre Bedürfnisse für das Senden von E-Mails in Java-Programmen lösen.

Source:
https://www.digitalocean.com/community/tutorials/javamail-example-send-mail-in-java-smtp