Avatar billede riefart Seniormester
07. februar 2016 - 21:07 Der er 11 kommentarer og
1 løsning

Email-server der ikke understøtter utf8.

Jeg har en kunde som bruger windowsmail- og det gør andre af hendes brugere i hendes webshop sikkert også. Når hun modtager mails fra sin shop som har utf8 som tegnsæt ser hendes mails sådan ud:
Content-type: text/html; charset=UTF-8
From: kundens hjemmeside <info@hjemmeside.dk>
Message-Id: <20160205082738.AD4B4E6AABA@serverx.domaindirect.dk>
Date: Fri,  5 Feb 2016 09:27:38 +0100 (CET)

Ordrenr 139 / ordredato: 05.02-2016 <br />Bestilling afgivet af:<br /><div style=>riefart</div><div>torben</div><div style=> Att. torben</div><div>vejnavn 33</div><div>3730   nexø</div><div>kontakt@kunden.dk</div><div>Tlf. 11111111</div> <table class='tabel'><tr style='font-weight:bold;'><td width='30%'>Produkt</td><td width='10%'>Produktnr.</td><td width='10%'>Antal</td>
....osv.

Når hun ser den på eks. Iphone er der ingen problemer.

Jeg bruger følgende php mailscript:
$modtager="info@kundens_domæne.dk";                   
            $overskrift="Bestilling fra webshoppen.";
            $indhold="$del0 $del1 $del2 $del3 $del4 $del5";
            $header ="MIME-Version: 1.0\r\n";
            $header .="Content-type: text/html; charset=UTF-8\r\n";
            $header .="From: kundens webshop <info@hjemmeside.dk>";
            $sent=mail($modtager, $overskrift, $indhold, $header);

Hvad kan jeg gøre, for at sikre, at uanset om mailserveren er indstillet til utf8 eller et andet tegssæt, vises mailen koorekt?
Avatar billede olsensweb.dk Ekspert
07. februar 2016 - 21:19 #1
hvad med at lave en base64 encoding
http://php.net/manual/en/function.base64-encode.php

kig på functionen mail_utf8
olebole's vertion http://www.eksperten.dk/spm/961816#reply_7937170
den på php.net http://php.net/manual/en/function.mail.php#108669
Avatar billede riefart Seniormester
07. februar 2016 - 21:37 #2
Hvordan skal jeg konkret ændre min funktion. Kan du hjælpe her?
Avatar billede jakobdo Ekspert
07. februar 2016 - 21:40 #3
Jeg ville nok "bare" hente swiftmailer eller phpmailer.
Så skal du ikke "selv" rode med alle mulige headers og lign.
Avatar billede riefart Seniormester
07. februar 2016 - 22:09 #4
Kan du hjælpe mig videre jakobdo. Hvad er den enkleste løsning, og hvordan kommer jeg igang?
Avatar billede jakobdo Ekspert
07. februar 2016 - 22:15 #5
Kig her:
http://swiftmailer.org/docs/messages.html
http://swiftmailer.org/docs/sending.html

Hvad jeg umiddelbart kan læse, så kører swiftmailer default utf-8.
Avatar billede olsensweb.dk Ekspert
08. februar 2016 - 10:16 #6
>Hvordan skal jeg konkret ændre min funktion. Kan du hjælpe her?
dette:

$modtager="info@kundens_domæne.dk";                   
$overskrift="Bestilling fra webshoppen.";
$indhold="$del0 $del1 $del2 $del3 $del4 $del5";
$header ="MIME-Version: 1.0\r\n";
$header .="Content-type: text/html; charset=UTF-8\r\n";
$header .="From: kundens webshop <info@hjemmeside.dk>";
$sent=mail($modtager, $overskrift, $indhold, $header);



skiftes ud med dette

require_once("mail_utf8.php");
$modtager="info@kundens_domæne.dk"; 
$overskrift="Bestilling fra webshoppen.";
$indhold="$del0 $del1 $del2 $del3 $del4 $del5";
$fra = "kundens webshop <info@hjemmeside.dk>";
$sent=mail_utf8($modtager, $overskrift, $indhold, $fra);


kopieret fra http://www.eksperten.dk/spm/961816#reply_7937170
mail_utf8.php

function escapeAddr($addr) {
    $check = preg_match('/(.*)<(.*)>/', $addr, $a);
    if ($check) $addr = '=?UTF-8?B?'.base64_encode($a[1]).'?= <'.$a[2].'>';
    return $addr;
}
function mail_utf8($to, $subject='Intet emne', $message='', $from='', $cc='', $bcc='', $type='plain') {
    $from = escapeAddr($from);
    $header = 'From: '.$from.PHP_EOL
            . 'Return-Path: '.$from.PHP_EOL
            . 'Reply-To: '.$from.PHP_EOL
            . 'MIME-Version: 1.0'.PHP_EOL
            . 'Content-type: text/'.$type.'; charset=UTF-8'.PHP_EOL
            . 'X-Mailer: PHP/'.phpversion().PHP_EOL
            . 'Content-Transfer-Encoding: 8bit'.PHP_EOL;
    if ($cc!='') $header .= 'Cc: '.escapeAddr($cc).PHP_EOL;
    if ($bcc!='') $header .= 'Bcc: '.escapeAddr($bcc).PHP_EOL;
    $header .= PHP_EOL;
    return mail($to, '=?UTF-8?B?'.base64_encode($subject).'?=', $message, $header);
}


>Så skal du ikke "selv" rode med alle mulige headers og lign.
det skal du heller ikke med de 2 mail_utf8 functioner jeg linkede til.
Avatar billede riefart Seniormester
08. februar 2016 - 19:58 #7
Bare lige kort fra SpørgeJørgen her...er $addr modtagerens email?
I $header er $from vel angivet som hjemmesideejers navn/email, hvis mail er sendt af kunde fra hjemmesiden skal $from i Reply-to, så ikke erstattes med kundens navn/email?
Avatar billede olsensweb.dk Ekspert
08. februar 2016 - 20:36 #8
>er $addr modtagerens email?
function escapeAddr($addr) er en hjælpe function, der anvendes af mail_utf8, den encoder de problematiske fornavn efternavn i en mail addresse,
feks Åge Æske Sørensen <aage_aeske_sorensen@test.dk>

det bruges på flere felter, derfor er det lavet som en lille function

>$from i Reply-to, så ikke erstattes med kundens navn/email?
skal selvføgelig være den der afsender mailen dvs $from


men prøv coden af og se om det virker for dig
Avatar billede arne_v Ekspert
09. februar 2016 - 01:53 #9
Hvorfor bruge Base64 til header vaerdier?

(quoted printable synes noget mere oplagt)
Avatar billede arne_v Ekspert
09. februar 2016 - 01:54 #10
Og hvad trigger problemet?

Brug af danske tegn i header?

Brug af danske tegn i body?

Angivelse af UTF-8 i content type?

Angivelse af UTF-8 i content type uden content encoding 8bit?
Avatar billede riefart Seniormester
09. februar 2016 - 21:17 #11
Ronols: det virker fint. Tak for hjælpen. Læg et svar.
Avatar billede olsensweb.dk Ekspert
09. februar 2016 - 21:28 #12
får du her
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester