JavaRush /Blog Java /Random-PL /Jak wysłać wiadomość e-mail z aplikacji Java (z przykłade...
PodoBulge
Poziom 31
Минск

Jak wysłać wiadomość e-mail z aplikacji Java (z przykładem)

Opublikowano w grupie Random-PL
Wysyłanie wiadomości e-mail z aplikacji Java jest częstym wymogiem. Nie ma znaczenia, czy pracujesz nad podstawową aplikacją Java, aplikacją internetową czy aplikacją Java dla przedsiębiorstw, być może będziesz musiał wysłać wiadomość e-mail, aby powiadomić personel pomocy technicznej o błędach, lub po prostu wysłać wiadomość e-mail do użytkowników po rejestracji, zresetuj hasło lub poproś o potwierdzenie adresu e-mail po rejestracji. Istnieje wiele scenariuszy, w których potrzebna jest możliwość wysyłania wiadomości e-mail z aplikacji Java. Jak wysłać wiadomość e-mail z aplikacji Java (z przykładem) - 1W gotowych aplikacjach masz już moduł lub bibliotekę, która współpracuje ze wszystkimi funkcjami wysyłania e-maili, takimi jak możliwość wysyłania załączników, obrazów, w tym podpisów i tekstu sformatowanego w e-mailach, ALE jeśli potrzebujesz napisać coś od zera, wówczas Java Mail API jest świetną opcją. W tym artykule dowiemy się, jak wysyłać wiadomości e-mail z aplikacji Java za pomocą interfejsu API poczty ( javax.mail ). Przed napisaniem kodu powinieneś poznać pewne podstawy działania poczty e-mail, na przykład potrzebujesz serwera SMTP (Simple Mail Transfer Protocol) . Jeśli uruchamiasz aplikację Java w systemie Linux, powinieneś wiedzieć, że demon SMTP używa portu 25. Do wysyłania wiadomości przy użyciu Java możesz używać dowolnego serwera pocztowego, w tym publicznych serwerów pocztowych, takich jak GMail, Yahoo lub dowolnego innego usługodawcy, wszystkie potrzebujesz danych serwera SMTP , takich jak nazwa hosta, port, parametry połączenia itp. Możesz także użyć protokołu SSL ( warstwy bezpiecznych gniazd ), TLS ( Transport Layer Security ), aby bezpiecznie łączyć się i wysyłać wiadomości e-mail, ale uprościliśmy ten przykład i skupiliśmy się na minimalnej logice wysyłania listów z aplikacji Java. W przyszłych artykułach dowiemy się, jak wysłać wiadomość e-mail z załącznikami, jak wysłać wiadomość w formacie HTML, jak dołączyć obrazy do wiadomości e-mail, jak korzystać z uwierzytelniania SSL w celu łączenia się z serwerem Gmaila i wysyłania wiadomości e-mail itp. Teraz zrozummy (omówmy) ten prosty przykład API Java Mail .

Przykładowy kod Java do wysyłania wiadomości e-mail

Aby wysłać list z programu Java, będziesz potrzebować Java Mail API i Java Activation Framework (JAF) ; mówiąc dokładniej, będziesz potrzebować mail-1.4.5.jar , smtp-1.4.4.jar i aktywacja-1.1.jar . Aby uruchomić ten program, musisz pobrać te pliki JAR i umieścić je w ścieżce klas . Alternatywnie możesz użyć Mavena do zarządzania zależnościami i uwzględnić tam wszystkie zależności. Gdy już będziesz mieć wszystkie pliki JAR, po prostu wykonaj poniższe kroki, aby utworzyć i wysłać wiadomość e-mail przy użyciu języka Java.
  1. Utwórz obiekt Sessionwywołując Session.getDefaultInstance(properties), gdzie properties- zawiera wszystkie ważne właściwości, na przykład nazwę hosta serwera SMTP.

  2. Utwórz obiekt MimeMessage, przekazując mu obiekt Sessionuzyskany w poprzednim kroku. W tym obiekcie mamy zestaw różnych właściwości, takich jak odbiorca wiadomości e-mail, temat, treść wiadomości, załączniki itp.

  3. Użyj go javax.mail.Transportdo wysłania wiadomości e-mail, wywołując metodę statyczną send(email), w której wiadomość e-mail może być obiektem MimeMessage.

Liczba właściwości przekazywanych do utworzenia obiektu Sessionróżni się w zależności od typu serwera SMTP, na przykład, jeśli używasz serwera SMTP, który nie wymaga żadnego uwierzytelnienia, możesz utworzyć obiekt Sessionz tylko jedną właściwością, na przykład smtp. mail.host i nie musisz określać portu, ponieważ domyślnie ma on port 25. Z drugiej strony, jeśli łączysz się z serwerem SMTP wymagającym uwierzytelniania TLS lub SSL, takim jak host SMTP Gmaila, musisz podać trochę więcej właściwości, na przykład mail.smtp.port=547 dla TLS i poczty. smtp.port= 457 dla protokołu SSL. Jest to kompletny program Java, który łączy się ze standardowym serwerem SMTP bez uwierzytelniania i wysyła wiadomość tekstową za pomocą interfejsu 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(); }

     }

}
Dane wyjściowe: Możesz skompilować i uruchomić ten program, aby wysłać prostą wiadomość e-mail z programu Java:
$ javac EmailSender.java
$ java EmailSender
Wysłano wiadomość e-mail pomyślnie.... Jak widać, wysyłanie wiadomości e-mail z programu Java jest bardzo łatwe. Po utworzeniu obiektu MimeMessagenależy dodać odbiorców, których można określić w polach TO, CC, BCC. Po skończeniu z odbiorcami należy określić temat listu i w końcu treść samego listu wywołując metodę message.setText(); Jeśli chcesz przeprowadzić wiele wysyłek, możesz użyć następujących metod do określenia odbiorców:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Możesz dodawać osoby do pola TOza pomocą Message.RecipientType.TO, do pola CCza pomocą Message.RecipientType.CCi do BCC- Message.RecipientType.BCC.

Błędy i wyjątki

Kiedy wielu programistów Java zaczyna pisać program do wysyłania wiadomości e-mail, napotyka błąd, ponieważ większość z nich uważa, że ​​pliki mail.jar i aktywacja.jar wystarczą do wysłania wiadomości e-mail z aplikacji Java, co nie jest prawdą, zwłaszcza jeśli wysyłasz e-maile za pośrednictwem lokalnego serwera SMTP w systemie Linux. Jeśli uruchomisz ten program tylko z plikami mail.jar i aktywacja.jar w ścieżce klasy, najprawdopodobniej pojawi się ten błąd.

Wyjątek 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
Chociaż rozwiązanie tego błędu jest bardzo proste, może Cię zdezorientować. java.net.ConnectException: Connection refused: connectZwykle ulega awarii, gdy serwer nie działa lub port, z którym się łączysz, jest niepoprawnie określony. Rozwiązanie: oprócz mail-1.4.5.jar potrzebujesz także smtp-1.4.4.jar i aktywacja-1.1.jar.

Wyjątek 2:

Jest to kolejny błąd o nazwie NoClassDefFoundError, który zwykle odnosi się do brakującego pliku JAR w ścieżce klas
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)
Rozwiązanie: Udało mi się rozwiązać mój problem, jego przyczyną była nieprawidłowa ścieżka klasy. Mimo że miałem wszystkie trzy wymagane pliki JAR i plik klasy Java dla programu w tym samym katalogu i stamtąd uruchomiłem program, Java nie mogła tego rozgryźć. Wypróbowałem następujące polecenia i program działał dobrze:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
Wysłano wiadomość e-mail pomyślnie.... Należy pamiętać, że bieżący katalog jest oznaczony kropką na końcu argumentu Classpath. Ponieważ program uruchamiałem na Linuksie, użyłem dwukropka (:) zamiast średnika (;) (jak w Windows). Wszystko o wysyłaniu wiadomości e-mail z aplikacji Java przy użyciu interfejsu API poczty. Może się to wydawać bardzo proste, ponieważ nie potrzebujesz więcej niż trzech plików JAR. Dużo łatwiej jest zarządzać zależnościami za pomocą Gradle lub Mavena. W kolejnych samouczkach zobaczymy bardziej złożone przykłady interfejsu API Java Mail do wysyłania wiadomości e-mail z załącznikami, zdjęciami oraz pięknie sformatowanych wiadomości e-mail do wysyłania raportów i tabel. Tłumaczenie artykułu: Jak wysłać e-mail z programu Java z przykładem
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION