Content-Transfer-Encoding ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

21/09/2016 02:47:30
Quote Anchor link
Ik ben benieuwd of iemand mij in Jip en Janneke taal kan uitleggen wat "Content-Transfer-Encoding" inhoudt. Ik ben ermee aan het experimenteren, maar ik begrijp niet goed waar het voor dient. Van de uitleg op internet word ik helaas ook niet veel wijzer, want die is me veel te technisch en snap ik niet.

Als ik vanaf mijn server een mail verstuur dan kan ik "Content-Transfer-Encoding" toevoegen als header, maar ik weet niet of dat überhaupt nodig is. Als ik 'm niet toevoeg gaat het namelijk gewoon goed.

Echter, ik zie in veel mails die ikzelf ontvang Content-Transfer-Encoding op 'base64' ingesteld staan. Ik heb dat bij mijn eigen mail ook eens geprobeerd, maar dan wordt de mail totaal onleesbaar met allerlei rare vierkantjes. Als ik Content-Transfer-Encoding instel op x-token dan gaat het goed, maar als ik Content-Transfer-Encoding instel op quoted-printable dan werkt de link in de mail ineens niet meer.

Mijn vraag is ... waar dient Content-Transfer-Encoding voor? Moet ik het wel of niet instellen, en zo ja op welke waarde?

Oh ja ... Content-Type heb ik ingesteld op 'text/html; charset=utf-8'.

Wie kan me wat meer vertellen?
 
PHP hulp

PHP hulp

26/12/2024 21:31:40
 
Ward van der Put
Moderator

Ward van der Put

21/09/2016 09:11:57
Quote Anchor link
Je kunt het zo zien:

transfer(content)

Of algemener:

response(document)

De content kan een andere encoding hebben dan de transfer waarin de content is verpakt. In jouw voorbeeld is dat een e-mail gecodeerd in UTF-8 die is opgenomen in een SMTP-bericht gecodeerd in Base64.
 
Ozzie PHP

Ozzie PHP

21/09/2016 13:46:57
Quote Anchor link
>> In jouw voorbeeld is dat een e-mail gecodeerd in UTF-8 die is opgenomen in een SMTP-bericht gecodeerd in Base64.

Probleem is dat dat dus niet werkt. Als ik Content-Transfer-Encoding instel op base 64, dan wordt de mail onleesbaar. Ik krijg dan alleen een hoop vierkantjes te zien.

Ik mis nog het antwoord óf en waarom ik Content-Transfer-Encoding zou moeten gebruiken. Als ik het niet gebruik, dan gaat het gewoon goed. Als ik het instel op x-token dan gaat het ook goed. Maar ik weet nu dus niet wat ik moet doen. Moet ik het überhaupt instellen, en zo ja ... op welke waarde?
 
Ward van der Put
Moderator

Ward van der Put

21/09/2016 14:17:04
Quote Anchor link
Ik neem aan dat je niet alleen de header aanpast maar ook base64_encode() gebruikt?

Send Base64 Encoded Email with PHP

De hoofdreden is dat Base64 gewoon in ASCII gecodeerd is en je daarmee problemen met karaktersets voorkomt. Vroegâh kon je voor de zekerheid zo zelfs cookies beter in ASCII coderen. Maar of dat nog steeds opgaat?
 
Ozzie PHP

Ozzie PHP

21/09/2016 16:20:17
Quote Anchor link
>> Ik neem aan dat je niet alleen de header aanpast maar ook base64_encode() gebruikt?

Nee, dat heb ik niet gedaan.

Maar de grote vraag is ... moet dat? Ik bouw nu dus gewoon een message op, en dan aan het eind doe ik wordwrap.

Een voorbeeldje:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

$message
  = '<html>';
$message .= '<body>';
$message .= 'Dit is een <strong>test</strong>.';
$message .= '</body>';
$message .= '</html>';
$message  = wordwrap($message, 70);

?>

Content-Type stel ik in op 'text/html; charset=utf-8'.

Dit lijkt prima te werken. Ik heb dus geen encoding toegepast, en ik weet ook niet of dat noodzakelijk is.

???
Gewijzigd op 21/09/2016 16:22:17 door Ozzie PHP
 
Ben van Velzen

Ben van Velzen

21/09/2016 17:10:15
Quote Anchor link
De encoding wordt gebruikt om mails te encoden, bijvoorbeeld met quoted-printable of de eerder genoemde base64. De header zelf geeft aan in welke encoding je je data gezet hebt, een plaatje zal bijvoorbeeld base64 zijn, tekst meestal quoted-printable. Sterker nog: wanneer je je tekst elementen met base64 encoding doet wordt deze eerder opgepikt door spamfilters als ongeldig.

Lang verhaal kort: als je niet weet waar het voor dient, gewoon niet gebruiken.
 
Ozzie PHP

Ozzie PHP

21/09/2016 17:24:18
Quote Anchor link
>> Lang verhaal kort: als je niet weet waar het voor dient, gewoon niet gebruiken.

Oké ... dus ik hoef én mijn bericht niet te encoden én dus ook geen Content-Transfer-Encoding in te stellen? Correct?

>> tekst meestal quoted-printable

Als ik dit gebruik bij html tekst, dan is m'n links niet meer aanklikbaar. De html-tags worden blijkbaar dus gestript. Kan dat kloppen? Is dit dan wel geschikt (en nodig?) voor plain tekst? Of ook niet?
 
Ben van Velzen

Ben van Velzen

21/09/2016 18:10:22
Quote Anchor link
Het zou bij normale HTML gewoon moeten werken, maar je moet ook coderen *als* quoted-printable. Je kunt niet gewoon een Content-Transfer-Encoding header toevoegen, je moet de encoding ook uitvoeren. De header is niet meer dan informatie voor de client, die de content moet decoden.
 
Ozzie PHP

Ozzie PHP

21/09/2016 20:20:22
Quote Anchor link
>> Het zou bij normale HTML gewoon moeten werken, maar je moet ook coderen *als* quoted-printable.

Ah oke ... ik heb dus mijn html ... die moet ik dus coderen als quoted-printable, en vervolgens kan ik dan die Content-Transfer-Encoding toepassen. Tot zover volg ik het.

Maar er schieten me dan 2 vragen binnen ...

1) Waarom moet ik mijn html coderen als quoted-printable (wat is het voordeel t.o.v. als ik het niet doe.
2) Dat encoden gaat dan gewoon als volgt $message = quoted_printable_encode() neem ik aan? En hoef ik dan geen wordwrap meer toe te passen?
 
Ben van Velzen

Ben van Velzen

21/09/2016 20:37:31
Quote Anchor link
Het encoden is nodig om te voorkomen dat je client verward raakt over je mime boundaries, non printable characters etc. Hier zijn hele standaarden over geschreven. Zie RFC 2045 en RFC 2046.

En ja, als het goed is is quoted_printable_encode() hier prima voor geschikt.
Gewijzigd op 21/09/2016 20:38:47 door Ben van Velzen
 
Ozzie PHP

Ozzie PHP

21/09/2016 20:41:41
Quote Anchor link
Oké ... maar wat is dan de beste aanpak. Wat zijn de te nemen stappen? Ik heb eens quoted_printable_encode toegepast op plain tekst, en nu hakt ie m'n tekst in stukken op plekken waar het niet moet. Dat lijkt me niet kloppen.

Laat ik mijn vraag heel simpel stellen. Ik wil een mail versturen met html en plain test gescheiden door een boundary. Dat gaat allemaal goed. Is het verstandig om de html en de plain tekst te coderen, of is dat niet nodig? En als het wel nodig is, welke encoding gebruik ik dan het beste voor html en welke voor plain tekst?
 
Ben van Velzen

Ben van Velzen

21/09/2016 21:07:44
Quote Anchor link
Het is verstandig, maar je moet een afweging maken welke encoding je wil gebruiken. Base64 is eenvoudig, maar daardoor levert het je ook sneller een verhoogde spam score op. quoted-printable als PHP functie is nog wel eens buggy, een eigen implementatie werkt beter, en is alsnog eenvoudig zat. Daarnaast kun je soms ook nog wegkomen met 7bit als je geen speciale tekens gebruikt (eerste 128 tekens in de ASCII reeks), of 8bit als je alleen de 256 ASCII karakters gebruikt.

De meeste mailprogramma's doen gewoon heel simpel alle tekst parts zijn quoted-printable of 7bit, plaatjes of andere attachments zijn base64.

Is het niet veel eenvoudiger om gewoon iets als phpmailer of swiftmailer te gebruiken? Die doen dat werk gewoon zelf voor je.
 
Ozzie PHP

Ozzie PHP

21/09/2016 21:14:43
Quote Anchor link
>> Is het niet veel eenvoudiger om gewoon iets als phpmailer of swiftmailer te gebruiken? Die doen dat werk gewoon zelf voor je.

Als ik wat meer tijd heb, zal ik me daar eens in verdiepen.

Alles lijkt nu te werken ... ik het dat quoted printable toegepast op het plain tekst gedeelte. Dat gaat goed, maar als ik vervolgens wordwrap toepas hakt ie de mail op de verkeerde plek in stukken. Grrr ...

En als ik nu gewoon die hele encoding weglaat? Kan dat kwaad?
 
Ben van Velzen

Ben van Velzen

21/09/2016 21:27:24
Quote Anchor link
quoted printable doet volgens protocol zelf al wordwrapping, dat hoor je normaliter niet zelf te doen.

De encoding weglaten kan voor eenvoudige mails geen kwaad, dus enkelvoudig, geen mime, geen multipart, en hooguit 8bit dus geen unicode. Encoding niet toepassen op mails die niet aan die eisen voldoen leidt tot onvoorspelbaar gedrag, afhankelijk van de gebruikte client.
 
Ozzie PHP

Ozzie PHP

21/09/2016 22:00:32
Quote Anchor link
>> quoted printable doet volgens protocol zelf al wordwrapping, dat hoor je normaliter niet zelf te doen.

Oké ... even als laatste nog voor de duidelijkheid ... ik heb dus een mail met een plain tekst gedeelte en een html gedeelte ... Daartussen staat dan een boundary, en geef je Content-Type en Content-Transfer-Encoding aan, dus zeg maar zoiets:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
--abc123abc123
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

Dit is plain tekst.

--abc123abc123
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: quoted-printable

Dit is <strong>html</strong>.

Is het nu de bedoeling dat ik dit hele stuk (incl. Content-Type en Content-Transfer-Encoding)door de quoted_printable_encode() functie heen gooi, of alleen het plain tekst stukje en het html stukje?
 
Ben van Velzen

Ben van Velzen

21/09/2016 22:12:08
Quote Anchor link
Alleen de content, dus niet de headers. De headers zijn immers bedoeld voor de client om te bepalen hoe ze de mime parts moeten decoderen.
 
Ozzie PHP

Ozzie PHP

21/09/2016 23:49:57
Quote Anchor link
Oké, dan had ik het goed begrepen. Ik ga ermee aan de slag. Thanks Ben!
 
Ward van der Put
Moderator

Ward van der Put

22/09/2016 09:46:55
Quote Anchor link
Het valt mij op dat PHPMailer standaard Base64 gebruikt, voor berichten én bijlagen. Kijk maar eens in de repo:

https://github.com/PHPMailer/PHPMailer

Dat hebben ze vast niet voor niets gedaan.
 
Ozzie PHP

Ozzie PHP

22/09/2016 10:28:18
Quote Anchor link
Ik kan me voorstellen dat Base64 in meerdere/andere situaties werkt waar quoted-printable tekort schiet. Je zou dus kunnen zeggen dat Base64 altijd werkt, maar dat het in sommige situaties "overkill" is. Maar wellicht kan Ben hier nog iets over zeggen?
 
Ben van Velzen

Ben van Velzen

22/09/2016 11:07:55
Quote Anchor link
Uit mijn hoofd is de default 8bit, maar ik kan het uiteraard mis hebben. Base64 is eenvoudig, maar verbruikt al heel snel erg veel ruimte, en het is vaak onnodig tenzij je met binaire data te maken hebt. Quoted-printable is zuinig, maar iets minder eenvoudig dan base64. Nog zuiniger is uiteraard 7/8bit, maar dit werkt niet op regels die langer zijn dan de standaard aanwijst etc. Het is in die zin altijd een afweging.
 
Ozzie PHP

Ozzie PHP

22/09/2016 11:16:27
Quote Anchor link
@Ben

Thanks voor je aanvulling ... maar wat bedoel je met "zuinig" en "minder eenvoudig" als je zegt "Quoted-printable is zuinig, maar iets minder eenvoudig dan base64."?
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.