İçerik Aktarımı Kodlaması 7 bit veya 8 bit


88

E-posta içeriği gönderirken, "İçerik Aktarım Kodlaması" başlığının ayarlanması gerekir. Aldığım birçok e-posta başlığını gözlemledim. Bazı e-postalar "7bit" kullanırken bazıları "8bit" kullanıyor.

Bu ikisi arasındaki fark nedir? Hangisi önerilir? Bu başlıkları ayarlamak için e-posta gövdesine özel bir kodlama gerekiyor mu?


Bu başlığı ayarlamanın gerekli olduğunu sanmıyorum , değil mi? E-posta ile çalışmaya başladım ve onsuz e-postalar gördüm - çok basit, çok parçalı olmayan, ASCII-salt metin mesajları.
osullic

Yanıtlar:


283

Okuması biraz yoğun olabilir, ancak RFC 1341'in "İçerik Aktarımı-Kodlama" bölümü tüm ayrıntıları içerir:

http://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html

Durum daha da kötüye gidiyor. İşte özetim:

Arka fon

SMTP, tanımı gereği (RFC 821), postayı her biri 7 bitlik 1000 karakterlik satırlarla sınırlar. Bu, borudan aşağı gönderdiğiniz baytların hiçbirinin en önemli ("en yüksek dereceli") biti "1" olarak ayarlayamayacağı anlamına gelir.

Göndermek istediğimiz içerik, doğası gereği çoğu zaman bu kısıtlamaya uymayacaktır. Bir görüntü dosyası veya Unicode karakterleri içeren bir metin dosyası düşünün: Bu dosyaların baytlarının 8. biti genellikle "1" olarak ayarlanır. SMTP buna izin vermez, bu nedenle uyumsuzluğun üstesinden nasıl geldiğinizi açıklamak için "aktarım kodlaması" kullanmanız gerekir.

Content-Transfer-EncodingBaşlığın değerleri, bu sorunu çözmek için seçtiğiniz kuralı açıklar.

7Bit Kodlama

7bitbasitçe "Verilerim, her karakter için yalnızca daha düşük 7 biti kullanan US-ASCII karakterlerinden oluşuyor" anlamına gelir. Temel olarak, içeriğinizdeki tüm baytların zaten SMTP kısıtlamalarına uyduğunu ve bu nedenle özel bir muameleye ihtiyacı olmadığını garanti ediyorsunuz. Onu olduğu gibi okuyabilirsiniz.

Seçtiğinizde 7bit, içeriğinizdeki tüm satırların uzunluğunun 1000 karakterden az olduğunu kabul ettiğinizi unutmayın.

İçeriğiniz bu kurallara bağlı 7bitkaldığı sürece en iyi aktarım kodlamasıdır, çünkü fazladan çalışma gerekmez; baytları borudan çıktıkça okursunuz / yazarsınız. Ayrıca 7bitiçeriği göz önünde bulundurmak ve anlamlandırmak da kolaydır . Buradaki fikir, sadece "düz İngilizce metin" yazıyorsan iyi olacaksın. Ancak bu 2005'te doğru değildi ve bugün de doğru değil.

8Bit Kodlama

8bit"Verilerim genişletilmiş ASCII karakterleri içerebilir; standart US-ASCII 7 bitlik karakterlerin dışındaki özel karakterleri belirtmek için 8. (en yüksek) biti kullanabilir." Olduğu gibi 7bit, hala 1000 karakterlik bir satır sınırı var.

8bit, tıpkı 7bit, baytların telden yazıldıkları veya okundukları şekliyle aslında herhangi bir dönüşümü yapmaz. Bu, baytların hiçbirinin en yüksek bitin "1" olarak ayarlanmayacağını garanti etmediğiniz anlamına gelir.

7bitİçeriğinizde size daha fazla özgürlük verdiği için bu bir adım öteye geçiyor gibi görünüyor . Ancak, RFC 1341 şu bilgileri içerir:

Bu belgenin yayınlanması itibariyle, posta gövdelerine kodlanmamış 8 bitlik veya ikili verileri dahil etmenin meşru olduğu standartlaştırılmış İnternet aktarımları yoktur. Dolayısıyla, "8bit" veya "ikili" İçerik Aktarımı-Kodlamasının İnternette yasal olduğu hiçbir koşul yoktur.

RFC 1341 20 yıldan uzun bir süre önce çıktı. O zamandan beri kazanılmış ettik MIME Extensions 8bit içinde RFC 6152 . Ancak o zaman bile, satır sınırları hala geçerli olabilir:

Bu uzantının bir SMTP sunucusunun hat uzunluğunu sınırlama olasılığını ortadan kaldırmadığını unutmayın; sunucular bu uzantıyı uygulamakta özgürdür, ancak yine de satır uzunluğu sınırı 1000 sekizliden daha düşük değildir.

İkili Kodlama

binary8bitsatır uzunluğu kısıtlaması olmaması dışında aynıdır . Yine de istediğiniz herhangi bir karakteri ekleyebilirsiniz ve fazladan kodlama yoktur. 8bitRFC 1341'e benzer şekilde , bunun gerçekten yasal bir kodlama aktarım kodlaması olmadığını belirtir. RFC 3030 bunu BINARYMIME.

Yazdırılabilir Fiyat Teklifi

Uzantıdan önce, SMTP üzerinden 8BITMIMEyapılamayan içeriği göndermenin bir yolu olmalıydı 7bit. HTML dosyaları (1000 karakterden fazla satırı olabilir) ve uluslararası karakterler içeren dosyalar bunun güzel örnekleridir. quoted-printable(RFC 1341, Bölüm 5.1 tanımlanmıştır) şifreleyen bu işlemek üzere tasarlanmıştır. İki şey yapar:

  • US-ASCII olmayan karakterlerin yalnızca 7 bitlik karakterlerle temsil edilebilmeleri için nasıl kaçış yapılacağını tanımlar. (Kısa versiyon: eşittir işareti artı iki 7 bitlik karakter olarak görüntülenirler.)
  • Satırların 76 karakterden büyük olmayacağını ve bu satır kesmelerinin özel karakterler (daha sonra kaçılarak) kullanılarak temsil edileceğini tanımlar.

Quoted Printable, kaçan ve kısa satırlardan dolayı, bir insan tarafından okumaktan 7bitveya çok daha zordur 8bit, ancak çok daha geniş bir olası içerik yelpazesini destekler.

Base64 Kodlama

Verileriniz büyük ölçüde metin değilse (örn: bir görüntü dosyası), çok fazla seçeneğiniz yoktur. 7bitmasanın dışında. 8bitve binaryMIME uzantısı RFC'lerinden önce desteklenmiyordu. quoted-printableişe yarar, ancak gerçekten verimsizdir (her bayt 3 karakterle temsil edilecektir).

base64bu tür veriler için iyi bir çözümdür. Nispeten verimli olan 4 US-ASCII karakteri olarak 3 ham baytı kodlar. RFC 1341 ayrıca, base64kodlanmış verilerin satır uzunluğunu bir SMTP mesajına sığması için 76 karakterle sınırlar, ancak yalnızca sabit uzunluklarda rastgele karakterleri böldüğünüzde veya birleştirdiğinizde, bu yönetimi nispeten kolaydır.

En büyük dezavantajı, base64kodlanmış verilerin, altında yalnızca "düz" metin olsa bile, insanlar tarafından neredeyse tamamen okunamaz olmasıdır.


10
Bu harika bir cevap, keşke 100 kez oy verebilseydim! Yine de bir soru: bu kurallar ekler için geçerli mi? Örnek I, XML dosyasının içeriğinin UTF-8 verilerini içerdiği bir e-postaya eklenmiş bir XML dosyasıdır. Buradaki doğru yaklaşım nedir?
TrojanName

1
@TrojanName: Evet, bunlar ekler dahil tüm e-posta içeriği için geçerlidir. (Her şey sadece kapakların altındaki MIME "parçaları", ama bu başka bir hikaye.) Yine de içeriğinizi bir e-postaya almak için bir şekilde kodlamanız gerekecek.
Craig Walker

1
@TrojanName: Herhangi bir dosya, metin olarak kabul edilip edilemeyeceğine bakılmaksızın "ikili" bir dosyadır, bu nedenle BINARYMIME ve BINARY kullanılabilir (her şey için mevcut oldukları sürece). 7Bit, UTF-8 içeriğinizin içeriği temsil etmek için 8 bit'e ihtiyacı olduğu için iyi değildir. İçeriğinizin bir parçası olmayan satır uzunluğu sınırlamaları gerektirdiği için 8Bit iyi değildir.
Craig Walker

2
Bu, her ikisi de XML belgenizi başarıyla e-postanıza kodlayabilen Quoted Printable veya Base64 olarak kalır. Bunların her ikisinin de bir insanın ham formatta okumasını zorlaştıracağını unutmayın (Base64 okunamaz, QP zordur). Ancak insan tarafından okunabilirlik ikincil bir sorundur; her zaman onu deşifre etmeniz ve kodlamanız gerektiğini düşündüğünüz sürece, o zaman iyisiniz.
Craig Walker

2
Ekleme kısıtlamaları: 8 bitin, boş değerleri veya satır sonu olmayan CR'leri veya LF'leri içermemesi gerekir.
Maksimum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.