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:
- Erstellen des
javax.mail.Session
-Objekts - 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. - 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
-
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
-
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