JavaRush /Java блог /Random UA /Як надіслати лист із Java-додатку (з прикладом)
PodoBulge
31 рівень
Минск

Як надіслати лист із Java-додатку (з прикладом)

Стаття з групи Random UA
Надсилання електронного повідомлення з Java-програми це поширена вимога. Не має значення чи працюєш ти над core Java-додатком, веб-додатком або enterprise Java-додатком, тобі може знадобиться відправити лист для оповіщення персоналу з тех.підтримки про помилки, або просто відправити лист користувачам при реєстрації, відновити пароль або попросити їх підтвердити адресау електронної пошти після реєстрації. Є дуже багато сценаріїв, коли тобі потрібна можливість відправити електронні листи з Java-додатка. Як надіслати лист з Java-додатку (з прикладом) - 1У готових додатках у тебе вже є модуль або бібліотека, що працює з усіма функціями для надсилання електронних листів, наприклад, можливість відправляти вкладення, зображення, включаючи підписи та форматований текст в електронних листах, але якщо тобі потрібно написати щось з нуля, тоді Java Mail API це чудовий варіант. У цій статті ми навчимося як надсилати електронні листи з Java-програми, використовуючи поштовий API ( javax.mail ). Перед написанням коду ти повинен знати деякі основи роботи електронної пошти, наприклад, тобі потрібний сервер SMTP (простий протокол передачі пошти) . Якщо ти запускаєш свій Java-додаток під Linux, тоді ти маєш знати, що SMTP демон (прим. "комп'ютерна програма в системах класу UNIX, що запускається самою системою і працює у фоновому режимі без прямої взаємодії з користувачем") використовує порт 25. Ти можеш використовувати будь-який поштовий сервер для відправки повідомлень застосовуючи Java, включаючи загальнодоступні поштові сервери, такі як GMail, Yahoo або будь-який інший постачальник послуг, все, що вам потрібно, це деталі їх SMTP сервера , наприклад, ім'я хоста, порт, параметри з'єднання і т.д. Також ти можеш використовувати SSL ( англ. secure sockets layer — рівень захищених сокетів ), TLS ( англ. Transport Layer Security — безпека транспортного рівня)) для безпечного з'єднання та відправлення листів, але цей приклад ми зробабо простим і сфокусувалися на мінімальній логіці для надсилання листа з Java-програми. У подальших статтях ми навчимося як надсилати лист використовуючи вкладення, як відправляти форматований за допомогою HTML лист, як прикріпити зображення в лист, використовувати SSL автентифікацію для з'єднання з сервером GMail і надсилання листів і т.д. А тепер, давай зрозуміємо (розберемо) цей простий приклад Java Mail API .

Приклад Java-коду для надсилання електронного повідомлення

Для надсилання листа з Java-програми тобі потрібні Java Mail API та Java Activation Framework (JAF) ; якщо точніше, то тобі знадобляться mail-1.4.5.jar , smtp-1.4.4.jar , і activation-1.1.jar . Тобі потрібно завантажити ці JAR файли та включити їх у твій Classpath для запуску цієї програми. В якості альтернативи ти можеш використовувати Maven для керування залежностями та увімкнути всі залежності там. Як тільки у тебе будуть всі ці JAR файли, просто слідуй крокам нижче для створення та надсилання електронного листа за допомогою Java.
  1. Створи об'єкт Sessionвикликаючи Session.getDefaultInstance(properties), де propertiesмістить всі важливі властивості, наприклад, ім'я хоста SMTP сервера.

  2. Створи об'єкт MimeMessage, передаючи йому об'єкт Session, отриманий на попередньому кроці. Ми маємо набір різних властивостей у цьому об'єкті, таких як одержувач листи, тема, тіло повідомлення, вкладення і т.д.

  3. Використовуй javax.mail.Transportдля надсилання листа викликаючи статичний метод send(email), де email може бути об'єктом MimeMessage.

Кількість властивостей, які ти передаєш для створення об'єкта, Sessionзалежить від типу SMTP сервера, наприклад, якщо ти використовуєш SMTP сервер, який не вимагає жодної аутентифікації, ти можеш створити об'єкт Sessionтільки з однією властивістю, наприклад, smtp.mail.host, і тобі не потрібно вказувати порт, тому що він має порт 25 за промовчанням. З іншого боку, якщо ти підключаєшся до SMTP сервера, який вимагає TLS або SSL автентифікацію, наприклад, GMail's SMTP Host, тоді тобі потрібно надати трохи більше властивостей, наприклад, mail.smtp.port=547 для TLS та mail.smtp.port= 457 для SSL. Це закінчена Java-програма, яка з'єднується зі стандартним SMTP сервером без автентифікації та надсилає текстовий лист, використовуючи Java Mail API.
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(); }

     }

}
На виході : Ти можеш скомпілювати та запустити цю програму для надсилання простого електронного листа з Java-програми:
$ javac EmailSender.java
$ java EmailSender
Sent email successfully.... Як ти можеш бачити, дуже просто надсилати листи з Java-програми. Як тільки ти створив об'єкт MimeMessage, тобі потрібно додати одержувачів, які можуть бути вказані в полях TO, CC, BCC. Завершивши з одержувачами потрібно вказати тему листа, і, нарешті, сам зміст листа викликавши метод message.setText(); Якщо ти хочеш зробити множинну розсилку, тоді наступний метод може бути використаний для вказівки одержувачів:
void addRecipients(Message.RecipientType type, Address[] addresses) throws MessagingException
Ти можеш додати людей у ​​поле TOвикористовуючи Message.RecipientType.TO, в поле CCвикористовуючи Message.RecipientType.CC, і в BCC- Message.RecipientType.BCC.

Помилки та винятки

Коли багато Java-програмістів вперше починають писати програму для надсилання електронного листа, вони натикаються на помилку, тому що більшість з них думає, що mail.jar і activation.jar буде достатньо для відправки листа з Java-додатка, що не так, особливо якщо ти відправляєш имейл через локальний SMTP сервер у Linux. Якщо ти запускаєш цю програму тільки з mail.jar та activation.jar у твоєму CLASSPATH, ти найімовірніше отримаєш цю помилку.

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
Хоча рішення цієї помилки дуже просте, вона може заплутати вас. java.net.ConnectException: Connection refused: connectзазвичай вилітає, коли не працює сервер або невірно вказаний порт, яким ти з'єднуєшся. Рішення: крім mail-1.4.5.jar, тобі так само потрібні smtp-1.4.4.jar та activation-1.1.jar.

Exception 2:

Це інша помилка, яка називається NoClassDefFoundError, яка зазвичай відноситься до відсутнього JAR файлу в 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)
Рішення: Мені вдалося вирішити мою проблему, вона сталася через некоректний Classpath. Незважаючи на те, що у мене були всі три необхідні JAR, файл Java класу для програми в одній директорії і я запускав програму звідти, Java не змогла цього зрозуміти. Я спробував запровадити наступні команди і програма чудово заробила:
java -cp mail-1.4.5.jar:smtp-1.4.4.jar:activation-1.1.jar:. JavaMailSender
Sent email successfully.... Будь ласка, зверніть увагу, що поточна директорія відзначена точкою в кінці аргументу Classpath. Так як я запускав програму в Linux, я використовував двокрапку (:) замість крапки з комою (;) (як у Windows). Ось і все про те, як відправити імейл із Java-додатку використовуючи поштове API. Тобі може здатися це дуже простим, тому що не потрібно нічого більше, окрім трьох JAR файлів. Набагато простіше, якщо ти використовуєш Gradle чи Maven для керування залежностями. У наступних туторіалах ми побачимо складніші приклади Java Mail API для надсилання листів із вкладеннями, з картинками та красиво відформатованих листів для надсилання звітів та таблиць. Переклад статті: How to Send Email from Java Program with Example
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ