Avatar billede sparboon Nybegynder
13. juli 2012 - 14:07 Der er 13 kommentarer og
1 løsning

læsning af utf8 og ISO 8859-1 på webmail og i email-programmer

Jeg sender nyhedsbreve fra min hjemmeside via php's mail() funktion.
kodet i utf8.
Hos de fleste modtagere er der ingen problemer,
MEN
Når mail læses på nogle webmails( ofte squirrelmail) står danske tegn med utf8 tegn (ø=ø)
Når mails hentes hjem til mailprogammet, kan det samme være tilfældet
(f.eks på min gamle outlook xp)
Der er ingen problemer i 'body'.
Hvis jeg koder dem om til ISO 8859-1 bliver resultatet vendt om.

Er der nogen løsning, der dækker det hele?

kodeeksempel herunder:
<?php
function dktegn($text)
{
$dkc= array('æ','ø','å','Æ','Ø','Å');
$dkw= array('&aelig;','&oslash;','&aring;','&AElig;','&Oslash;','&Aring;');
$dkp=str_replace($dkc,$dkw,$text);
return $dkp;
}

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html;charset=utf-8' . "\r\n";
$headers .= 'From: Æble øre år <x@xx.xx>' . "\r\n";
$subject = 'Æble øre år';

//henter fra database og kører løkke

$message = '
<html><head><title>Æøå</title></head><body>
<p>Kære 'array.'</p>
<p>æøå</p>
</body></html>';
$message=dktegn($message);
$ails=mail($to,$subject,$message,$headers);
if($ails=='0')echo " $ails Mails sendt.";else echo " $i1 Mails sendt.";
?>
Avatar billede olebole Juniormester
13. juli 2012 - 15:14 #1
<ole>

Det script er helt utilstrækkeligt. Prøv denne funktion, jeg har skrevet til formålet ... og som virker:

<?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='') {
    $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/plain; 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);
}

// Eksempel på brug:
mail_utf8('modtager@gmail.com', 'Besked til dig', 'Indhold af mail', 'fra@domain.dk');
?>

/mvh
</bole>
Avatar billede sparboon Nybegynder
13. juli 2012 - 16:38 #2
Tak,
Din løsning klarer problemet med dktegn i subject,
men
I squirrelmail kommer der ingen afsender i fra-feltet.
Hentet til thunderbird:
from, Return-Path og Reply-To bliver mit hoveddomæne@minudbyder.xx

og mailsene skal kunne besvares og vise 'æøå<xx@mitunderdomæne.xx>' - helst kun æøå.
Det blir ikke bedre, hvis jeg undlader funktionen escapeAddr($addr).

ændret er filen:
<?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='') {
    $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/html; 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);
}
function dktegn($text)
{
$dkc= array('æ','ø','å','Æ','Ø','Å');
$dkw= array('&aelig;','&oslash;','&aring;','&AElig;','&Oslash;','&Aring;');
$dkp=str_replace($dkc,$dkw,$text);
return $dkp;
}

$from='æøå <x@xx.xx>';
$subject = 'æøå';
//henter fra database til array $ar2 og kører løkke
for($i=0;$i<=$i1;$i++)
{
// message
$message = 'ingen problemer';
$message=dktegn($message);
$to =$ar2[$i][1];
$ails=mail_utf8($to,$subject,$message,$header);
}
if($ails=='0')echo " $ails Mails sendt.";else echo " $i1 Mails sendt.";
?>
Avatar billede olebole Juniormester
13. juli 2012 - 16:54 #3
Hvis du har behov for funktionen dktegn, formoder jeg, der er rod i dit (dine) tegnsæt. Det bør ikke være nødvendigt, hvis det faktisk er utf-8 kodet tekst, du sender.

Vi er nødt til først at være helt sikker på, hvad det er, du sender. Ellers når vi aldrig et tilfredsstillende resultat  =)
Avatar billede sparboon Nybegynder
13. juli 2012 - 17:20 #4
dktegn går kun på message og ændrer blot æøå til html-koder
- det er muligt, den  er unødvendig, hvis jeg koder anderledes, men hvis den vises i en mailklient, der ikke er sat til utf8 kan de alligevel læse indholdet.

Jeg sender nyhedsbreve ud til en lokal filmklub.
samt automatisk svar, hvis nogen har glemt kode eller skal oprettes som brugere.

Biografen skal stå som afsender og evt. svar skal komme til klubbens mailbox.

Hjemmesiden ligger som underdomæne under mit private domæne.
Avatar billede sparboon Nybegynder
13. juli 2012 - 17:30 #5
men du har ret olebole
dktegn er unødvendig - den er kun skadelig, fordi den viser html-tegnene hvis brugeren har indstillet til at åbne som tekst.

så en tak mere - væk med dktegn.
Avatar billede olebole Juniormester
13. juli 2012 - 17:51 #6
Cool, så er der altså tale om utf-8  *o)

Uden at have testet, går jeg udfra, du slipper for problemerne, hvis du bruger escapeAddr på from-adressen
Avatar billede sparboon Nybegynder
13. juli 2012 - 18:14 #7
næ,
Der er stadig et tomt fra-felt på webmailen
og mit domænenavn@minudbyder.dk i fra-feltet på thunderbird.

koden er nu (som test, hvor det eneste, der er faket er min email) :

<?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='') {
    $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/html; 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);
}
$from='x@xx.dk';
$subject = 'æøå';
$message = '<html><head> <title>ÆØÅ</title></head><body><p>æøå</p></body></html>';
$to ="x@xx.xx";//$ar2[$i][1];
mail_utf8($to,$subject,$message,$header);
?>
Avatar billede olebole Juniormester
13. juli 2012 - 18:25 #8
Jeg kan ikke svare på, hvad der sker. Jeg har aldrig selv haft problemer med scriptet, og jeg kender i hvertfald 5-7 andre, som bruger scriptet på et hav af sider uden problemer.

Jeg har på fornemmelsen, du ikke fortæller alt - eller at du ikke er helt præcis. Jeg kan f.eks. se, at dit oplyste afsenderformat er forskelligt i #2 og i #7
Avatar billede sparboon Nybegynder
13. juli 2012 - 18:52 #9
Ja jeg fortæller ikke from adressen eller modtageradressen.
så når # 2 og #7 er forskellige er det fordi jeg har uploadet scriptet
testet det
copypastet det på eksperten og anonymiseret det. men kun from og to

Den webmail jeg benytter ligger hos Danskkabeltv, som har overtaget den fra arrownet. Den er ikke opdateret længe - og jeg bruger den kun til test af hvordan nogle får mails endnu.

Hvis jeg tar et klip fra den mail jeg fik fra eksperten.dk:
står der ca 15 linjer nede:

Date: Fri, 13 Jul 2012 18:30:01 +0200
To: MIG
From: Eksperten mailrobot <noreply@idg.dk>
Subject:


på den jeg modtager via scriptet (ligger på exaweb) står der på samme position:

Date: Fri, 13 Jul 2012 18:04:04 +0200
Message-Id: <E1SpiLc-0007NX-0M@server1.adnecto.dk>
To: MIG
Subject:

Det er den der
From: tekst <mailadresse>
Jeg ikke får.
Avatar billede olebole Juniormester
13. juli 2012 - 19:51 #10
Nej, det er ikke derfor, de ikke er ens. Selve formatet på det, du skriver i de to afsender felter er forskelligt.

Og så er spørgsmålet, om den webmail, du sender til, overhovedet understøtter utf-8. Ellers giver det jo ikke mening. Det ville svare til at hælde diesel på en benzinbil  =)
Avatar billede sparboon Nybegynder
13. juli 2012 - 20:24 #11
Er de her:
$from='æøå <x@xx.xx>';
$from='x@xx.dk';

Jeg fjernede teksten foran, for at undgå problemer.

Nej, jeg er ret sikker på at webmailen ikke understøtter utf8
- det har jeg aldrig ment den gjorde.
- dog undrer det mig at jeg kan se Æøå på den på de mails,der er sendt i utf8 fra hjemmesiden - både i subject og body (med din hjælp).

Det der med diesel på en benzinbil var mit oprindelige spørgsmål
-det var i hvert fald det jeg mente jeg spurgte om:

om der var en vej så emails både kunne læses af en ikke utf8 mailclient og en ikke iso 8859-1.

Hvis du siger at der ikke findes brændstof som både benzinbiler og dieselbiler kan køre på, har jeg jo fået svar på mit spørgsmål. Og i tilgift fået danske tegn i subject.
Vil du ikke sende et svar, så jeg kan se om jeg kan finde ud af at uddele point?

Jeg tror afsender og svar-til problemet ligger i at domænet er et underdomæne (parkeret - hedder det vist). Men det var ikke spørgsmålet- det blir det nok næste gang.
Mange tak for hjælpen
søren
Avatar billede olebole Juniormester
13. juli 2012 - 20:30 #12
"Jeg tror afsender og svar-til problemet ligger i at domænet er et underdomæne" >> Det er slet ikke usandsynligt. Man er med tiden blevet nødt at foretage alle mulige krumspring for at hindre alt, der bare kan minde om spam (uden at jeg dog tror, det er, hvad du har gang i). Derfor er mange opsætninger ret hysteriske med from og reply-to adresser  *o)

Ellers tak, jeg samler ikke point. Læg selv et svar og accepter det, så tråden lukkes  =)
Avatar billede sparboon Nybegynder
13. juli 2012 - 20:37 #13
Mange tak for hjælpen  Olebole
og for pointene :-)
Avatar billede olebole Juniormester
13. juli 2012 - 20:58 #14
Selvtak  =)
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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