Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:mail [2025/01/14 15:08] jkonczak |
sk2:mail [2025/01/16 22:20] (aktualna) jkonczak [Komendy] |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
+ | <html> | ||
+ | <style> | ||
+ | code {white-space: pre-wrap} | ||
+ | pre.compact {line-height: 1em; padding: .25em .5em} | ||
+ | </style> | ||
+ | </html> | ||
+ | |||
=== Wyłączanie echo w terminalu === | === Wyłączanie echo w terminalu === | ||
Możesz dowiedzieć się który terminal jest używany przez twoją powłokę wykonując: | Możesz dowiedzieć się który terminal jest używany przez twoją powłokę wykonując: | ||
- | \\ | ||
''echo $TTY'' | ''echo $TTY'' | ||
+ | \\ | ||
W dowolnym momencie możesz z innego terminala wykonać komendę która spowoduje | W dowolnym momencie możesz z innego terminala wykonać komendę która spowoduje | ||
wyłączenie bądź włączenie wyświetlania wpisanych przez znaków: | wyłączenie bądź włączenie wyświetlania wpisanych przez znaków: | ||
Linia 24: | Linia 30: | ||
<html> | <html> | ||
- | <pre style="margin-top:-1.2em; line-height: 1em; padding: .25em .5em"> | + | <pre class="compact" style="margin-top:-1.2em"> |
<b>MAIL FROM:<</b>grey@cat.baz<b>></b> <span style="color:gray">\ envelope</span> | <b>MAIL FROM:<</b>grey@cat.baz<b>></b> <span style="color:gray">\ envelope</span> | ||
<b>RCPT TO:<</b>john@example.com<b>></b> <span style="color:gray">/ ("koperta")</span> | <b>RCPT TO:<</b>john@example.com<b>></b> <span style="color:gray">/ ("koperta")</span> | ||
Linia 105: | Linia 111: | ||
=== Wysłanie === | === Wysłanie === | ||
- | <html><pre style="line-height:1em;font-family:DejaVu Sans Mono;margin-bottom:0;margin-top:-1.2em"> | + | <html><pre class="compact" style="font-family:DejaVu Sans Mono;margin-bottom:0;margin-top:-1.2em"> |
- | ____ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ .------. | + | ____ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ .------. |
- | (mail) → │ MUA │-→-→-→│ MSA │-→-→-→│ MTA │-→-→-→│ MTA │-→-→-→│ MDA │ → (skrzynka) | + | (mail) → │ MUA │-→-→-→│ MSA │-→-→-→│ MTA │-→-→-→│ MTA │-→-→-→│ MDA │ → (skrzynka) |
- | ‾‾‾‾ └─────┘ SMTP └─────┘ SMTP └─────┘ SMTP └─────┘ SMTP └─────┘ `------‘ | + | ‾‾‾‾ └─────┘ SMTP └─────┘ SMTP └─────┘ SMTP └─────┘ SMTP └─────┘ `------‘ |
- | + | <div style="margin-top:-.5em"></div> | |
- | \____/ \_________________/ \____/ | + | \____/ \_________________/ \____/ |
- | wysłanie przekazanie dostarcznie | + | wysłanie przekazanie dostarcznie |
- | (submission) (relay) (delivery) | + | (submission) (relay) (delivery) |
</pre></html> | </pre></html> | ||
Podział MTA na MSA, MTA i MDA jest umowny. | Podział MTA na MSA, MTA i MDA jest umowny. | ||
Linia 134: | Linia 140: | ||
=== Odbieranie === | === Odbieranie === | ||
- | <html><pre style="line-height:1em;font-family:DejaVu Sans Mono;margin-bottom:0;margin-top:-1.2em"> | + | <html><pre class="compact" style="font-family:DejaVu Sans Mono;margin-bottom:0;margin-top:-1.2em"> |
.------. ┌─────┐ ┌─────────┐ | .------. ┌─────┐ ┌─────────┐ | ||
(skrzynka) ← │ MAA │ ← ← ← │ MRA/MUA │ | (skrzynka) ← │ MAA │ ← ← ← │ MRA/MUA │ | ||
Linia 149: | Linia 155: | ||
<html><div style="margin-top:-1.2em"></div></html> | <html><div style="margin-top:-1.2em"></div></html> | ||
- serwer przesyła do świeżo połączonego klienta powitanie zaczynające się od kodu ''220'' | - serwer przesyła do świeżo połączonego klienta powitanie zaczynające się od kodu ''220'' | ||
- | - klient przedstawia się komendą ''EHLO //nazwa_domenowa//'' (<small>lub starszym ''HELO //nazwa_domenowa//''</small>) i czeka na akceptację serwera | + | - klient przedstawia się komendą ''**EHLO** //nazwa_domenowa//'' (<small>lub starszym ''HELO //nazwa_domenowa//''</small>) i czeka na akceptację serwera |
- | - klient może poprosić o uwierzytelnienie komendą ''AUTH //metoda//'' \\ (w wynikach komendy ''EHLO'' podane są wspierane przez serwer metody, <small>lista ustandaryzowanych metod jest [[https://www.iana.org/assignments/sasl-mechanisms|tutaj]]</small>) | + | - klient może poprosić o uwierzytelnienie komendą ''**AUTH** //metoda//'' \\ (w wynikach komendy ''EHLO'' podane są wspierane przez serwer metody, <small>lista ustandaryzowanych metod jest [[https://www.iana.org/assignments/sasl-mechanisms|tutaj]]</small>) |
* po wykonaniu ''AUTH //metoda//'' klient musi poczekać na odpowiedź \\ serwer zwróci albo kod 5xx określający że się nie zgadza, albo odpowiedź spodziewaną w wybranej metodzie | * po wykonaniu ''AUTH //metoda//'' klient musi poczekać na odpowiedź \\ serwer zwróci albo kod 5xx określający że się nie zgadza, albo odpowiedź spodziewaną w wybranej metodzie | ||
* serwer zwykle pozwala na uwierzytelnienie tylko jeżeli nawiązano z nim bezpieczne połączenie (TLS) | * serwer zwykle pozwala na uwierzytelnienie tylko jeżeli nawiązano z nim bezpieczne połączenie (TLS) | ||
* w powszechnie używanej metodzie ''AUTH PLAIN'': | * w powszechnie używanej metodzie ''AUTH PLAIN'': | ||
* serwer odsyła kod 334 i czeka na dane uwierzytelniające | * serwer odsyła kod 334 i czeka na dane uwierzytelniające | ||
- | * klient musi przesłać nazwę użytkownika i hasło zapisane jako ''\0//użytkownik//\0//hasło//'' i zakodowane w base64 \\ <small>aby przygotować dane dla metody //PLAIN//, możesz wykonać: \\ ''echo -n "User:"; read -rs U; echo -n "\nPass:"; read -rs P; echo; printf "\0%s\0%s" "$U" "$P" | base64''</small> | + | * klient musi przesłać nazwę użytkownika i hasło zapisane jako ''\0//użytkownik//\0//hasło//'' i zakodowane w base64 \\ <small>aby przygotować dane dla metody //PLAIN//, możesz wykonać: \\ ''echo -n "User: ";read U;echo -n "Pass:";read -rs P;echo;printf "\0%s\0%s" "$U" "$P"|base64''</small> |
* serwer po udanym uwierzytelnieniu odsyła odpowiedź z kodem 235 | * serwer po udanym uwierzytelnieniu odsyła odpowiedź z kodem 235 | ||
- | - klient wysyła informację o nadawcy maila komendą ''MAIL FROM://nadawca//'' i czeka na akceptację serwera | + | - klient wysyła informację o nadawcy maila komendą ''**MAIL FROM**:<//nadawca//>'' i czeka na akceptację serwera |
- | - klient wysyła informację o jednym odbiorcy maila komendą ''RCPT TO://odbiorca//'' i czeka na akceptację serwera | + | - klient wysyła informację o jednym odbiorcy maila komendą ''**RCPT TO**:<//odbiorca//>'' i czeka na akceptację serwera |
- klient może wskazać kolejnego odbiorcę powtarzając komendę //RCPT TO// z kolejnymi adresami | - klient może wskazać kolejnego odbiorcę powtarzając komendę //RCPT TO// z kolejnymi adresami | ||
- | - klient zgłasza że chce podać treść maila komendą ''DATA'' i czeka na odpowiedź od serwera (354) | + | - klient zgłasza że chce podać treść maila komendą ''**DATA**'' i czeka na odpowiedź od serwera (354) |
- klient podaje treść maila, zakończoną liną składającą się z kropki \\ <small>jeżeli linia zaczyna się od kropki, to serwer usuwa tą kropkę; dlatego żeby wysłać maila z linią złożoną z kropki, można podać ''..''</small> | - klient podaje treść maila, zakończoną liną składającą się z kropki \\ <small>jeżeli linia zaczyna się od kropki, to serwer usuwa tą kropkę; dlatego żeby wysłać maila z linią złożoną z kropki, można podać ''..''</small> | ||
- po odebraniu ''\r\n.\r\n'' serwer wysyła akceptację do klienta | - po odebraniu ''\r\n.\r\n'' serwer wysyła akceptację do klienta | ||
Linia 173: | Linia 179: | ||
| | ||
Przykład komunikacji: | Przykład komunikacji: | ||
- | <html><div style="margin-top:-1.2em"></div></html> | + | <html><pre class="compact" style="margin-top:-1.2em"> |
- | <html><pre> | + | |
<span style="color:#007">220 example.org ESMTP</span> | <span style="color:#007">220 example.org ESMTP</span> | ||
<span style="color:#700">EHLO sub.domain.baz</span> | <span style="color:#700">EHLO sub.domain.baz</span> | ||
Linia 184: | Linia 189: | ||
<span style="color:#700">AHVzZXIAcGFzc3dvcmQ=</span> | <span style="color:#700">AHVzZXIAcGFzc3dvcmQ=</span> | ||
<span style="color:#007">235 Authentication succeeded</span> | <span style="color:#007">235 Authentication succeeded</span> | ||
- | <span style="color:#700">MAIL FROM:user@example.org</span> | + | <span style="color:#700">MAIL FROM:<user@example.org></span> |
<span style="color:#007">250 OK</span> | <span style="color:#007">250 OK</span> | ||
- | <span style="color:#700">RCPT TO:friend@example.org</span> | + | <span style="color:#700">RCPT TO:<friend@example.org></span> |
<span style="color:#007">250 Accepted</span> | <span style="color:#007">250 Accepted</span> | ||
- | <span style="color:#700">RCPT TO:mellon@doriath.mi</span> | + | <span style="color:#700">RCPT TO:<mellon@doriath.mi></span> |
<span style="color:#007">250 Accepted</span> | <span style="color:#007">250 Accepted</span> | ||
<span style="color:#700">DATA</span> | <span style="color:#700">DATA</span> | ||
Linia 210: | Linia 215: | ||
==== Porty używane przez SMTP ==== | ==== Porty używane przez SMTP ==== | ||
- | SMTP używa portów: | + | SMTP używa portów TCP: |
* 25 (''smtp'') do nieszyfrowanych połączeń | * 25 (''smtp'') do nieszyfrowanych połączeń | ||
* <small>25 (''smtp'') do szyfrowanych połączeń (TLS), ustanawianych po użyciu komendy ''STARTTLS'' na nieszyfrowanym połączeniu</small> | * <small>25 (''smtp'') do szyfrowanych połączeń (TLS), ustanawianych po użyciu komendy ''STARTTLS'' na nieszyfrowanym połączeniu</small> | ||
Linia 228: | Linia 233: | ||
<small> | <small> | ||
- | Połączenie od razu z szyfrowania można wykonać np. programem ''socat'' lub ''openssl'': | + | |
+ | Połączenie od razu z szyfrowaniem można wykonać np. programem ''socat'' lub ''openssl'': | ||
\\ | \\ | ||
''socat ssl://adres_serwera//:smtps,crlf readline'' \\ | ''socat ssl://adres_serwera//:smtps,crlf readline'' \\ | ||
''openssl s_client -quiet -verify_quiet -crlf //adres_serwera//:smtps'' | ''openssl s_client -quiet -verify_quiet -crlf //adres_serwera//:smtps'' | ||
+ | |||
</small> | </small> | ||
Linia 242: | Linia 249: | ||
z serwerem SMTP po podaniu komendy: | z serwerem SMTP po podaniu komendy: | ||
\\ | \\ | ||
- | ''openssl s_client -quiet -verify_quiet -crlf -starttls smtp //adres_serwera//:submission'' | + | ''openssl s_client -quiet -verify_quiet -crlf **-starttls smtp** //adres_serwera//:**submission**'' |
\\ | \\ | ||
<small>Można też wskazać własną nazwę wpisywaną do komendy EHLO przez: \\ | <small>Można też wskazać własną nazwę wpisywaną do komendy EHLO przez: \\ | ||
Linia 294: | Linia 301: | ||
* wysyła komendę ''USER //nazwa//'' i komendę ''PASS //hasło//'' | * wysyła komendę ''USER //nazwa//'' i komendę ''PASS //hasło//'' | ||
* wysyła komendę ''AUTH //metoda//'' (podobnie jak dla SMTP), np. ''AUTH PLAIN'', po której wysyła dane uwierzytelniające | * wysyła komendę ''AUTH //metoda//'' (podobnie jak dla SMTP), np. ''AUTH PLAIN'', po której wysyła dane uwierzytelniające | ||
- | - klient wysyła komendę ''LIST'' (lub opcjonalnie wspierane ''UIDL'') i dostaje listę numerów wiadomości (lub listę numerów wraz z unikalnym identyfikatorem wiadomości) | + | - klient wysyła komendę ''LIST'' i dostaje listę numerów wiadomości \\ lub komendę ''UIDL'' zwracającą listę numerów wraz z unikalnym identyfikatorem wiadomości |
- klient wysyła komendę ''RETR //numer//'' pobierającą wiadomość o podanym numerze (tyle razy ile potrzebuje) | - klient wysyła komendę ''RETR //numer//'' pobierającą wiadomość o podanym numerze (tyle razy ile potrzebuje) | ||
- klient wysyła komendę ''DELE //numer//'' zaznaczając wiadomość o podanym numerze jako do usunięcia (tyle razy ile potrzebuje) | - klient wysyła komendę ''DELE //numer//'' zaznaczając wiadomość o podanym numerze jako do usunięcia (tyle razy ile potrzebuje) | ||
Linia 305: | Linia 312: | ||
pobierającą nagłówki i pierwsze //N// linii treści wiadomości (''TOP'') oraz | pobierającą nagłówki i pierwsze //N// linii treści wiadomości (''TOP'') oraz | ||
wyświetlającą które z opcjonalnych funkcji są wspierane przez serwer (''CAPA''). | wyświetlającą które z opcjonalnych funkcji są wspierane przez serwer (''CAPA''). | ||
+ | \\ | ||
<small>Więcej w RFC [[https://datatracker.ietf.org/doc/html/rfc1939|dla POP3]] | <small>Więcej w RFC [[https://datatracker.ietf.org/doc/html/rfc1939|dla POP3]] | ||
i [[https://datatracker.ietf.org/doc/html/rfc2449|rozszerzeń do POP3]].</small> | i [[https://datatracker.ietf.org/doc/html/rfc2449|rozszerzeń do POP3]].</small> | ||
Linia 319: | Linia 326: | ||
usunął je z serwera zwalniając miejsce na kolejne maile. Tworząc ten protokół | usunął je z serwera zwalniając miejsce na kolejne maile. Tworząc ten protokół | ||
nie przewidziano korzystania z poczty na wielu komputerach ani istnienia | nie przewidziano korzystania z poczty na wielu komputerach ani istnienia | ||
- | klientów pocztowych innych niż lokalny program (protokół powstawał rok przed | + | klientów pocztowych innych niż lokalny program (protokół powstał rok przed |
HTTP). | HTTP). | ||
Linia 336: | Linia 343: | ||
\\ | \\ | ||
Przykładowa komunikacja w której klient wybrał tagi ''foo'' i ''baz'': | Przykładowa komunikacja w której klient wybrał tagi ''foo'' i ''baz'': | ||
- | <html><pre style="margin-bottom:0"> | + | <html><pre class="compact" style="margin-top:-1.2em; margin-bottom:0"> |
<span style="color:#700"><b>foo</b> search subject "SK2"</span> | <span style="color:#700"><b>foo</b> search subject "SK2"</span> | ||
<span style="color:#700"><b>baz</b> search subject "sieci"</span> | <span style="color:#700"><b>baz</b> search subject "sieci"</span> | ||
Linia 361: | Linia 368: | ||
- klient wysyła komendę ''CAPABILITY'', dostaje w odpowiedzi możliwości serwera | - klient wysyła komendę ''CAPABILITY'', dostaje w odpowiedzi możliwości serwera | ||
- klient uwierzytelnia się, wykonując jedno z: | - klient uwierzytelnia się, wykonując jedno z: | ||
- | * wysyła komendę ''LOGIN //nazwa// //hasło//'' | + | * wysyła komendę ''**LOGIN** //nazwa// //hasło//'' |
* wysyła komendę ''AUTHENTICATE //metoda//'' (podobnie jak dla SMTP), np. ''AUTHENTICATE PLAIN'', po której wysyła dane uwierzytelniające | * wysyła komendę ''AUTHENTICATE //metoda//'' (podobnie jak dla SMTP), np. ''AUTHENTICATE PLAIN'', po której wysyła dane uwierzytelniające | ||
- zalogowany klient może między innymi: | - zalogowany klient może między innymi: | ||
Linia 369: | Linia 376: | ||
* dodać nową wiadomość do wskazanego katalogu, np. umieścić nową wiadomość w katalogu //\Drafts// | * dodać nową wiadomość do wskazanego katalogu, np. umieścić nową wiadomość w katalogu //\Drafts// | ||
- klient wybiera katalog który chce otworzyć: | - klient wybiera katalog który chce otworzyć: | ||
- | * w trybie zapisu i odczytu komendą ''SELECT //nazwa//'', lub | + | * w trybie zapisu i odczytu komendą ''**SELECT** //nazwa//'', lub |
* w trybie tylko do odczytu komendą ''EXAMINE //nazwa//'' | * w trybie tylko do odczytu komendą ''EXAMINE //nazwa//'' | ||
- po wybraniu katalogu, klient może: | - po wybraniu katalogu, klient może: | ||
- | * pobrać wiadomość bądź jej wskazane części komendą ''FETCH …'', np: \\ ''fetch 5 FULL'' pobierze wszystkie metadane wiadomości nr 5, \\ ''fetch 6 BODY[]'' pobierze zawartość wiadomości nr 6, \\ ''fetch 100:200 BODY[HEADER.FIELDS (FROM TO DATE SUBJECT)]'' pobierze nagłówki //From//, //To//, //Date// i //Subject// dla wiadomości od 100 do 200 \\ <small> Komenda ''Fetch'' jest [[ https://datatracker.ietf.org/doc/html/rfc3501#page-55|rozbudowana]] tak by w sprawny sposób można było przeglądać wiadomości bez ściągania z wszystkich wiadomości serwera</small> | + | * pobrać wiadomość bądź jej wskazane części komendą ''**FETCH** …'', np: \\ ''fetch 5 FULL'' pobierze wszystkie metadane wiadomości nr 5, \\ ''fetch 6:8 BODY[]'' pobierze zawartość wiadomości nr 6, 7 i 8, \\ ''fetch 100:200 BODY[HEADER.FIELDS (FROM TO DATE SUBJECT)]'' pobierze nagłówki //From//, //To//, //Date// i //Subject// \\ <small> Komenda ''Fetch'' jest [[ https://datatracker.ietf.org/doc/html/rfc3501#page-55|rozbudowana]] tak by w sprawny sposób można było przeglądać wiadomości bez ściągania z wszystkich wiadomości serwera</small> |
- | * zmienić flagi wiadomości komendą ''STORE …'', np. \\ ''STORE 42 +FLAGS (\Deleted)'' dodaje (patrz: ''+'') jedyną w podanym zbiorze (patrz: ''(…)'') flagę do wiadomości nr 42 określającą że wiadomość jest usunięta (''\Deleted''), \\ ''STORE 56 +FLAGS (\Seen \Answered)'' doda dwie flagi, \\''STORE 10:50 -FLAGS (\Flagged)'' usunie oznaczenie wiadomości jako ważnej dla wiadomości od 10 do 50 | + | * zmienić flagi wiadomości komendą ''**STORE** …'', np. \\ ''STORE 56 +FLAGS (\Seen \Answered)'' doda (''+'') do wiadomości nr 42 obie flagi z podanego zbioru (''(…)''), \\ ''STORE 10:50 -FLAGS (\Flagged)'' usunie oznaczenie wiadomości jako ważnej dla wiadomości od 10 do 50, \\ ''STORE 42 +FLAGS (\Deleted)'' dodaje flagę określającą że wiadomość jest usunięta, |
* usunąć wiadomości z ustawioną flagą //\Deleted// komendą ''EXPUNGE'' | * usunąć wiadomości z ustawioną flagą //\Deleted// komendą ''EXPUNGE'' | ||
- | * wyszukać wiadomości komendą ''SEARCH …'', np. \\ ''SEARCH UNSEEN'' pokaże identyfikatory nieprzeczytanych wiadomości, \\ ''SEARCH SUBJECT "foo"'' pokaże identyfikatory wiadomości które w tytule mają ciąg znaków ''foo'' \\ <small>Komenda ''SEARCH'' ma spore możliwości, patrz [[https://datatracker.ietf.org/doc/html/rfc3501#page-51|RFC]]; ta komenda ma pozwalać przeszukać skrzynkę bez ściągania z serwera wszystkich wiadomości</small> | + | * wyszukać wiadomości komendą ''**SEARCH** …'', np. \\ ''SEARCH UNSEEN'' pokaże identyfikatory nieprzeczytanych wiadomości, \\ ''SEARCH SUBJECT "foo"'' pokaże identyfikatory wiadomości które w tytule mają ciąg znaków ''foo'' \\ <small>Komenda ''SEARCH'' ma spore możliwości, patrz [[https://datatracker.ietf.org/doc/html/rfc3501#page-51|RFC]]; ta komenda ma pozwalać przeszukać skrzynkę bez ściągania z serwera wszystkich wiadomości</small> |
* skopiować bądź przenieść wiadomość do innego katalogu | * skopiować bądź przenieść wiadomość do innego katalogu | ||
* wrócić do stanu zalogowanego komendą ''UNSELECT'' | * wrócić do stanu zalogowanego komendą ''UNSELECT'' | ||
Linia 386: | Linia 393: | ||
Jeżeli komendy ''STORE'', ''FETCH'', ''SEARCH'', … zostaną | Jeżeli komendy ''STORE'', ''FETCH'', ''SEARCH'', … zostaną | ||
poprzedzone komendą **''UID''**, to operują na unikalnych identyfikatorach. | poprzedzone komendą **''UID''**, to operują na unikalnych identyfikatorach. | ||
+ | <html><!-- | ||
+ | ++++ foo|<pre class="compact" style="margin-top:-1.2em"> | ||
+ | <span style="color:#700">a001 uid search all</span> | ||
+ | <span style="color:#007">* SEARCH 1 2 3 4 5</span> | ||
+ | <span style="color:#007">a001 OK Search completed</span> | ||
+ | <span style="color:#700">a002 search all</span> | ||
+ | <span style="color:#007">* SEARCH 1 2 3 4 5</span> | ||
+ | <span style="color:#007">a002 OK Search completed</span> | ||
+ | <span style="color:#700">a003 store 1,4 +flags (\deleted)</span> | ||
+ | <span style="color:#007">* 1 FETCH (FLAGS (\Deleted \Seen \Answered))</span> | ||
+ | <span style="color:#007">* 4 FETCH (FLAGS (\Deleted \Seen))</span> | ||
+ | <span style="color:#700">a003 OK Store completed</span> | ||
+ | <span style="color:#700">a004 expunge</span> | ||
+ | <span style="color:#007">* 3 EXPUNGE</span> | ||
+ | <span style="color:#007">a004 OK Expunge completed</span> | ||
+ | <span style="color:#700">a005 uid search all</span> | ||
+ | <span style="color:#007">* SEARCH 2 3 5</span> | ||
+ | <span style="color:#007">a005 OK Search completed</span> | ||
+ | <span style="color:#700">a006 search all</span> | ||
+ | <span style="color:#007">* SEARCH 1 2 3</span> | ||
+ | <span style="color:#007">a006 OK Search completed</span> | ||
+ | </pre> | ||
+ | ++++ | ||
+ | --> | ||
+ | </html> | ||
\\ | \\ | ||
Po wybraniu katalogu klient zawsze dostaje informację o tym jaki UID zostanie | Po wybraniu katalogu klient zawsze dostaje informację o tym jaki UID zostanie | ||
Linia 394: | Linia 426: | ||
//num//. | //num//. | ||
| | ||
- | Jak widać, protokół IMAP pozwala zarówno ściągać całe maile (czyli zastąpić | + | Protokół IMAP pozwala zarówno ściągać całe maile (czyli zastąpić protokół POP3), |
- | protokół POP3), jaki i pozwala łatwo pobierać listy maili, szukać i czytać | + | jaki i pozwala klientom pocztowym (również w formie "aplikacji" webowych) między |
- | wybrane części wybranych maili bezpośrednio z serwera, co pozwala korzystać | + | innymi pobrać wybrane nagłówki (From, Subject i Date) i flagi (przeczytane, |
- | z (również webowych) klientów pocztowych. | + | ważne, odpowiedziano) stu najnowszych maili, pobrać wybrane części wiadomości |
+ | (np. treść bez załączników), czy wyszukać numery maili które w | ||
+ | temacie/treści/nadawcy/… mają podany ciąg znaków. | ||
W IMAP kiedykolwiek po zalogowaniu klient może też wysłać komendę **''IDLE''** | W IMAP kiedykolwiek po zalogowaniu klient może też wysłać komendę **''IDLE''** | ||
Linia 411: | Linia 445: | ||
Przykład komunikacji: | Przykład komunikacji: | ||
- | <html><div style="margin-top:-1.2em"></div></html> | + | <html><pre class="compact" style="margin-top:-1.2em"> |
- | <html><pre> | + | |
<span style="color:#700">A CAPABILITY</span> | <span style="color:#700">A CAPABILITY</span> | ||
<span style="color:#007">* CAPABILITY IMAP4rev1 IDLE UNSELECT</span> | <span style="color:#007">* CAPABILITY IMAP4rev1 IDLE UNSELECT</span> | ||
Linia 465: | Linia 498: | ||
<span style="color:#007">+ idling</span> | <span style="color:#007">+ idling</span> | ||
<span style="color:#007">* 51 EXISTS</span> | <span style="color:#007">* 51 EXISTS</span> | ||
- | <span style="color:#007">DONE</span> | + | <span style="color:#700">DONE</span> |
<span style="color:#007">J OK IDLE completed</span> | <span style="color:#007">J OK IDLE completed</span> | ||
- | <span style="color:#700">K LOGOUT</span> | + | <span style="color:#700">K FETCH 51 (INTERNALDATE BODYSTRUCTURE ENVELOPE)</span> |
- | <span style="color:#007">* BYE mail.example.org server closing connection</span> | + | <span style="color:#007">* 51 FETCH (INTERNA… </span> |
- | <span style="color:#007">K OK LOGOUT completed</span> | + | <span style="color:#007">…</span> |
</pre> | </pre> | ||
</html> | </html> | ||
Linia 486: | Linia 519: | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Połącz się do swojej poczty studenckiej używając IMAP i znajdź nieprzeczytane | Połącz się do swojej poczty studenckiej używając IMAP i znajdź nieprzeczytane | ||
- | wiadomości w katalogu ''Inbox''. | + | wiadomości w katalogu ''Inbox''. (Jeżeli nie masz nieprzeczytanych wiadomości, |
+ | poszukaj wiadomości na które nie wysłałeś odpowiedzi, tzn. ''UNANSWERED''.) | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Linia 503: | Linia 537: | ||
Wstępne przetworzenie maili trafiających do skrzynki na serwerze, np. wrzucanie | Wstępne przetworzenie maili trafiających do skrzynki na serwerze, np. wrzucanie | ||
do wybranych folderów na podstawie ustawionych filtrów, umożliwiają skrypty | do wybranych folderów na podstawie ustawionych filtrów, umożliwiają skrypty | ||
- | sieve (patrz: [[https://datatracker.ietf.org/doc/html/rfc5228|RFC]] | + | sieve (patrz: [[https://datatracker.ietf.org/doc/html/rfc5228|RFC]] i |
- | [[http://sieve.info/|strona "domowa"]]) które można konfigurować używając | + | [[https://proton.me/support/sieve-advanced-custom-filters|sensowy opis |
+ | ważniejszych elementów języka]]) które można konfigurować np. używając | ||
[[https://datatracker.ietf.org/doc/html/rfc5804|dedykowanego do tego protokołu]]. | [[https://datatracker.ietf.org/doc/html/rfc5804|dedykowanego do tego protokołu]]. | ||
\\ | \\ | ||
Linia 526: | Linia 561: | ||
* zwykle zawiera identyfikator pozwalający znaleźć w logach serwera informacje o tej wiadomości, | * zwykle zawiera identyfikator pozwalający znaleźć w logach serwera informacje o tej wiadomości, | ||
* może zawierać, za słowem kluczowym ''for'' informację o adresie wpisanym w ''RCPT TO'' z "koperty" SMTP. | * może zawierać, za słowem kluczowym ''for'' informację o adresie wpisanym w ''RCPT TO'' z "koperty" SMTP. | ||
+ | |||
+ | <small> | ||
+ | |||
+ | ++++ Przykładowa skomplikowana historia maila | | ||
+ | <html> | ||
+ | <span style="color:#700">Mail kierowany do <i>smith@example.com</i> został | ||
+ | przeskanowany programem antywirusowym i wysłany do adresata,</span> | ||
+ | <span style="color:#070">skąd został przekierowany do adresu <i>littlejimmy@example.com</i>,</span> | ||
+ | <span style="color:#007">skąd został przesłany do adresu <i>user@example.org</i>.</span> | ||
+ | I każdy kolejny serwer SMTP dodał własny nagłówek: | ||
+ | <span style="color:#007"> | ||
+ | <pre class="compact" style="margin:0"> | ||
+ | <span style="color:#007">Return-path: <user+abc =example=example.org@gmail.com> | ||
+ | Received: from mail-yb1-xb2c.google.com ([2607:f8b0:4864:20::b2c]) | ||
+ | by mail.example.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | ||
+ | (Exim 4.96) | ||
+ | (envelope-from <user+abc_=example=example.org@gmail.com) | ||
+ | id 1tWaLw-005ThV-0Q | ||
+ | for user@example.org; | ||
+ | Sat, 11 Jan 2025 13:12:33 +0100 | ||
+ | Received: by mail-yb1-xb2c.google.com with SMTP id 3f1490d57ef6-e3c8ae3a3b2so3989188276.0 | ||
+ | for <user@example.org>; Sat, 11 Jan 2025 04:12:31 -0800 (PST) | ||
+ | </span><span style="color:#070">Received: by 2002:a05:6918:2743:b0:29e:22a8:4a84 with SMTP id kl3csp727682ysb; | ||
+ | Sat, 11 Jan 2025 04:11:26 -0800 (PST) | ||
+ | Received: from mail-sor-f41.google.com (mail-sor-f41.google.com. [209.85.220.41]) | ||
+ | by mx.google.com with SMTPS id 4fb4d7f45d1cf-5d98fe87a9fsor2448019a12.0.2025.01.11.04.11.25 | ||
+ | for <littlejimmy@example.com> | ||
+ | (Google Transport Security); | ||
+ | Sat, 11 Jan 2025 04:11:25 -0800 (PST) | ||
+ | </span><span style="color:#700">Received: by 2002:a05:7412:4:b0:139:5231:8a71 with SMTP id 4csp730573rdb; | ||
+ | Sat, 11 Jan 2025 04:11:23 -0800 (PST) | ||
+ | Received: from mail22.atl91.mcsv.net (mail22.atl91.mcsv.net. [198.2.130.22]) | ||
+ | by mx.google.com with ESMTPS id 3f1490d57ef6-e55be2b386esi2450299276.511.2025.01.11.04.11.22 | ||
+ | for <smith@example.com> | ||
+ | (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); | ||
+ | Sat, 11 Jan 2025 04:11:22 -0800 (PST) | ||
+ | Received: from mail22.atl91.mcsv.net ([127.0.0.1]) | ||
+ | by localhost (mail22.atl91.mcsv.net [127.0.0.1]) (amavisd-new, port 10026) | ||
+ | with ESMTP id vi1BlmqBCQOU; Sat, 11 Jan 2025 12:11:22 +0000 | ||
+ | Received: from localhost (localhost [127.0.0.1]) | ||
+ | by mail22.atl91.mcsv.net (Postfix) with ESMTP id BC4FCE0BA6 | ||
+ | for <smith@example.com>; Sat, 11 Jan 2025 12:11:20 +0000</span> | ||
+ | </pre> | ||
+ | </html> | ||
+ | ++++ | ||
+ | |||
+ | </small> | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Linia 539: | Linia 621: | ||
Nagłówki z adresami mają składnię ''Nagłówek: nazwa <adres>[, …]'', np. \\ | Nagłówki z adresami mają składnię ''Nagłówek: nazwa <adres>[, …]'', np. \\ | ||
- | ''To: John Q. Public %%<john@example.com>, <smith@example.com>%%'' | + | ''To: "John Q. Public" %%<john@example.com>, <smith@example.com>%%'' |
Poza oczywistymi //From//, //To//, //Cc// i //Bcc// używa się też nagłówków | Poza oczywistymi //From//, //To//, //Cc// i //Bcc// używa się też nagłówków | ||
Linia 592: | Linia 674: | ||
Jeżeli wiadomość składa się z więcej niż jednej części, używa się specjalnych | Jeżeli wiadomość składa się z więcej niż jednej części, używa się specjalnych | ||
- | typów \\ ''Content-Type: multipart/…; boundary=//separator//''. | + | typów \\ ''Content-Type: multipart/…; boundary="//separator//"''. |
Te typy wskazują że treść to więcej niż jedna część i ustawiają separator | Te typy wskazują że treść to więcej niż jedna część i ustawiają separator | ||
- | oddzielający te części na ''--//separator//''. | + | oddzielający te części na ''--//separator//'' (i za ostatnią częścią |
- | \\ | + | na ''--//separator//--''). |
- | Powszechnie wykorzystuje się kilka takich typów, np. ''mixed'' i ''alternate''. | + | Powszechnie wykorzystuje się kilka takich typów, np. ''mixed'' czy ''alternate'' |
+ | (<small>więcej na [[https://en.wikipedia.org/wiki/MIME#Multipart_subtypes|wikipedii]]</small>). | ||
Każda część wiadomości ma powinna mieć powtórzony nagłówek //Content-Type// | Każda część wiadomości ma powinna mieć powtórzony nagłówek //Content-Type// | ||
Linia 610: | Linia 693: | ||
Przykład takiej treści: | Przykład takiej treści: | ||
- | <html><div style="margin-top:-1.2em"></div></html> | + | <html><pre class="compact" style="margin-top:-1.2em"> |
- | <code> | + | <i>… poprzednie nagłówki …</i> |
- | … inne nagłówki … | + | Content-Type: multipart/alternate; boundary="<b>oddzielacz</b>" |
- | Content-Type: multipart/alternate; boundary=oddzielacz | + | |
- | --oddzielacz | + | <span style="color:#007">--oddzielacz</span> |
Content-Type: text/plain | Content-Type: text/plain | ||
Przyjdzie o **jedenastej** wieczorem. | Przyjdzie o **jedenastej** wieczorem. | ||
- | --oddzielacz | + | <span style="color:#007">--oddzielacz</span> |
Content-Type: text/html | Content-Type: text/html | ||
- | <html><body><p>Przyjdzie o <b>jedenastej</b> wieczorem.</p></body></html> | + | <html><body><p>Przyjdzie o <b>jedenastej</b> wieczorem.</p></body></html> |
- | --oddzielacz | + | <span style="color:#007">--oddzielacz--</span> |
- | </code> | + | </pre></html> |
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Linia 633: | Linia 715: | ||
Typ ''multipart/**mixed**'' służy do wysłania kilku niezależnych części i jest | Typ ''multipart/**mixed**'' służy do wysłania kilku niezależnych części i jest | ||
- | używany do wysyłania z załącznikami. | + | używany do wysyłania maili z załącznikami. |
Przykład: | Przykład: | ||
- | <html><div style="margin-top:-1.2em"></div></html> | + | <html><pre class="compact" style="margin-top:-1.2em"> |
- | <code> | + | <i>… poprzednie nagłówki …</i> |
… inne nagłówki … | … inne nagłówki … | ||
- | Content-Type: multipart/mixed; boundary=fikusny_separator | + | Content-Type: multipart/mixed; boundary="<b>fikusny_separator</b>" |
- | --fikusny_separator | + | <span style="color:#007">--fikusny_separator</span> |
Content-Type: text/plain | Content-Type: text/plain | ||
Zobacz ten obrazek! | Zobacz ten obrazek! | ||
- | --fikusny_separator | + | <span style="color:#007">--fikusny_separator</span> |
Content-Type: image/png | Content-Type: image/png | ||
Content-Transfer-Encoding: base64 | Content-Transfer-Encoding: base64 | ||
Linia 653: | Linia 735: | ||
ETvHpgjyISFAGN5YCNgjrP7GURBzioYgzEHcQ9mIFMRLHykg2AtU+0bVxCNq8am+oe6OJ8yf5QDW | ETvHpgjyISFAGN5YCNgjrP7GURBzioYgzEHcQ9mIFMRLHykg2AtU+0bVxCNq8am+oe6OJ8yf5QDW | ||
ShMmZmKfpQAAAABJRU5ErkJggg== | ShMmZmKfpQAAAABJRU5ErkJggg== | ||
- | --fikusny_separator | + | <span style="color:#007">--fikusny_separator--</span> |
- | </code> | + | </pre></html> |
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
Linia 663: | Linia 745: | ||
Typu MIME moża w sobie dowolnie zagnieżdżać, więc można również: | Typu MIME moża w sobie dowolnie zagnieżdżać, więc można również: | ||
- | <code> | + | <html><pre class="compact" style="margin-top:-1.2em"> |
- | … inne nagłówki … | + | <i>… poprzednie nagłówki …</i> |
- | Content-Type: multipart/mixed; boundary=a | + | Content-Type: multipart/mixed; boundary="<b>a</b>" |
- | --a | + | <span style="color:#007">--a</span> |
- | Content-Type: multipart/alternative; boundary=b | + | Content-Type: multipart/alternative; boundary="<b>b</b>" |
- | --b | + | <span style="color:#070">--b</span> |
Content-Type: text/plain | Content-Type: text/plain | ||
Zobacz ten obrazek! | Zobacz ten obrazek! | ||
[IMG] | [IMG] | ||
- | --b | + | <span style="color:#070">--b</span> |
- | Content-Type: multipart/related; boundary=c | + | Content-Type: multipart/related; boundary="<b>c</b>" |
- | --c | + | <span style="color:#700">--c</span> |
Content-Type: text/html | Content-Type: text/html | ||
- | <html><body><p>Zobacz ten obrazek!</p> | + | <html><body><p>Zobacz ten obrazek!</p> |
- | <p><img src="cid:my-mail-img""></p></body></html> | + | <p><img src="cid:my-mail-img""></p></body></html> |
- | --c | + | <span style="color:#700">--c</span> |
Content-Type: image/png | Content-Type: image/png | ||
Content-Transfer-Encoding: base64 | Content-Transfer-Encoding: base64 | ||
- | Content-ID: <my-mail-img> | + | Content-ID: <my-mail-img> |
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAATElEQVQY04WOOQ7AQAwCZ1b+/5dJ | iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAATElEQVQY04WOOQ7AQAwCZ1b+/5dJ | ||
ETvHpgjyISFAGN5YCNgjrP7GURBzioYgzEHcQ9mIFMRLHykg2AtU+0bVxCNq8am+oe6OJ8yf5QDW | ETvHpgjyISFAGN5YCNgjrP7GURBzioYgzEHcQ9mIFMRLHykg2AtU+0bVxCNq8am+oe6OJ8yf5QDW | ||
ShMmZmKfpQAAAABJRU5ErkJggg== | ShMmZmKfpQAAAABJRU5ErkJggg== | ||
- | --c | + | <span style="color:#700">--c--</span> |
- | --b | + | <span style="color:#070">--b--</span> |
- | --a | + | <span style="color:#007">--a</span> |
Content-Type: text/plain | Content-Type: text/plain | ||
Content-Disposition: attachment; filename="licencja.txt" | Content-Disposition: attachment; filename="licencja.txt" | ||
kopyrajt 2025 | kopyrajt 2025 | ||
- | --a | + | <span style="color:#007">--a--</span> |
- | </code> | + | </pre></html> |
==== Kodowanie treści ==== | ==== Kodowanie treści ==== | ||
Linia 708: | Linia 790: | ||
Kodowanie dla danej części wiadomości można ustawić w nagłówku | Kodowanie dla danej części wiadomości można ustawić w nagłówku | ||
- | //Content-Transfer-Encoding//. Domyślna wartość to ''7bit'', nie pozwalająca w | + | //**Content-Transfer-Encoding**//. Domyślna wartość to ''7bit'', nie pozwalająca w |
ogóle na użycie znaków spoza US-ASCII. | ogóle na użycie znaków spoza US-ASCII. | ||
- | Inne dozwolone kodowana to "normalne" ''8bit'' i ''binary'' (pierwsze ogranicza | + | Inne dozwolone kodowana to "normalne" ''**8bit**'' i ''binary'' (pierwsze ogranicza |
długość linii do 998 znaków, drugie nie nakłada ograniczenia na długość linii) | długość linii do 998 znaków, drugie nie nakłada ograniczenia na długość linii) | ||
oraz ''quoted-printable'' i ''base64''. | oraz ''quoted-printable'' i ''base64''. | ||
- | ''Content-Transfer-Encoding: quoted-printable'' ([[https://datatracker.ietf.org/doc/html/rfc2045#section-6.7|RFC]]) | + | ''Content-Transfer-Encoding: **quoted-printable**'' ([[https://datatracker.ietf.org/doc/html/rfc2045#section-6.7|RFC]]) |
bez zmian przesyła drukowalne znaki ASCII poza znakiem równości, | bez zmian przesyła drukowalne znaki ASCII poza znakiem równości, | ||
natomiast całą resztę (w tym np. spacje czy znaki nowej linii) koduje jako | natomiast całą resztę (w tym np. spacje czy znaki nowej linii) koduje jako | ||
''=//XX//'', gdzie //XX// to szesnastkowa wartość kodowanego znaku. | ''=//XX//'', gdzie //XX// to szesnastkowa wartość kodowanego znaku. | ||
- | Powstały tekst zawija się przed 77 znakiem , wstawiając na koniec linii znak ''=''. | + | Powstały tekst zawija się przed 78 znakiem, wstawiając na koniec linii znak ''=''. |
\\ | \\ | ||
Np. ''Einstein napisał: e=mc²'' z nową linią na końcu stanie się tekstem | Np. ''Einstein napisał: e=mc²'' z nową linią na końcu stanie się tekstem | ||
''Einstein=20napisa=C5=82:=20e=3Dmc=C2=B2=0D=0A''. | ''Einstein=20napisa=C5=82:=20e=3Dmc=C2=B2=0D=0A''. | ||
- | ''Content-Transfer-Encoding: quoted-printable'' używa zwykłego ''base64'' do zakodowania treści. | + | ''Content-Transfer-Encoding: **base64**'' używa zwykłego |
+ | [[https://en.wikipedia.org/wiki/Base64|base64]] do zakodowania treści. | ||
\\ | \\ | ||
Np. ''Einstein napisał: e=mc²'' z nową linią na końcu stanie się tekstem | Np. ''Einstein napisał: e=mc²'' z nową linią na końcu stanie się tekstem | ||
Linia 731: | Linia 814: | ||
Kodowanie ''base64'' jest powszechnie używane do przesyłania nietekstowych | Kodowanie ''base64'' jest powszechnie używane do przesyłania nietekstowych | ||
załączników i jest do tego celu niewydajne – base64 koduje 3 bit treści na | załączników i jest do tego celu niewydajne – base64 koduje 3 bit treści na | ||
- | 4 bitach danych, więc objętość wiadomości rośnie o ⅓. | + | 4 bitach danych wymaga łamania wierszy wynikowego tekstu, więc po objętość |
+ | wiadomości rośnie o ponad ⅓. | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ |