Jump to content

Mail form doesn't send Russian/Cyrillic characters correctly?


highwaykind

Recommended Posts

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



?>

Link to comment
Share on other sites

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-

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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?

 

 

 

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.