Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SMTP/POP3] Kodowanie...
Forum PHP.pl > Forum > Przedszkole
wNogachSpisz
Witam, czy jest możliwość aby przesłać załącznik wiadomości w postaci binarnej zamiast encodować do base64?

Content-Transfer-Encoding: base64
Content-Transfer-Encoding: binary

http://tools.ietf.org/html/rfc1341
Cytat
Many Content-Types which could usefully be transported via
email are represented, in their "natural" format, as 8-bit
character or binary data. Such data cannot be transmitted
over some transport protocols. For example, RFC 821
restricts mail messages to 7-bit US-ASCII data with 1000
character lines.
abort
RFC 1341 osiągnął już pełnoletność (wydano go 19 lat temu), więc w działce IT można go uznać za zabytek smile.gif
1. RFC1341 jest "Obsoleted by: 1521" (masz na górze dokumentu, który zacytowałeś).
2. RFC1521 (swoją drogą, też pełnoletni - rocznik 1993) jest "Obsoleted by: 2045, 2046, 2047, 2048, 2049" - i te należy poczytać

Ja odsyłam na początek do RFC 2045 (który, swoją drogą jest uaktualniony przez 2184, 2231, 5335), do punktu "6.2. Content-Transfer-Encodings Semantics"

Z tego punktu (a także z p.6) wynika, że: jeśli przesyłasz conajwyżej znaki z górnej połówki ASCII (kody 128-255), możesz użyć kodowania "8bit". Przydatne przy kodowaniu polskich liter w iso8859-2 (kiedyś ten standard był dość powszechny). W dzisiejszych czasach jest to "do 998 znaków pomiędzy wystąpieniami CRLF" (p.2.8 w RFC 2045, choć wywodzi się to po części z czasów RFC821). Nie jesteś w stanie zagwarantować tego w formatach typowo binarnych (grafika, muzyka, archiwa etc). Wniosek jest prosty - do tych typów danych kodowanie 8bit nie będzie wyborem.

Kolejna rzecz, to wybór odpowiedniego "content-encoding". Lista oficjalna jest w p. 6.1. Jeśli ją przejrzysz, dostaniesz listę content encoding:
1. 7bit
2. 8bit
3. binary
4. quoted-printable
5. base64
6. ietf-token / x-token

Pierwsze dwa można skreślić. Ostatni jest używany do "voice messages", więc też skreślamy. base64 nie lubisz, więc skreślmy. Zostaje "binary" i "quoted-printable". O quoted-printable można powiedzieć tylko tyle, że jeśli znak jest spoza zakresu "7bit", to zapisuje ten znak w postaci trzech, np. znak o ASCII=255 zapisze jako "=FF". Przy binarkach wychodzi potrojenie objętości. Koszmar, bo base64 daje narzut rzędu kilkunast procent, a nie 33%.

Zostaje nieszczęsny "binary"... Co z nim? Odpowiedź nie jest prosta. Można, pod pewnymi warunkami. Warunki opisane są w RFC6152. W skrócie:
- serwer odbierający musi być RFC6152-compliant (w fazie negocjacji na komendę EHLO musi dać odpowiedź "250 8BITMIME")
- koniec danych binarnych trzeba jakoś zasygnalizować - tuż po zakończeniu bloku danych należy wysłać CR, LF, "." CR, LF (w sumie 5 znaków) lub trzy sekwencje ".", CR, LF (w sumie 9 znaków).

Niestety - nadal obowiązuje RFC5321 (patrz p.2.4 tegoż RFC), więc limit tysiąca znaków w linii (u nich nazywane jako "between two CRLF pairs"), a ponadto nieco dalej napisali: This restriction means that this extension provides the necessary facilities for transferring a MIME object with the 8BIT content-transfer-encoding, it DOES NOT provide a means of transferring an object with the BINARY content-transfer-encoding.

Wychodzi na to, że jeśli chcesz być "legalny", to zostaje Ci base64. Choć większość serwerów powinna umieć sobie poradzić z dłuższymi niż 1KB ciągami binarnymi... Kurde, jak mnie najdzie, to sobie potestuję... smile.gif
wNogachSpisz
Dobrze prawisz.

http://www.yenc.org/whatis.htm
Cytat
Transport of messages by Mail was restricted to US-ASCII characters when the protocols were written (20 years ago). These services have been created to transport only plain US-text. But because people wanted to send also binary attachments some 'tricks' were implemented: The binary was changed to "allowed US-ASCII-characters" Encoding makes a message 33%-40% longer.

Meanwhile Usenet is able to to transport more than "US-ASCII", it could also transport other characters. Just a few special characters are still forbidden. Unfortunetaly the encodings were never changed. We are all still using BASE64, BinHex, UUencode. We are all wasting every day bandwidth, time, diskspace and money.

yEnc is now a proposed encoding method which is using the fact that news-servers can today transport binaries more efficient. On eMail the situation is far more complicated because there are a lot of older programs and computers involved. But also there would be potential for savings.

To jest chyba odpowiedź.. czas na testy.

http://www.yenc.org/yEnc-draft-1.txt
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.