highwaykind Posted January 29, 2010 Share Posted January 29, 2010 When someone enters foreign characters (like Cyrillic text, and Japanese/Chinese probably gives the same problem) into the mail form, the email that arrives is all gibberish. For example this should read "test message from *name*" in Russian. ТеÑтовое Ñообщение от Корин I tried changing the header content-type thing from plain text to HTML but that didn't fix it. The script I'm using is one I found online for free (eternal thanks to its author some of the lines are in Dutch) Does anyone know how to let the form accept foreign characters? Thanks a lot in advance !! <? $your_email_address="theemail@whereitissentto.com"; if(empty($_GET) && empty($_POST)) { die('Ongeldige actie'); } // Emular register_globals on if (!ini_get('register_globals')) { $superglobales = array($_SERVER, $_ENV, $_FILES, $_COOKIE, $_POST, $_GET); if (isset($_SESSION)) { array_unshift($superglobales, $_SESSION); } foreach ($superglobales as $superglobal) { extract($superglobal, EXTR_SKIP); } } // to prevent header injection if (eregi("\r",$_POST['your_email_address']) || eregi("\n",$_POST['your_email_address'])){ exit; } // kick anyone whoever tried to inject a header in the form foreach( $_POST as $value ){ if( strpos($value,'Content-Type:') !== FALSE ){ exit; } } $fields = array_keys($_POST); function headfunction($url) { header ("Location: $url"); } // protect the variable $reserved_vars if(isset($reserved_vars)) { unset($reserved_vars); } $reserved_vars = array("css_file", "background_color", "background_image", "text_color", "link_color", "visited_link_color", "active_link_color", "font_name", "font_size", "highlight_color", "required_fields", "after_url", "check_email_address", "subject", "your_email_address", "env_report", "owner_name", "autoresponse", "response_subject", "response_mail", "dodosmail_header_file", "dodosmail_footer_file"); function include_dodosmail_header($dodosmail_header_file) { global $reserved_vars; foreach($reserved_vars as $reserved_var) { global $$reserved_var; } if(is_file($dodosmail_header_file)) { include_once($dodosmail_header_file); return; } else { echo "<html>\n"; echo "<head>\n"; echo "<title>\n"; echo "DodosMail\n"; echo "</title>\n"; if($css_file != "") echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$css_file\">\n"; echo "</head>\n"; echo "<body bgcolor=\"$background_color\" background=\"$background_image\" text=\"$text_color\" link=\"$link_color\" vlink=\"$visited_link_color\" alink=\"$active_link_color\">\n"; echo "<font face=\"$font_name\" size=\"$font_size\">\n"; } } function include_dodosmail_footer($dodosmail_footer_file) { global $reserved_vars; foreach($reserved_vars as $reserved_var) { global $$reserved_var; } if(is_file($dodosmail_footer_file)) { include_once($dodosmail_footer_file); return; } else { echo "</font>\n</body>\n</html>"; } } function dodosmail_error_handle($msg) { global $highlight_color; if(isset($highlight_color)) { $extra_begin = "<font color=\"".$highlight_color."\">"; $extra_end = "</font>"; } else { $extra_begin = "<span class=\"DodosMailErrorHighLight\">"; $extra_end = "</span>"; } return $extra_begin.$msg.$extra_end; } // checking required fields // in case they used comma and space, replace if(strstr($required_fields, ", ")) { $required_fields = str_replace(", ", ",", $required_fields); } else { $required_fields = $required_fields; } $required_fields = explode(",", $required_fields); for($i = 0; $i < count($required_fields); $i++) { $required_var_name = $required_fields[$i]; if(empty($$required_var_name)) { include_dodosmail_header($dodosmail_header_file); echo "<p class=\"DodosMailError\">Fout! - het verplichte veld ".dodosmail_error_handle($required_var_name)." is niet ingevuld.\n"; echo "<br /><br /><a href=\"javascript:history.back(1)\">Terug</a>\n"; echo "</p>\n"; include_dodosmail_footer($dodosmail_footer_file); exit; } } if($check_email_address == "yes" && !empty($email)) { if(!check_email($email)) { include_dodosmail_header($dodosmail_header_file); echo "<p class=\"DodosMailError\">Fout - het adres ".dodosmail_error_handle($email)." is niet geldig.\n"; echo "<br /><br /><a href=\"javascript:history.back(1)\">Terug</a>\n"; echo "</p>\n"; include_dodosmail_footer($dodosmail_footer_file); exit; } } for($i = 0; $i < count($fields); $i++) { $actual_var = $fields[$i]; if(in_array($actual_var, $reserved_vars)) { $inside_mail = $inside_mail; } else { if(is_array($$actual_var)) { $inside_mail.= "$actual_var: "; foreach($$actual_var as $actual_val) { $inside_mail.= "$actual_val "; } $inside_mail.= "\n"; } else { $actual_val = stripslashes($$actual_var); $inside_mail.= "$actual_var: $actual_val\n"; } } } // getting other information from the form $cname = gethostbyaddr($_SERVER[REMOTE_ADDR]); $inside_mail.= " ----------------------------------------------------------------------- SENDER INFO: IP: $_SERVER[REMOTE_ADDR] Computer Name: $cname Browser Type: $_SERVER[HTTP_USER_AGENT] Page Referer: $_SERVER[HTTP_REFERER] ----------------------------------------------------------------------- "; $headers .= "MIME-Version: 1.0\r\n"; $headers .= "X-Priority: 3\r\n"; $headers .= "X-MSMail-Priority: Normal\r\n"; $headers .= "X-Mailer: DodosMail 2.0 http://regretless.com/scripts/\r\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; //$headers .= "Date: ".date("R")."\r\n"; $headers .= "From: $name <$email>\r\n"; $success = mail($your_email_address, $subject, $inside_mail, $headers); if($success) { if($autoresponse == "yes") { $response_subject = stripslashes($response_subject); $response_mail = stripslashes($response_mail); mail($email, $response_subject, $response_mail, "From: $owner_name <$your_email_address>"); } if($after_url == "") { // out put send info include_dodosmail_header($dodosmail_header_file); echo "<p>\n"; echo "Het formulier is verzonden!</p><ul>"; for($i = 0; $i < count($fields); $i++) { $actual_var = $fields[$i]; if(in_array($actual_var, $reserved_vars)) echo ""; else { if(is_array($$actual_var)) { echo "<li>$actual_var: "; foreach($$actual_var as $actual_val) { echo "$actual_val "; } echo "</li>\n"; } else { $actual_val = stripslashes($$actual_var); echo "<li>$actual_var: $actual_val</li>\n"; } } } echo "</ul>\n<p></p>"; include_dodosmail_footer($dodosmail_footer_file); exit; } else { headfunction($after_url); } } else { include_dodosmail_header($dodosmail_header_file); echo "<p class=\"DodosMailError\">Fout - Het formulier is tijdelijk niet bruikbaar, gebruik ".dodosmail_error_handle($your_email_address)." om contact op te nemen.\n"; echo "<br /><br /><a href=\"javascript:history.back(1)\">Terug</a>\n"; echo "</p>\n"; include_dodosmail_footer($dodosmail_footer_file); exit; } function check_email($email) { if( (preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) || (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/',$email)) ) { return true; } return false; } ?> Quote Link to comment Share on other sites More sharing options...
ChemicalBliss Posted January 29, 2010 Share Posted January 29, 2010 You need to use special headers sent with the message to tell the program that reads it what it is, japanese, chinese, russian, any special characters has it's own charsets. For Example, this snippet i found on the net should let you send chinese text successfully. <?php //specify a character set $charset = "GB2312"; $to = 'example@example.com'; $subject = 'some chinese text' //this is the encoded subject; $encoded_subject = "=?$charset?B?".base64_encode($subject)."?=\n" ; $message = 'some chinese text'; //HEADERS $header .= "X-Mailer: Whatever you want\n"; $header .= "Return-Path: <someperson@example.com>\n"; $header .= "MIME-Version: 1.0\n"; $header .= "From: Some Person <someperson@example.com>\n"; //I believe that language code for chinese is cn $header .= "X-Accept-Language: cn\n"; //This header should make sure that the message has a Guobiao //encoding $header .= "Content-Type: text/plain; charset={$charset}\n"; //I'm not an expert, but depending on the character set you use //you may want to change the transfer encoding. //I found that GB2312 is 7 bit, so I believe you can //leave this header out. If you choose another encoding //make sure the transfer encoding is correct. //$header .= "Content-Transfer-Encoding: 8bit\n"; //Print error if mail doesn't work, otherwise print successful message if(!mail($to, $encoded_subject, $message, $header)) { echo "Error: Message not sent"; } else { echo "Message sent successfully!"; }; ?> -CB- Quote Link to comment Share on other sites More sharing options...
oni-kun Posted January 29, 2010 Share Posted January 29, 2010 Change charset to UTF-8. And use the following method: $message = utf8_encode('Pусскиа 俛俜保俞俟俠信俢俣俥俦 etc.'); Encoding it in UTF will ensure it is not read as ISO on client. Make sure the charset is UTF-8 as well. This will encode every language in a universal format. Mimetype has to be set as 1.0, and the header set to HTML. Quote Link to comment Share on other sites More sharing options...
highwaykind Posted January 29, 2010 Author Share Posted January 29, 2010 Wow, thanks for the quick replies! Maybe I should have mentioned that I'm a beginner..both the above suggestions are a little too complicated for me. (I can adjust things when they're logical or when there's a walkthrough..I can't 'create' things..) I was hoping for something to adjust in my existing script to get it to work. There is no $message that I can adjust, as far as I can tell. (the script works great with 'regular' text, it's only occasionally that people write in foreign characters..) I did change the 'View - character encoding' settings in my email (Thunderbird) which made the Cyrillic show up in the HTML message but I don't know if that will always work? Quote Link to comment Share on other sites More sharing options...
oni-kun Posted January 29, 2010 Share Posted January 29, 2010 Took a bit of coding/beautifying.. But try this with any language text: I ran it through a formatter, so I'm not sure if it'll run (it cleaned the lines up a bit) But I applied the header and utf8_encodings for you: <?php $your_email_address = "theemail@whereitissentto.com"; if (empty($_GET) && empty($_POST)) { die('Ongeldige actie'); } // Emular register_globals on if (!ini_get('register_globals')) { $superglobales = array( $_SERVER, $_ENV, $_FILES, $_COOKIE, $_POST, $_GET ); if (isset($_SESSION)) { array_unshift($superglobales, $_SESSION); } foreach($superglobales as $superglobal) { extract($superglobal, EXTR_SKIP); } } // to prevent header injection if (eregi("\r", $_POST['your_email_address']) || eregi("\n", $_POST['your_email_address'])) { exit; } // kick anyone whoever tried to inject a header in the form foreach($_POST as $value) { if (strpos($value, 'Content-Type:') !== false) { exit; } } $fields = array_keys($_POST); function headfunction($url) { header("Location: $url"); } // protect the variable $reserved_vars if (isset($reserved_vars)) { unset($reserved_vars); } $reserved_vars = array( "css_file", "background_color", "background_image", "text_color", "link_color", "visited_link_color", "active_link_color", "font_name", "font_size", "highlight_color", "required_fields", "after_url", "check_email_address", "subject", "your_email_address", "env_report", "owner_name", "autoresponse", "response_subject", "response_mail", "dodosmail_header_file", "dodosmail_footer_file" ); function include_dodosmail_header($dodosmail_header_file) { global $reserved_vars; foreach($reserved_vars as $reserved_var) { global $$reserved_var; } if (is_file($dodosmail_header_file)) { include_once ($dodosmail_header_file); return; } else { echo "<html>\n"; echo "<head>\n"; echo "<title>\n"; echo "DodosMail\n"; echo "</title>\n"; if ($css_file != "") echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$css_file\">\n"; echo "</head>\n"; echo "<body bgcolor=\"$background_color\" background=\"$background_image\" text=\"$text_color\" link=\"$link_color\" vlink=\"$visited_link_color\" alink=\"$active_link_color\">\n"; echo "<font face=\"$font_name\" size=\"$font_size\">\n"; } } function include_dodosmail_footer($dodosmail_footer_file) { global $reserved_vars; foreach($reserved_vars as $reserved_var) { global $$reserved_var; } if (is_file($dodosmail_footer_file)) { include_once ($dodosmail_footer_file); return; } else { echo "</font>\n</body>\n</html>"; } } function dodosmail_error_handle($msg) { global $highlight_color; if (isset($highlight_color)) { $extra_begin = "<font color=\"" . $highlight_color . "\">"; $extra_end = "</font>"; } else { $extra_begin = "<span class=\"DodosMailErrorHighLight\">"; $extra_end = "</span>"; } return $extra_begin . $msg . $extra_end; } // checking required fields // in case they used comma and space, replace if (strstr($required_fields, ", ")) { $required_fields = str_replace(", ", ",", $required_fields); } else { $required_fields = $required_fields; } $required_fields = explode(",", $required_fields); for ($i = 0; $i < count($required_fields); $i++) { $required_var_name = $required_fields[$i]; if (empty($$required_var_name)) { include_dodosmail_header($dodosmail_header_file); echo "<p class=\"DodosMailError\">Fout! - het verplichte veld " . dodosmail_error_handle($required_var_name) . " is niet ingevuld.\n"; echo "<br /><br /><a href=\"javascript:history.back(1)\">Terug</a>\n"; echo "</p>\n"; include_dodosmail_footer($dodosmail_footer_file); exit; } } if ($check_email_address == "yes" && !empty($email)) { if (!check_email($email)) { include_dodosmail_header($dodosmail_header_file); echo "<p class=\"DodosMailError\">Fout - het adres " . dodosmail_error_handle($email) . " is niet geldig.\n"; echo "<br /><br /><a href=\"javascript:history.back(1)\">Terug</a>\n"; echo "</p>\n"; include_dodosmail_footer($dodosmail_footer_file); exit; } } for ($i = 0; $i < count($fields); $i++) { $actual_var = $fields[$i]; if (in_array($actual_var, $reserved_vars)) { $inside_mail = $inside_mail; } else { if (is_array($$actual_var)) { $inside_mail.= "$actual_var: "; foreach($$actual_var as $actual_val) { $inside_mail.= "$actual_val "; } $inside_mail.= "\n"; } else { $actual_val = stripslashes($$actual_var); $inside_mail.= "$actual_var: $actual_val\n"; } } } // getting other information from the form $cname = gethostbyaddr($_SERVER[REMOTE_ADDR]); $inside_mail.= " ----------------------------------------------------------------------- SENDER INFO: IP: $_SERVER[REMOTE_ADDR] Computer Name: $cname Browser Type: $_SERVER[HTTP_USER_AGENT] Page Referer: $_SERVER[HTTP_REFERER] ----------------------------------------------------------------------- "; $headers.= "MIME-Version: 1.0\r\n"; $headers.= "X-Priority: 3\r\n"; $headers.= "X-MSMail-Priority: Normal\r\n"; $headers.= "X-Mailer: DodosMail 2.0 http://regretless.com/scripts/\r\n"; $headers.= 'Content-type: text/html; charset=UTF-8' . "\r\n"; // $headers .= "Date: ".date("R")."\r\n"; $headers.= "From: $name <$email>\r\n"; $success = mail($your_email_address, utf8_encode($subject), utf8_encode($inside_mail), $headers); if ($success) { if ($autoresponse == "yes") { $response_subject = utf8_encode(stripslashes($response_subject)); $response_mail = utf8_encode(stripslashes($response_mail)); mail($email, $response_subject, $response_mail, "From: $owner_name <$your_email_address>"); } if ($after_url == "") { // out put send info include_dodosmail_header($dodosmail_header_file); echo "<p>\n"; echo "Het formulier is verzonden!</p><ul>"; for ($i = 0; $i < count($fields); $i++) { $actual_var = $fields[$i]; if (in_array($actual_var, $reserved_vars)) echo ""; else { if (is_array($$actual_var)) { echo "<li>$actual_var: "; foreach($$actual_var as $actual_val) { echo "$actual_val "; } echo "</li>\n"; } else { $actual_val = stripslashes($$actual_var); echo "<li>$actual_var: $actual_val</li>\n"; } } } echo "</ul>\n<p></p>"; include_dodosmail_footer($dodosmail_footer_file); exit; } else { headfunction($after_url); } } else { include_dodosmail_header($dodosmail_header_file); echo "<p class=\"DodosMailError\">Fout - Het formulier is tijdelijk niet bruikbaar, gebruik " . dodosmail_error_handle($your_email_address) . " om contact op te nemen.\n"; echo "<br /><br /><a href=\"javascript:history.back(1)\">Terug</a>\n"; echo "</p>\n"; include_dodosmail_footer($dodosmail_footer_file); exit; } function check_email($email) { if ((preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) || (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/', $email))) { return true; } return false; } ?> EDIT: Added more encodes. Quote Link to comment Share on other sites More sharing options...
highwaykind Posted January 29, 2010 Author Share Posted January 29, 2010 Thank you very much! The code is working fine (as in: I'm getting the message), but it's still displaying weirdly: Something in Russian followed by something in Chinese lands as чтþ-тþ ò руÑÂÑÂúøù 在ä¸Â國的æÂ񊝨 in my inbox. Is this even a PHP script issue, or is this an Outlook/Thunderbird issue? When it's sent as HTML I can fiddle with the setting in Thunderbird until the foreign script suddenly shows correctly. It's a work around, but at least it's working, so I'll mark this as resolved. Thanks again for the quick help! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.