Avatar billede Jimmi_andersen Nybegynder
07. februar 2012 - 03:40 Der er 20 kommentarer og
1 løsning

Charset php

Hej "eksperter"

Jeg er ved igang med konventere min gamle hjemmeside til html5, og har en php mailform på min gamle hjemmeside som fungere fint.

Desværre har jeg problemer med æøå når jeg flytter formen over til et html5 dok. - problemet ligger i at når mailen er sendt fra mit website, modtager jeg den med kodetegn for æø og å i mit mailprogram - På selve websitet er der igen problemer med at vise æøå, da siden er kodet på forhånd.

Så jeg skal ha tilføjet noget i min php kode kunne jeg forestille mig. Har i nogen bud ?

Min php ser således ud.

<?php
if (isset($_POST['submit']))
{
if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
!empty($_POST['email']) &&    // tjek, at der er skrevet en e-mail-adresse
!empty($_POST['emne']) &&  // tjek, at der er skrevet et emne
!empty($_POST['besked']) &&  // tjek, at der er skrevet en besked

// her følger sikringen mod spambotter
!strpos($_POST['name'], "mobil.jalightandsound.dk") &&  // tjek, at dit domæne ikke er skrevet i feltet "navn"
!strpos($_POST['email'], "mobil.jalightandsound.dk") && // tjek, at dit domæne ikke er skrevet i feltet "email"
!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
!eregi("\r",$_POST['name']) &&  // tjek, at der ikke er "vogn-retur" i "navn"
!eregi("\n",$_POST['name']) &&  // tjek, at der ikke er "linjeskift" i "navn"
!eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i "email"
!eregi("\n",$_POST['email']))  // tjek, at der ikke er "linjeskift" i "email"

// er alt ok, fortsættes med afsendelse af mailen
{
  $headers="From: ".$_POST['name']."<".$_POST['email'].">";


  if (@$_POST['customer_copy'])
  {
  $headers .= "\r\nBcc: ".$_POST['email'];
  }
  $body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " . $_POST['name'] . ":\r\n\r\n" . $_POST['besked'];
  if (@mail("mobil@jalightandsound.dk", strip_tags($_POST['emne']),
  stripslashes(strip_tags($body)), $headers))
  {
  echo "<p>Tak for din kommentar.</p>";
  }
  else
  {
  echo "<p>Der opstod en teknisk fejl. Prøv venligst igen!</p>";
  }
}
else
{
  echo "<p>Et eller flere felter mangler at blive udfyldt!</p>";
}
}
?>
Avatar billede olsensweb.dk Ekspert
07. februar 2012 - 07:41 #1
prøv at sende en header med dit "Content-Type:text/html;charset=utf-8"
se feks http://php.net/manual/en/function.mail.php eks4
// To send HTML mail, the Content-type header must be set
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";


samt
krzysiek dot 333 at gmail dot com 02-Aug-2011 11:24
Sending messages with polish special characters:
<?php
function plmail($mail, $sub, $mes){
    $headers = "From: ExRobot <robot@example.com>\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/plain; charset=utf-8\r\n";
    $headers .="Content-Transfer-Encoding: 8bit";
 
    $mes=htmlspecialchars_decode($mes,ENT_QUOTES);//optional - I use encoding to POST data
    mail($mail, "=?utf-8?B?".base64_encode($sub)."?=", $mes, $headers);
}
?>
Page must be in utf-8 encoding.


ref http://stackoverflow.com/questions/2265579/php-e-mail-encoding
As far as I know PHP does not support UTF-8 as default encoding for its strings. You need to use the relevant encoding/handling functions for the encoding you would prefer.

Also add a 'Content-Type:text/html;charset=utf-8' to your email headers so the email clients will display the characters correctly (or replace with your encoding of choice).
Avatar billede Jimmi_andersen Nybegynder
07. februar 2012 - 16:48 #2
Det lykkedes mig at få sendt mailen afsted, og modtage den med ÆØÅ.
Dog vises der i frafeltet (på min modtaget mail) brugeres navn med efterfølgende tekst MIME-Version:1,0 altså for eks.

[fra Jimmi AndersenMIME-Version:1,0] Er det normalt ?

Min php ser nu således ud

<?php
if (isset($_POST['submit']))
{
if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
!empty($_POST['email']) &&    // tjek, at der er skrevet en e-mail-adresse
!empty($_POST['emne']) &&  // tjek, at der er skrevet et emne
!empty($_POST['besked']) &&  // tjek, at der er skrevet en besked

// her følger sikringen mod spambotter
!strpos($_POST['name'], "mobil.jalightandsound.dk") &&  // tjek, at dit domæne ikke er skrevet i feltet "navn"
!strpos($_POST['email'], "mobil.jalightandsound.dk") && // tjek, at dit domæne ikke er skrevet i feltet "email"
!strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
!eregi("\r",$_POST['name']) &&  // tjek, at der ikke er "vogn-retur" i "navn"
!eregi("\n",$_POST['name']) &&  // tjek, at der ikke er "linjeskift" i "navn"
!eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i "email"
!eregi("\n",$_POST['email']))  // tjek, at der ikke er "linjeskift" i "email"

// er alt ok, fortsættes med afsendelse af mailen
{


  $headers="From: ".$_POST['name']."<".$_POST['email'].">";
  $headers .= "MIME-Version: 1.0\r\n";
  $headers .= "Content-type: text/plain; charset=utf-8\r\n";
  $headers .="Content-Transfer-Encoding: 8bit";

  if (@$_POST['customer_copy'])
  {
  $headers .= "\r\nBcc: ".$_POST['email'];
 
  }
  $body .= "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " . $_POST['name'] . ":\r\n\r\n" . $_POST['besked'];
  if (@mail("mobil@jalightandsound.dk", strip_tags($_POST['emne']),
  stripslashes(strip_tags($body)), $headers))
  {
  echo "<p>Tak for din kommentar.</p>";
  }
  else
  {
  echo "<p>Der opstod en teknisk fejl. Prøv venligst igen!</p>";
  }
}
else
{
  echo "<p>Et eller flere felter mangler at blive udfyldt!</p>";
}
}
?>
Avatar billede olebole Juniormester
07. februar 2012 - 17:35 #3
<ole>

Prøv at tage udgangspunkt i flg. funktion:

<?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);
}
?>

Den plejer at virke uden problemer.

/mvh
</bole>
Avatar billede Jimmi_andersen Nybegynder
07. februar 2012 - 17:48 #4
Og hvor i min kode indsætter jeg det ?
Avatar billede olebole Juniormester
07. februar 2012 - 18:00 #5
Du kalder bare mail_utf8 med de informationer, du indsamler fra formen. Kik på, hvad funktionens argumenter hedder. Navnene er ret selvforklarende  =)
Avatar billede Jimmi_andersen Nybegynder
07. februar 2012 - 20:27 #6
Det er nemt hvis man ved det, men jeg forstår ikke hvad du mener desværre. Det er et vidt begreb, men hvis du eller nogen anden istedet viser mig hvordan koden skal sættes sammen, vil det være nemmere. Det vil spare en masse tid.
Avatar billede olsensweb.dk Ekspert
07. februar 2012 - 21:16 #7
ca sådan (utested)
<?php
if (isset($_POST['submit'])){
    if (!empty($_POST['name']) && // tjek, at der er skrevet et navn
    !empty($_POST['email']) &&    // tjek, at der er skrevet en e-mail-adresse
    !empty($_POST['emne']) &&  // tjek, at der er skrevet et emne
    !empty($_POST['besked']) &&  // tjek, at der er skrevet en besked

    // her følger sikringen mod spambotter
    !strpos($_POST['name'], "mobil.jalightandsound.dk") &&  // tjek, at dit domæne ikke er skrevet i feltet "navn"
    !strpos($_POST['email'], "mobil.jalightandsound.dk") && // tjek, at dit domæne ikke er skrevet i feltet "email"
    !strpos($_POST['name'], "@") && // tjek, at der ikke er et @ i "navn"
    !eregi("\r",$_POST['name']) &&  // tjek, at der ikke er "vogn-retur" i "navn"
    !eregi("\n",$_POST['name']) &&  // tjek, at der ikke er "linjeskift" i "navn"
    !eregi("\r",$_POST['email']) && // tjek, at der ikke er "vogn-retur" i "email"
    !eregi("\n",$_POST['email']))  // tjek, at der ikke er "linjeskift" i "email"

    // er alt ok, fortsættes med afsendelse af mailen
    {
        $subject = strip_tags($_POST['emne']);
        $from = $_POST['name']."<".$_POST['email'].">"; 
        $to = "mobil@jalightandsound.dk";   
        $message = "Den " . date("d/m y") . " kl. " . date("G:i") . " skrev " . $_POST['name'] . ":\r\n\r\n" . $_POST['besked'];
        $message = strip_tags($message); // $body
   
        if (@$_POST['customer_copy'])  {
            $cc = $_POST['email'];
            $status = mail_utf8($to, $subject, $message, $from, $cc);
        }
        else {
            $status = mail_utf8($to, $subject, $message, $from);
        }
   
        if($status){
            echo "<p>Tak for din kommentar.</p>";
        }
        else  {
            echo "<p>Der opstod en teknisk fejl. Prøv venligst igen!</p>";
        }
    }
    else{
        echo "<p>Et eller flere felter mangler at blive udfyldt!</p>";
    }
}
?>


og olebole's 2 functioner fra #3 skal selvføgelig ligge over denne code, evt i en extern fil man includerer
Avatar billede Jimmi_andersen Nybegynder
08. februar 2012 - 09:55 #8
Den opstilling virker ikke. Der er syntax fejl, og siden kan ikke vises når jeg oploader.
Avatar billede olsensweb.dk Ekspert
08. februar 2012 - 10:11 #9
kan du være mere preæcis med hvor syntax fejlen ligger ??, giver den et linje nummer ??

hvis du vil anvende bcc skal du sende parameteren for cc med over, dvs følgende 2 linje skal lave om
if (@$_POST['customer_copy'])  {
    $cc = $_POST['email'];
    $status = mail_utf8($to, $subject, $message, $from, $cc);
}
else {
    $status = mail_utf8($to, $subject, $message, $from);
}
       
til       
if (@$_POST['customer_copy'])  {
    $bcc = $_POST['email'];
    $status = mail_utf8($to, $subject, $message, $from, '', $bcc);

}
else {
    $status = mail_utf8($to, $subject, $message, $from);
}
Avatar billede Jimmi_andersen Nybegynder
08. februar 2012 - 11:30 #10
Der er syntaxfejl i anden linie som stater med if hvis jeg laver en copy paste af dit forslag #7
Avatar billede Jimmi_andersen Nybegynder
08. februar 2012 - 11:34 #11
Hvis ikke det lykkedes kan jeg godt leve med at der i i fra feltet på den modtaget mail står "afsendersnavn"efterfulgt afMIME-Version:1,0
Avatar billede Jimmi_andersen Nybegynder
08. februar 2012 - 11:43 #12
Se denne
http://www.mobil.jalightandsound.dk/mail.pdf
Mailen modtaes altså med den rigtige kodning

Men se I afsenderfeltet "Dorte HansenMIME-Version:1,0"
Avatar billede olsensweb.dk Ekspert
08. februar 2012 - 12:06 #13
>"afsendersnavn"efterfulgt afMIME-Version:1,0
kunne det tænkes der mangler et linjeskift i din code fra #2
$headers="From: ".$_POST['name']."<".$_POST['email'].">";
skulle se sådan ud
$headers="From: ".$_POST['name']."<".$_POST['email'].">\r\n";
som der også er vist af krzysiek dot 333 at gmail dot com 02-Aug-2011 11:24 i #1

#10
jeg kan ikke lige se den syntax fejl
kan du ikke lige lave et screen dunp at fejl beskeden og ligge den op
Avatar billede Jimmi_andersen Nybegynder
08. februar 2012 - 12:39 #14
Det løste problemet med et linieskift.
Opgave løst

Vil du stadig ha et screen af syntaxfejl ?
Avatar billede olsensweb.dk Ekspert
08. februar 2012 - 12:44 #15
>Vil du stadig ha et screen af syntaxfejl ?
ja, da jeg syntes det er en pænere løsning
Avatar billede Jimmi_andersen Nybegynder
08. februar 2012 - 13:04 #16
Jeg tror det var en fejl i min egen html kode som php koden ikke kunne sammen med. Men jeg prøvede at sætte din kode ind i en tom php side, og der viste den ikke nogen syntaxfejl.

Dog viser den blot en blank side uden svar resultat og sender ikke nogen email hvis jeg oploader
Avatar billede MagnusELH Nybegynder
16. februar 2012 - 19:00 #17
du kan også bare kopiere det hele og sætte det ind på notepad, og så tryk gem som.
og så bare gem den som det rigtige fil navn, men så inden du trykker gem, skal du ændre fil typen til UTF-8 og så gem, og erstat.

det vil hjælpe
Avatar billede olebole Juniormester
16. februar 2012 - 19:11 #18
@MagnusELH: Af flere grunde: Nej. Notepad er ikke velegnet til at gemme PHP-filer i, da den gemmer med BOM  =)
Avatar billede Jimmi_andersen Nybegynder
16. februar 2012 - 19:20 #19
problemet er allerede løst der er bare ikke afgivet point endnu
Avatar billede Jimmi_andersen Nybegynder
27. februar 2012 - 16:44 #20
Ronols vil du have point så jeg kan lukke emnet ?
Avatar billede olsensweb.dk Ekspert
27. februar 2012 - 16:51 #21
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