Lab - protokoły IMAP i SMTP

Protokoły sieciowe to zestawy reguł określających, w jaki sposób urządzenia w sieci komunikują się ze sobą. Każdy protokół ma określony cel i obsługuje konkretny rodzaj usług, np. pocztę elektroniczną, transfer plików czy przeglądanie stron WWW.

na tych laboratoriach omówimy trzy podstawowe protokoły: SMTP, IMAP.

Niezbędne biblioteki

wpis maven

<dependency>
    <groupId>com.sum.mail</groupId>
    <artifactId>jakarta.mail</artifactId>
    <version>2.0.1</version>
</dependency>

<dependency>
    <groupId>jakarta.activation</groupId>
    <artifactId>jakarta.activation-api</artifactId>
    <version>2.0.1</version>
</dependency>

wpis Grandle


implementation group: 'com.sun.mail', name: 'jakarta.mail', version: '2.0.1'
implementation group: 'jakarta.activation', name: 'jakarta.activation-api', version: '2.0.1'

pliki Jar

SMTP (Simple Mail Transfer Protocol)

  • Cel: służy do wysyłania wiadomości e-mail między klientem pocztowym a serwerem, oraz między serwerami pocztowymi.

  • Porty:

    • 25 (tradycyjnie, komunikacja serwer–serwer),

    • 587 (zalecany do wysyłki z klienta, z uwierzytelnianiem),

    • 465 (SMTP z SSL/TLS).

    Przedstawione porty są domyślnymi portami, każda z serwerów pocztowych może mieć specyfikację i konfigurację.

  • Cechy:

    • działa w modelu klient-serwer,

    • nie służy do odbierania poczty – tylko do wysyłki,

    • często wykorzystywany w połączeniu z innymi protokołami (POP3/IMAP).

  • Przykład: Kiedy wysyłasz maila z programu pocztowego (np. Thunderbird, Outlook), wiadomość jest przesyłana do serwera za pomocą SMTP.

Przykład kodu dla wysyłania e-maila - SMTP (JavaMail API)

Do obsługi poczty w Javie używa się biblioteki Jakarta Mail (dawniej JavaMail API). Przykład wysyłki prostego maila:

import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;

public class SendEmailSMTP {
    public static void main(String[] args) {
        // Przed uruchomieniek kodu proszę sprawdzić konfigurację 
        // serwera pocztowego
        String to = "odbiorca@example.com";      // adres odbiorcy
        String from = "twojemail@mail.com";     // adres nadawcy
        String host = "smtp.mail.com";          // serwer SMTP

        Properties props = new Properties();
        props.put("mail.smtp.host", host);    
        props.put("mail.smtp.port", "587");    // należy sprawdzić port
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true"); // TLS

        Session session = Session.getInstance(props, new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("twojemail@gmail.com", "twoje_haslo_aplikacji");
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
            message.setSubject("Test SMTP w Javie");
            message.setText("Cześć! To wiadomość wysłana przez SMTP w Javie.");

            Transport.send(message);
            System.out.println("Wiadomość wysłana pomyślnie!");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

IMAP (Internet Message Access Protocol)

  • Cel:

służy do odbierania i zarządzania wiadomościami e-mail przechowywanymi na serwerze.

  • Porty:

    • 143 (bez szyfrowania),

    • 993 (IMAP z SSL/TLS).

    Przedstawione porty są domyślnymi portami, każda z serwerów pocztowych może mieć specyfikację i konfigurację.

  • Cechy:

    • wiadomości pozostają na serwerze – użytkownik może je odczytać z wielu urządzeń (np. telefon, komputer, tablet),

    • obsługuje foldery i tagi,

    • wspiera synchronizację w czasie rzeczywistym.

  • Różnica względem POP3: POP3 pobiera maile na urządzenie i zazwyczaj je usuwa z serwera, natomiast IMAP przechowuje je centralnie na serwerze.

Przykład kodu Zarządzania mailami - IMAP (JavaMail API)

W Javie pobieranie i zarządzanie wiadomości e-mail odbywa się przy wykorzystaniu biblioteki Jakarta Mail (dawniej JavaMail API). Przykład pobierania wiadomości z głównego folderu.

import java.util.Properties; 
import jakarta.mail.*;

public class ReadEmailIMAP { 
    public static void main(String[] args) { 
        String host = "imap.example.com"; 
        String user = "twojemail@example.com"; 

        String password = "twoje_haslo_aplikacji";
        Properties props = new Properties();
        props.put("mail.store.protocol", "imaps");
        props.put("mail.imaps.host", host);
        props.put("mail.imaps.port", "993");
        props.put("mail.imaps.ssl.enable", "true");
        props.put("mail.imaps.timeout", "10000"); // ms

        try {
            Session session = Session.getDefaultInstance(props, null);
            Store store = session.getStore("imaps");
            store.connect(host, user, password);
    
            Folder inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
    
            Message[] messages = inbox.getMessages();
            for (int i = 0; i < messages.length; i++) {
                System.out.println((i+1) + ": " + messages[i].getSubject());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            inbox.close(false);
            store.close();
        }
    }
}

Proszę zwrócić uwagę na serwisy pocztowe, które posiadają podwójną autoryzację (2FA) w takich sytuacjach należy wykorzystać token OAuth2: najpierw dostaniesz access token, potem użyjesz go w połączeniu IMAP (SASL XOAUTH2).

Zadania

  1. Stwórz aplikację, która wyśle maila do wybranego odbiorcy z:

    1. treścią formatowaną w HTML-u

    2. dowolnym plikiem jako załącznik np. txt, png, jpg., pdf

    3. wyślij wiadomość z osadzonym plikiem graficznym w wiadomości

    4. uwzględnieniem odbiorców jako "Do wiadomości (DW)" i "Ukryty do wiadomości (UDW)"

  2. Stwórz rozwiązanie, które pozwoli wysłać maila do wielu osób, bazując na jednym szablonie wiadomości

  3. Stwórz aplikację, która odczyta listę katalogów i zwróci liczbę wiadomości w danym katalogu

  4. Stwórz aplikację, która pozwoli użytkownikowi wybrać odpowiedni katalog i wyświetli po 20 wiadomości w postaci nadawca i tytuł.

  5. Stwórz aplikację, która będzie filtrować wiadomości:

    1. wyświetli wiadomości nie starsze niż 15 dni

    2. pozwoli wyszukać wiadomości, które zawierają wybraną frazę w tytule

    3. pozwoli wyszukać wisomości od konkretnego madawcy

Dodatkowa literatura

Last updated