Różnice między wybraną wersją a wersją aktualną.
Nowa wersja | Poprzednia wersja | ||
sk2:mail [2025/01/14 04:07] jkonczak utworzono |
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 18: | Linia 24: | ||
W trakcie przesyłania wiadomości e-mail między serwerami SMTP najpierw | W trakcie przesyłania wiadomości e-mail między serwerami SMTP najpierw | ||
- | przesyłana jest są adresy z "koperty" (envelope), potem jej zawartość (contents). | + | przesyłane są adresy z "koperty" (envelope), potem jej zawartość (contents). |
\\ | \\ | ||
Zawartość (contents) każdej wiadomość e-mail składa się z nagłówków (headers) | Zawartość (contents) każdej wiadomość e-mail składa się z nagłówków (headers) | ||
Linia 24: | Linia 30: | ||
<html> | <html> | ||
- | <pre style="margin-top:-1.2em; line-height: 1em"> | + | <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> |
<b>DATA</b> | <b>DATA</b> | ||
- | <span style="color:navy">From: Greebo <grey@cat.baz> <span style="color:gray">\ \</span> | + | <span style="color:navy">From: Greebo <grey@cat.baz> <span style="color:gray">\ \</span> |
- | To: John Q. Public <john@example.com> <span style="color:gray">| headers | contents</span> | + | To: John Q. Public <john@example.com> <span style="color:gray">| headers | contents</span> |
- | Date: Mon, 13 Jan 2025 03:00:00 +0100 <span style="color:gray">| (nagłówki) | ("zawartość")</span> | + | Date: Mon, 13 Jan 2025 03:00:00 +0100 <span style="color:gray">| (nagłówki) | ("zawartość")</span> |
- | Subject: Khhhhhhhhhhhhh <span style="color:gray">/ |</span> | + | Subject: Khhhhhhhhhhhhh <span style="color:gray">/ |</span> |
- | <span style="color:gray"> |</span> | + | <span style="color:gray"> |</span> |
- | KhIIIIsss! <span style="color:gray">] body (treść) /</span> | + | KhIIIIsss! <span style="color:gray">] body (treść) /</span> |
</span><b>.</b> | </span><b>.</b> | ||
</pre> | </pre> | ||
Linia 39: | Linia 45: | ||
Zauważ że używany do dostarczenia wiadomości adres odbiorcy znajduje się na | Zauważ że używany do dostarczenia wiadomości adres odbiorcy znajduje się na | ||
- | "kopercie". Adres docelowy który jest w nagłówkach w jej zawartości nie jest | + | "kopercie". |
- | brany pod uwagę przy ustalaniu dokąd wiadomość ma zostać wysłana. | + | \\ |
+ | Adres docelowy z nagłówków jej zawartości nie jest brany pod uwagę przy | ||
+ | ustalaniu dokąd wiadomość ma zostać wysłana. | ||
\\ | \\ | ||
"Koperta" jest tworzona tylko na czas wymiany zawartości między serwerami i | "Koperta" jest tworzona tylko na czas wymiany zawartości między serwerami i | ||
- | użytkownicy poczty nie widzą adresów które tam były podane (<small>choć serwer | + | użytkownicy poczty nie widzą adresów które były tam podane (<small>choć serwer |
odbierający może przepisać adres z //rcpt to// do nagłówka //Received//</small>). | odbierający może przepisać adres z //rcpt to// do nagłówka //Received//</small>). | ||
Linia 51: | Linia 59: | ||
<html><div style="margin-left:0.5em;padding-left:0.5em;border-left:1px gray solid;display:block; margin-bottom: 0"></html> | <html><div style="margin-left:0.5em;padding-left:0.5em;border-left:1px gray solid;display:block; margin-bottom: 0"></html> | ||
- | Each line of characters MUST be no more than 998 characters, and SHOULD be no | + | //Each line of characters MUST be no more than 998 characters, and SHOULD be no |
- | more than 78 characters, excluding the CRLF. | + | more than 78 characters, excluding the CRLF.// |
- | [[https://datatracker.ietf.org/doc/html/rfc5322#section-2.1.1#section-2.3.1|[RFC dla formatu wiadomości e-mail]]] | + | <wrap right><small>[[https://datatracker.ietf.org/doc/html/rfc5322#section-2.1.1#section-2.3.1|[RFC dla formatu wiadomości e-mail]]]</small></wrap> |
<html></div></html> | <html></div></html> | ||
Linie nagłówków można w razie potrzeby łamać na białych znakach, zostawiając | Linie nagłówków można w razie potrzeby łamać na białych znakach, zostawiając | ||
Linia 64: | Linia 72: | ||
<html><div style="margin-left:0.5em;padding-left:0.5em;border-left:1px gray solid;display:block; margin-bottom: 0"></html> | <html><div style="margin-left:0.5em;padding-left:0.5em;border-left:1px gray solid;display:block; margin-bottom: 0"></html> | ||
- | Although SMTP extensions may relax this restriction for the content body, | + | //Although SMTP extensions may relax this restriction for the content body, |
- | the content header fields are always encoded using the US-ASCII repertoire. | + | the content header fields are always encoded using the US-ASCII repertoire.// |
- | [[https://datatracker.ietf.org/doc/html/rfc5321#section-2.3.1|[RFC dla SMTP]]] | + | <wrap right><small>[[https://datatracker.ietf.org/doc/html/rfc5321#section-2.3.1|[RFC dla SMTP]]]</small></wrap> |
<html></div></html> | <html></div></html> | ||
W niektórych nagłówkach można użyć znaków spoza kodowania US-ASCII, ale muszą | W niektórych nagłówkach można użyć znaków spoza kodowania US-ASCII, ale muszą | ||
one być odpowiednio zakodowane, używając składni //encoded-word// opisanej w | one być odpowiednio zakodowane, używając składni //encoded-word// opisanej w | ||
odpowiednim [[https://datatracker.ietf.org/doc/html/rfc2047|dokumencie RFC]]. | odpowiednim [[https://datatracker.ietf.org/doc/html/rfc2047|dokumencie RFC]]. | ||
- | \\ | ||
- | Np: ''Mój przykładowy tekst'' (gdzie w UTF-8 ''ó'' to binarnie ''\0xC3\0xB3'' a | ||
- | ''ł'' to ''\xC5\x82'') można w nagłówku //Subject// zakodować jako: \\ | ||
- | ''=?UTF-8?Q?M=C3=B3j?= =?UTF-8?Q?Przyk=C5=82adowy?= tekst'' lub ''=?UTF-8?Q?M=C3=B3j_przyk=C5=82adowy_tekst?='' (używając //__Q__uoted-Printable//) lub ''=?UTF-8?B?TcOzaiBwcnp5a8WCYWRvd3kgdGVrc3Q=?='' (używając //__b__ase64//). | ||
+ | <small> | ||
+ | Np: ''Mój przykładowy tekst'' (gdzie w UTF-8 ''ó'' to binarnie ''\0xC3\0xB3'' a | ||
+ | ''ł'' to ''\0xC5\0x82'') w nagłówku //Subject// można zakodować jako: | ||
+ | <html><div style="margin-top:-1.2em"></div></html> | ||
+ | * ''=?UTF-8?Q?M=C3=B3j?= =?UTF-8?Q?Przyk=C5=82adowy?= tekst'' (używając //**q**uoted-printable//) | ||
+ | * ''=?UTF-8?Q?M=C3=B3j_przyk=C5=82adowy_tekst?='' (jak wyżej, ale kodując wiele słów naraz i zastępując spację przez ''_'') | ||
+ | * ''=?UTF-8?B?TcOzaiBwcnp5a8WCYWRvd3kgdGVrc3Q=?='' (używając //**b**ase64//). | ||
+ | </small> | ||
=== Podstawowe nagłówki === | === Podstawowe nagłówki === | ||
Linia 99: | Linia 111: | ||
=== Wysłanie === | === Wysłanie === | ||
- | <html><pre style="line-height:1em;font-family:DejaVu Sans Mono;margin-bottom:0"> | + | <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 128: | Linia 140: | ||
=== Odbieranie === | === Odbieranie === | ||
- | <html><pre style="line-height:1em;font-family:DejaVu Sans Mono;margin-bottom:0"> | + | <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 134: | Linia 146: | ||
</pre></html> | </pre></html> | ||
Po tym jak wiadomość wyląduje w skrzynce, trzeba ją stamtąd pobrać. | Po tym jak wiadomość wyląduje w skrzynce, trzeba ją stamtąd pobrać. | ||
- | Do tego używa się protokołów protokołu POP3 lub IMAP. | + | Do tego używa się protokołu POP3 lub IMAP. |
===== Protokół SMTP ===== | ===== Protokół SMTP ===== | ||
Linia 143: | 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 musi się przedstawić komendą ''EHLO //nazwa_domenowa//'' (lub starszym ''HELO //nazwa_domenowa//'') i poczekać 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. \\ 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'' | + | * 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 musi wysłać informację o nadawcy maila komendą ''MAIL FROM://nadawca//'' i poczekać na akceptację serwera | + | - klient wysyła informację o nadawcy maila komendą ''**MAIL FROM**:<//nadawca//>'' i czeka na akceptację serwera |
- | - klient musi wysłać informację o jednym odbiorcy maila komendą ''RCPT TO://odbiorca//'' i poczekać 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, serwer usuwa tą kropkę; więc żeby wysłać maila z linią złożoną z kropki, trzeba 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 | ||
- klient może wysłać kolejny mail (zaczynając znów od ''MAIL FROM'') lub zakończyć połączenie wysyłając komendę ''QUIT'' | - klient może wysłać kolejny mail (zaczynając znów od ''MAIL FROM'') lub zakończyć połączenie wysyłając komendę ''QUIT'' | ||
Linia 167: | 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 178: | 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 204: | 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 211: | Linia 222: | ||
* 587 (''submission'') do szyfrowanych połączeń (TLS), ustanawianych po użyciu komendy ''STARTTLS'' na nieszyfrowanym połączeniu | * 587 (''submission'') do szyfrowanych połączeń (TLS), ustanawianych po użyciu komendy ''STARTTLS'' na nieszyfrowanym połączeniu | ||
* <small>2525 (bez nazwy) niestandardowy port, używany w przypadku jeśli port 25 jest niedostępny</small> | * <small>2525 (bez nazwy) niestandardowy port, używany w przypadku jeśli port 25 jest niedostępny</small> | ||
+ | <html><div style="margin-top:-1.2em"></div></html> | ||
<small>(Zobacz też: https://www.cloudflare.com/learning/email-security/smtp-port-25-587/)</small> | <small>(Zobacz też: https://www.cloudflare.com/learning/email-security/smtp-port-25-587/)</small> | ||
Linia 221: | 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 235: | 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: \\ | ||
- | ''openssl s_client -quiet -verify_quiet -crlf -starttls smtp -name //nazwa_domenowa_do_ehlo// //adres_serwera//:submission''</small> | + | ''openssl s_client -quiet -verify_quiet -crlf -starttls smtp -name //nazwa_do_ehlo// //adres_serwera//:submission''</small> |
\\ | \\ | ||
Po nawiązaniu połączenia TLS klient powinien ponownie wysłać komendę ''EHLO'' | Po nawiązaniu połączenia TLS klient powinien ponownie wysłać komendę ''EHLO'' | ||
Linia 266: | Linia 280: | ||
~~Zadanie.#~~ | ~~Zadanie.#~~ | ||
- | Przygotuj polecenia które będziesz musiał wpisać żeby wysłać mail ze swojej | + | Przygotuj polecenia które będziesz musiał wpisać żeby się uwierzytelnić metodą |
- | poczty studenckiej (albo innej własnej poczty) z uwierzytelnieniem metodą PLAIN | + | PLAIN i wysłać mail ze swojej poczty studenckiej (albo innej własnej poczty) |
do adresów dwóch osób siedzących obok (<small>lub do innych swoich adresów, wedle | do adresów dwóch osób siedzących obok (<small>lub do innych swoich adresów, wedle | ||
uznania</small>). \\ | uznania</small>). \\ | ||
Linia 287: | 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 298: | 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 312: | 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 329: | 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 354: | 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 360: | Linia 374: | ||
* stworzyć, zmienić nazwę czy usunąć katalogi | * stworzyć, zmienić nazwę czy usunąć katalogi | ||
* czekać na przyjście nowych wiadomości (o tym jest dalej w materiałach) | * czekać na przyjście nowych wiadomości (o tym jest dalej w materiałach) | ||
- | * dodać nową wiadomość do wskazanego katalogu, np. dodać szkic wiadomości | + | * dodać nową wiadomość do wskazanego katalogu, np. umieścić nową wiadomość w katalogu //\Drafts// |
- | - klient wybiera katalog który chce otworzyć w trybie zapisu i odczytu komendą ''SELECT //nazwa//'' lub trybie tylko do odczytu komendą ''EXAMINE //nazwa//'' | + | - klient wybiera katalog który chce otworzyć: |
- | - po wybraniu katalogi, klient może: | + | * w trybie zapisu i odczytu komendą ''**SELECT** //nazwa//'', lub |
- | * 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, a ''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> | + | * w trybie tylko do odczytu komendą ''EXAMINE //nazwa//'' |
- | * 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'') \\ np. ''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 | + | - po wybraniu katalogu, klient może: |
- | * usunąć wiadomości z ustawioną flagą ''\Deleted'' komendą ''EXPUNGE'' | + | * 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> |
- | * 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> | + | * 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'' | ||
+ | * 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'' | ||
- | - do zakończenia pracy klient używa komendy '''LOGOUT'' | + | - do zakończenia pracy klient używa komendy ''LOGOUT'' |
IMAP używa dwóch numerów wiadomości: kolejnych numerów w skrzynce, zmieniających | IMAP używa dwóch numerów wiadomości: kolejnych numerów w skrzynce, zmieniających | ||
Linia 376: | Linia 392: | ||
\\ | \\ | ||
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 | ||
- | nadany kolejnej wiadomości, co pozwala np. zorientować się jakie wiadomości | + | nadany kolejnej wiadomości. |
- | pojawiły się od ostatniego sprawdzania poczty. | + | |
\\ | \\ | ||
Przy okazji każdej odpowiedzi serwer może przesłać dodatkowo np. linię | Przy okazji każdej odpowiedzi serwer może przesłać dodatkowo np. linię | ||
Linia 386: | Linia 426: | ||
//num//. | //num//. | ||
| | ||
+ | Protokół IMAP pozwala zarówno ściągać całe maile (czyli zastąpić protokół POP3), | ||
+ | jaki i pozwala klientom pocztowym (również w formie "aplikacji" webowych) między | ||
+ | innymi pobrać wybrane nagłówki (From, Subject i Date) i flagi (przeczytane, | ||
+ | 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''** | ||
([[https://datatracker.ietf.org/doc/html/rfc2177.html|RFC]]). W odpowiedzi na | ([[https://datatracker.ietf.org/doc/html/rfc2177.html|RFC]]). W odpowiedzi na | ||
Linia 398: | 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 452: | 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 473: | 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 490: | 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 513: | 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 526: | 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 579: | 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 597: | 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 620: | 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 640: | 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 650: | 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 695: | 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 718: | 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.#~~ | ||
Wyszukaj w swojej skrzynce przynajmniej dwa maile z polskimi znakami w treści | Wyszukaj w swojej skrzynce przynajmniej dwa maile z polskimi znakami w treści | ||
które używają różnych ''Content-Transfer-Encoding''. | które używają różnych ''Content-Transfer-Encoding''. | ||
+ |