Προς το περιεχόμενο

Php ελληνικά χρησιμοποιώντας την mail()


lepass_7

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας παιδία, έφτιαξα μια απλή φόρμα(html) που περνει το όνομα τηλέφωνο email και το κυρίως θέμα και χρησιμοποιώντας php στέλνει τα στοιχεια στο email μου. Το πρόβλημα είναι τα ελληνικά, δηλάδη αν κάποιος γράψει με ελλήνικους χαρακτηρές τα πιο πάνω όταν παίρνω το email οι χαρακτήρες που μου βγάζει είναι αστα να πάνε....

ο κώδικας είναι:

<?php

if(array_key_exists('send', $_POST)){

$to='ΤΟ EMAIL ΜΟΥ';

$subject='Μήνυμα από ιστοσελίδα';

$name=$_POST['name'];

$email=$_POST['email'];

$tel=$_POST['tel'];

$info=$_POST['info'];

 

$message="Όνομα: $name\n\n";

$message.="Email αποστολέα: $email\n\n";

$message.="Τηλέφωνο: $tel\n\n";

$message.="Θέμα: \n $info";

 

$message=wordwrap($message, 500);

 

$mailsent=mail($to, $subject, $message);

 

}

?>

Υπάρχει κάποιος τρόπος να το διορθώσω;

ευχαριστώ

Δημοσ.

Οι χαρακτήρες μπορεί να αντιπροσωπεύονται ψηφιακά με διάφορα character encoding sets (2ο link). Τα παραδοσιακά έχουν χωρητικότητα 1 byte (δηλαδή υπάρχουν τόσοι διαφορετικοί χαρακτήρες όσοι πιθανοί συνδυασμοί bits σε ένα byte, 256), οπότε δεν χωράνε όλους τους χαρακτήρες όλων των γλωσσών. Από (standardized) single byte encodings, Ελληνικά περιέχει η iso-8859-7. Πλέον όμως υπάρχει μια προσπάθεια ενοποίησης όλων των χαρακτήρων παγκοσμίως σε έναν πίνακα, το Unicode. Το Unicode έχει διάφορες υλοποιήσεις character encoding sets, αυτό που έχει επικρατήσει είναι το UTF-8 το οποίο έχει μεταβλητή χωρητικότητα 1-4 bytes (στη συγκεκριμένη ο κάθε ASCII χαρακτήρας καταναλώνει 1 byte και ο κάθε ελληνικός 2 bytes).

 

Τώρα στο πρόβλημα:

 

Όταν ο browser ανοίγει μια σελίδα, πρέπει να γνωρίζει ποια κωδικοποίηση να χρησιμοποιήσει για να ερμηνεύσει τους χαρακτήρες και για να στείλει χαρακτήρες. Αυτό μπορεί:

 

1) Να το βάλει ο χρήστης "καρφωτά" στον browser ως default ή ως υποχρεωτικό

2) Να το βάλει ο διαχειριστής του http server ως default ή ως υποχρεωτικό

3) Να το βάλει ο web developer στο <head> της html του όπως περιγράφεται εδώ.

 

Προφανώς η σωστή λύση η οποία θα παίξει σίγουρα αν δεν είναι κακορυθμισμένος ο server και ο client είναι το 3.

 

  • Λογικά αρκεί να ορίσεις στο <head> της σελίδας:
    ><meta http-equiv="Content-Type" content="text/html; charset=utf-8">

 

Όμως απ' όσο ξέρω η PHP δεν έχει κανονική υποστήριξη για Unicode, που σημαίνει ότι, αν δε θέλεις τα strings σου να αντιμετωπιστούν απλά ως ανόητες σειρές από bytes, όπως δε θέλεις στην mail, θα πρέπει να κάνεις μετατροπές ή να χρησιμοποιήσεις κάποιες έτοιμες "unicode-friendly" συναρτήσεις, αν υπάρχουν.

 

  • Τροποποίησε το php.ini σου, στο section [mbstring] ως εξής:
     
    >[mbstring]
    mbstring.language = Neutral
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = UTF-8
    mbstring.http_output = UTF-8
    mbstring.encoding_translation = On
    mbstring.detect_order = auto                                                                       
    mbstring.substitute_character = long;


    (αυτά μπορείς να τα περάσεις και από το script σου, αν δεν έχεις πρόσβαση στο php.ini)
     
     

  • Τροποποίησε το script σου ώστε να χρησιμοποιεί την mb_send_mail() αντί της mail() και πρέπει να είσαι εντάξει.

Δημοσ.
Οι χαρακτήρες μπορεί να αντιπροσωπεύονται ψηφιακά με διάφορα character encoding sets (2ο link). Τα παραδοσιακά έχουν χωρητικότητα 1 byte (δηλαδή υπάρχουν τόσοι διαφορετικοί χαρακτήρες όσοι πιθανοί συνδυασμοί bits σε ένα byte, 256), οπότε δεν χωράνε όλους τους χαρακτήρες όλων των γλωσσών. Από (standardized) single byte encodings, Ελληνικά περιέχει η iso-8859-7. Πλέον όμως υπάρχει μια προσπάθεια ενοποίησης όλων των χαρακτήρων παγκοσμίως σε έναν πίνακα, το Unicode. Το Unicode έχει διάφορες υλοποιήσεις character encoding sets, αυτό που έχει επικρατήσει είναι το UTF-8 το οποίο έχει μεταβλητή χωρητικότητα 1-4 bytes (στη συγκεκριμένη ο κάθε ASCII χαρακτήρας καταναλώνει 1 byte και ο κάθε ελληνικός 2 bytes).

 

Τώρα στο πρόβλημα:

 

Όταν ο browser ανοίγει μια σελίδα, πρέπει να γνωρίζει ποια κωδικοποίηση να χρησιμοποιήσει για να ερμηνεύσει τους χαρακτήρες και για να στείλει χαρακτήρες. Αυτό μπορεί:

 

1) Να το βάλει ο χρήστης "καρφωτά" στον browser ως default ή ως υποχρεωτικό

2) Να το βάλει ο διαχειριστής του http server ως default ή ως υποχρεωτικό

3) Να το βάλει ο web developer στο <head> της html του όπως περιγράφεται εδώ.

 

Προφανώς η σωστή λύση η οποία θα παίξει σίγουρα αν δεν είναι κακορυθμισμένος ο server και ο client είναι το 3.

 

  • Λογικά αρκεί να ορίσεις στο <head> της σελίδας:
    ><meta http-equiv="Content-Type" content="text/html; charset=utf-8">

 

Όμως απ' όσο ξέρω η PHP δεν έχει κανονική υποστήριξη για Unicode, που σημαίνει ότι, αν δε θέλεις τα strings σου να αντιμετωπιστούν απλά ως ανόητες σειρές από bytes, όπως δε θέλεις στην mail, θα πρέπει να κάνεις μετατροπές ή να χρησιμοποιήσεις κάποιες έτοιμες "unicode-friendly" συναρτήσεις, αν υπάρχουν.

 

  • Τροποποίησε το php.ini σου, στο section [mbstring] ως εξής:
     
    >[mbstring]
    mbstring.language = Neutral
    mbstring.internal_encoding = UTF-8
    mbstring.http_input = UTF-8
    mbstring.http_output = UTF-8
    mbstring.encoding_translation = On
    mbstring.detect_order = auto                                                                       
    mbstring.substitute_character = long;


    (αυτά μπορείς να τα περάσεις και από το script σου, αν δεν έχεις πρόσβαση στο php.ini)
     
     

  • Τροποποίησε το script σου ώστε να χρησιμοποιεί την mb_send_mail() αντί της mail() και πρέπει να είσαι εντάξει.

 

Ευχαριστώ για την απάντηση. Την συνάρτηση που λες την mb_send_mail() την έχω χρησιμοποιήση και πάλι το email ποου πήρα δεν ήταν το επιθυμητό, αυτό έγινε χωρίς όμως να τροποποιήσω το php.ini. Μπορώ να τροποποιησώ το mbstring χρησιμοποιώντας την php?

Δημοσ.

Μπορείς να χρησιμοποιήσεις την mb_language() αντί να το ορίσεις στο php.ini. Δοκίμασε όπως αναφέρει στα παραδείγματα:

 

>mb_language("uni");
$body = chunk_split(base64_encode($content));
mb_send_mail("[email protected]", "Subject", $body);

 

(το περιεχόμενο του μηνύματος είναι στην $content)

Δημοσ.

Έκανα ότι μου είπες:

<?php

$content='ρε φιλε';

 

mb_language("uni");

$body = chunk_split(base64_encode($content));

mb_send_mail("To email μου", "Subject", $body);

 

?>

Και στο email πήρα αυτό: z4HOtSDPhs65zrvOtQ==

 

 

-----Προστέθηκε 11/1/2009 στις 11 : 08 : 36-----

 

 

Είχα ξεχάσει να αλλάξω την κωδικοποιήση της σελιδάς, αλλά πάλι τώρα που την άλλαξα: <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-7" />

Πάλι παίρνω αυτό: 8eUg9unr5Q==

Τ λες; Κάνω κάτι λάθος;

Δημοσ.

Χμ, νόμιζα ότι η mb_send_mail δεν κάνει αυτόματα encode σε base64 αλλά τακτοποιεί αυτόματα τους headers. Τώρα που το δοκίμασα βλέπω το αντίθετο :P

 

Εν πάσι περιπτώσει, δοκίμασα το εξής και δουλεύει:

 

>$charset='UTF-8';
$subject='Ελληνικοί Χαρακτήρες;';
$encoded_subject="=?$charset?B?".base64_encode($subject)."?=\n";
$to="[email protected]";
$body='τεστ;';
$headers="From: ".$from."\n"
   . "Content-Type: text/plain; charset=$charset; format=flowed\n"
   . "MIME-Version: 1.0\n"
   . "Content-Transfer-Encoding: 8bit\n"
   . "X-Mailer: PHP\n";
mail($to,$encoded_subject, $body,$headers);

Δημοσ.

Ελα ρε φίλε ευχαριστώ, τώρα μπηκα στο site να γράψω και έγω γιατί βρήκα την λύση και δουλεύει, θα δοκιμάσω και το δικό σου(στην ουσία τα ίδια κάναμε). Αυτό που δούλεψε σε εμένα είναι

>
<?php
if(array_key_exists('send', $_POST)){
	$to='To email μου';
	//$subject='Μήνυμα από ιστοσελίδα';
	$name=$_POST['name'];
	$email=$_POST['email'];
	$tel=$_POST['tel'];
	$info=$_POST['info'];
	
	//encoding settings
	[color="Red"]$headers  = 'MIME-Version: 1.0' . "\r\n";
	$headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
	$headers .= 'From: Webmaster <[email protected]>' . "\r\n"; 
	
	$subject = '=?utf-8?b?' . base64_encode(iconv('iso-8859-7', 'utf-8', 'Μήνυμα από ιστοσελίδα!')) . '?=';[/color]
	//checking
	
	
	$message="Όνομα: $name\n\n";
	$message.="Email αποστολέα: $email\n\n";
	$message.="Τηλέφωνο: $tel\n\n";
	$message.="Θέμα: \n $info";

	
	$mailsent=mail($to, $subject, $message);
	
}
?>

Ευχαριστώ για τον χρόνο σου

  • 1 χρόνο αργότερα...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...