Skip to content

Instantly share code, notes, and snippets.

@poizan42
Created June 8, 2015 12:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save poizan42/2dff8c87ce6a5c0b3350 to your computer and use it in GitHub Desktop.
Save poizan42/2dff8c87ce6a5c0b3350 to your computer and use it in GitHub Desktop.
PHP q_encode
/*
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