L'envoi d'un e-mail à partir d'une application Java est une exigence courante. Peu importe que vous travailliez sur une application Java principale, une application Web ou une application Java d'entreprise, vous devrez peut-être envoyer un e-mail pour alerter le personnel d'assistance des erreurs, ou simplement envoyer un e-mail aux utilisateurs lors de leur inscription. réinitialiser leur mot de passe ou leur demander de confirmer leur adresse e-mail après l'inscription. Il existe de nombreux scénarios dans lesquels vous avez besoin de pouvoir envoyer des e-mails à partir d'une application Java. Dans les applications prêtes à l'emploi, vous disposez déjà d'un module ou d'une bibliothèque qui fonctionne avec toutes les fonctionnalités d'envoi d'e-mails, telles que la possibilité d'envoyer des pièces jointes, des images, y compris des signatures et du texte enrichi dans les e-mails, MAIS si vous devez écrire quelque chose à partir de zéro, alors l'API Java Mail est une excellente option. Dans cet article, nous allons apprendre comment envoyer des emails depuis une application Java en utilisant l'API de messagerie ( javax.mail ). Avant d'écrire du code, vous devez connaître quelques bases sur le fonctionnement du courrier électronique, par exemple, vous avez besoin d'un serveur SMTP (Simple Mail Transfer Protocol) . Si vous exécutez votre application Java sous Linux, sachez que le démon SMTP utilise le port 25. Vous pouvez utiliser n'importe quel serveur de messagerie pour envoyer des messages à l'aide de Java, y compris les serveurs de messagerie publics tels que GMail, Yahoo ou tout autre fournisseur de services, tous vous avez besoin des détails de leur serveur SMTP , tels que le nom d'hôte, le port, les paramètres de connexion, etc. Vous pouvez également utiliser SSL ( Secure Sockets Layer ), TLS ( Transport Layer Security ) pour vous connecter et envoyer des e-mails en toute sécurité, mais nous avons rendu cet exemple simple et nous sommes concentrés sur une logique minimale pour l'envoi de lettres à partir d'une application Java. Dans les prochains articles, nous apprendrons comment envoyer un e-mail à l'aide de pièces jointes, comment envoyer un e-mail au format HTML, comment joindre des images à un e-mail, comment utiliser l'authentification SSL pour se connecter au serveur GMail et envoyer des e-mails, etc. Maintenant, comprenons (discutons) cet exemple simple d'API Java Mail .
Exemple de code Java pour envoyer un email
Pour envoyer une lettre depuis un programme Java, vous aurez besoin de l'API Java Mail et du Java Activation Framework (JAF) ; pour être plus précis, vous aurez besoin de mail-1.4.5.jar , smtp-1.4.4.jar et activation-1.1.jar . Vous devez télécharger ces fichiers JAR et les inclure dans votre Classpath pour exécuter ce programme. Alternativement, vous pouvez utiliser Maven pour la gestion des dépendances et y inclure toutes les dépendances. Une fois que vous disposez de tous ces fichiers JAR, suivez simplement les étapes ci-dessous pour créer et envoyer un e-mail en utilisant Java.-
Créez un objet
Session
en appelantSession.getDefaultInstance(properties)
, oùproperties
- contient toutes les propriétés importantes, par exemple le nom d'hôte du serveur SMTP. -
Créez un objet
MimeMessage
en lui passant l'objetSession
obtenu à l'étape précédente. Nous avons un ensemble de propriétés différentes dans cet objet telles que le destinataire de l'e-mail, le sujet, le corps du message, les pièces jointes, etc. -
Utilisez-le
javax.mail.Transport
pour envoyer un e-mail en appelant une méthode statiquesend(email)
, où l'e-mail peut être un objetMimeMessage
.
Session
diffère selon le type de serveur SMTP, par exemple, si vous utilisez un serveur SMTP qui ne nécessite aucune authentification, vous pouvez créer un objet Session
avec une seule propriété, par exemple smtp. mail.host, et vous n'avez pas besoin de spécifier le port car il a le port 25 par défaut. D'un autre côté, si vous vous connectez à un serveur SMTP qui nécessite une authentification TLS ou SSL, tel que l'hôte SMTP de GMail, vous devez alors fournir un peu plus de propriétés, par exemple mail.smtp.port=547 pour TLS et le courrier. smtp.port= 457 pour SSL. Il s'agit d'un programme Java complet qui se connecte à un serveur SMTP standard sans authentification et envoie un message texte à l'aide de l'API Java Mail.
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(); }
}
}
Sortie : Vous pouvez compiler et exécuter ce programme pour envoyer un simple e-mail à partir d'un programme Java :
$ javac EmailSender.java
$ java EmailSender
E-mail envoyé avec succès.... Comme vous pouvez le constater, il est très simple d'envoyer des e-mails à partir d'un programme Java. Une fois que vous avez créé l'objet MimeMessage
, vous devez ajouter des destinataires, qui peuvent être spécifiés dans les champs TO
, CC
, BCC
. Après avoir fini avec les destinataires, il faut préciser le sujet de la lettre, et enfin le contenu de la lettre elle-même en appelant la méthode message.setText()
; Si vous souhaitez effectuer plusieurs mailings, les méthodes suivantes peuvent être utilisées pour spécifier les destinataires :
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Vous pouvez ajouter des personnes au champ TO
en utilisant Message.RecipientType.TO
, au champ CC
en utilisant Message.RecipientType.CC
et à BCC
- Message.RecipientType.BCC
.
Erreurs et exceptions
Lorsque de nombreux programmeurs Java commencent à écrire un programme pour envoyer un email, ils rencontrent une erreur car la plupart d'entre eux pensent que mail.jar et activation.jar suffiront pour envoyer un email depuis une application Java, ce qui n'est pas le cas, surtout si vous envoyez des e-mails via un serveur SMTP local sous Linux. Si vous exécutez ce programme avec uniquement mail.jar et activation.jar dans votre CLASSPATH, vous obtiendrez probablement cette erreur.Exception 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
Bien que la solution à cette erreur soit très simple, elle peut vous dérouter. java.net.ConnectException: Connection refused: connect
Il plante généralement lorsque le serveur ne fonctionne pas ou que le port auquel vous vous connectez est mal spécifié. Solution : en plus de mail-1.4.5.jar, vous avez également besoin de smtp-1.4.4.jar et d'activation-1.1.jar.
Exception 2 :
Il s'agit d'une autre erreur appeléeNoClassDefFoundError
, qui fait généralement référence à un fichier JAR manquant dans Classpath.
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)
Solution : J'ai réussi à résoudre mon problème, c'était dû à un Classpath incorrect. Même si j'avais les trois fichiers JAR requis, un fichier de classe Java pour le programme dans le même répertoire, et que j'exécutais le programme à partir de là, Java n'arrivait pas à le comprendre. J'ai essayé de saisir les commandes suivantes et le programme a bien fonctionné :
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
E-mail envoyé avec succès.... Veuillez noter que le répertoire actuel est marqué d'un point à la fin de l'argument Classpath. Depuis que j'exécutais le programme sous Linux, j'ai utilisé un deux-points (:) au lieu d'un point-virgule (;) (comme sous Windows). Il s'agit de savoir comment envoyer un e-mail à partir d'une application Java à l'aide de l'API de messagerie. Vous trouverez peut-être cela très simple, puisque vous n’avez besoin de rien de plus que trois fichiers JAR. C'est beaucoup plus simple si vous utilisez Gradle ou Maven pour gérer les dépendances. Dans les didacticiels suivants, nous verrons des exemples plus complexes de l'API Java Mail pour l'envoi d'e-mails avec pièces jointes, avec images et d'e-mails magnifiquement formatés pour l'envoi de rapports et de tableaux. Traduction de l'article : Comment envoyer un e-mail à partir d'un programme Java avec un exemple
GO TO FULL VERSION