Created
June 8, 2015 12:16
-
-
Save poizan42/2dff8c87ce6a5c0b3350 to your computer and use it in GitHub Desktop.
PHP q_encode
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Konverterer en streng til Q-encoding | |
En del spam filtrer ser ud til at regne det for mere sandsyneligt at en mail er spam hvis | |
subject og from er base64 encodet - og der er ingen grund til at udfordre skæbnen... | |
Q-encoding er en modificeret udgave af quoted-printable, som benyttes til mime headers | |
quoted-printable er beskrevet på wikipedia på http://en.wikipedia.org/wiki/Quoted-printable | |
forskellene der er i Q-encoding er beskrevet på http://en.wikipedia.org/wiki/MIME#Encoded-Word | |
Der er faktisk en funktion i php til at gøre dette - iconv_mime_encode - | |
denne encoder bare ikke alting korrekt (mellemrum som =20), | |
encoder ikke tegn som ; (adskilletegn mellem forskellige dele af headers) | |
og har ikke mulighed for at sætte gåseøjne (") rundt om f.eks. navn i From headers | |
rfc2822 sætter et maksimum på 998 tegn per linie, og anbefaler at de ikke er længere end 78 tegn, | |
da nogen klienter før i tiden havde problemer med linier længere end 78 tegn | |
I praksis er der ikke nogen mail klienter der gør noget ved lange linier i headeren (> 78 tegn), | |
og det giver ingen problemer i dag, så der er ingen grund til at tage højde for det. | |
- kbr november 2007 | |
*/ | |
function q_encode($str) { | |
/* | |
Sikre tegn. Stortset hvad gmail bruger bortset fra at ';', '@', '<' og '>' ikke er med | |
(; er adskille-tegn for dele af headers, og @<> er bare for at være sikker på at der | |
ikke er nogen dumme parsere der bliver forvirret...) | |
*/ | |
$safesymbols = '!"#%&/()`${[]}|^~*\'-.:,<>\\'; | |
$rstr = ''; | |
for ($i = 0; $i < strlen($str); $i++) { | |
$chr = $str{$i}; //det $i'ne tegn i $str | |
$chrv = ord($chr); //tegnets tegnkode | |
$chrvnext = @ord($str{$i+1}); //næste tegns tegnkode (0 hvis vi er ved sidste tegn - ord(null) = 0 (hvilket ikke er dokumenteret...)) | |
//linieskift skal altid encodes som =0A=0D (CR LF) | |
//hvis vi er ved CR og næste tegn er LF så springer vi CR over | |
if (($chrv == 10) && ($chrvnext == 13)) | |
continue; | |
else if (($chrv == 10) || ($chrvnext == 13)) | |
$rstr .= '=0A=0D'; | |
// mellemrum encodes som underscore | |
else if ($chr == ' ') | |
$rstr .= '_'; | |
else if ( (($chrv >= ord('a')) && ($chrv <= ord('z'))) || | |
(($chrv >= ord('A')) && ($chrv <= ord('Z'))) || | |
(($chrv >= ord('0')) && ($chrv <= ord('9'))) || | |
(strpos($safesymbols, $chr) !== false) ) | |
$rstr .= $chr; | |
else //alle andre tegn bliver encodet som =XX hvor XX er den hexadecimale tegnkode | |
$rstr .= '='.sprintf('%02X', $chrv); | |
} | |
return $rstr; | |
} | |
//konverterer en ikke 7bit ren streng til en gyldig mime header streng (bruger Q-encoding) | |
function mime_qenc($str, $charset = 'UTF-8') { | |
return "=?$charset?Q?".q_encode($str, true)."?="; | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment