Content-Transfer-Encoding ?
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?
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.
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?
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?
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)
1
2
3
4
5
6
7
8
9
10
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);
?>
$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
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?
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.
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?
RFC 2045 en RFC 2046.
En ja, als het goed is is quoted_printable_encode() hier prima voor geschikt.
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 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
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?
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.
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?
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.
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)
1
2
3
4
5
6
7
8
9
10
11
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>.
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?
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.
Oké, dan had ik het goed begrepen. Ik ga ermee aan de slag. Thanks Ben!
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?
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.
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."?