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
Stwórz aplikację, która wyśle maila do wybranego odbiorcy z:
treścią formatowaną w HTML-u
dowolnym plikiem jako załącznik np. txt, png, jpg., pdf
wyślij wiadomość z osadzonym plikiem graficznym w wiadomości
uwzględnieniem odbiorców jako "Do wiadomości (DW)" i "Ukryty do wiadomości (UDW)"
Stwórz rozwiązanie, które pozwoli wysłać maila do wielu osób, bazując na jednym szablonie wiadomości
Stwórz aplikację, która odczyta listę katalogów i zwróci liczbę wiadomości w danym katalogu
Stwórz aplikację, która pozwoli użytkownikowi wybrać odpowiedni katalog i wyświetli po 20 wiadomości w postaci nadawca i tytuł.
Stwórz aplikację, która będzie filtrować wiadomości:
wyświetli wiadomości nie starsze niż 15 dni
pozwoli wyszukać wiadomości, które zawierają wybraną frazę w tytule
pozwoli wyszukać wisomości od konkretnego madawcy
Dodatkowa literatura
Last updated
