По договоренности
Есть сайт (интернет-магазин). После обновления на веб-сервере PHP, MySQL, Apache начались разного рода проблемы, в связи с чем пришлось заменить кодировку баз данных с 1251 на UTF-8.
Теперь наблюдается следующая проблема. И клиентам и нам приходят письма в кривой кодировке. В чем проблема не понятно.. своими силами не разобрались.. но такое ощущение, что простой сменой кодировки в одном месте не обойтись.. все сложнее. Файлы и функции отвечающие за отправку писем найдены в движке.
Очень надеюсь что Вы сможете помочь.
Ниже привожу фрагменты (из разных файлов, отвечающие за 1 цикл отправки):
order.php
$charset = $gOptions['attr_admin_charset'];
$mailer->SetCharset($charset);
$all_message = iconv(SHOP_CHARSET, $charset, str_replace('{CHARSET}', $charset, $full_mail));
$subject = substr($all_message, strpos($all_message, 'Message_subject:')+16, strpos($all_message, 'Message_content:')-16);
$message = substr($all_message, strpos($all_message, 'Message_content:')+16);
$mailer->AddMessage($message);
$mailer->BuildMessage();
$mailer->Send($gOptions['attr_admin_email'], $from_client, ltrim($subject, " "));
Emailer.php
/**
* AddMessage
**/
function AddMessage($mText)
{
$this->gMessage = $mText;
}
/**
* AddAttachment
**/
function AddAttachment($mFile, $mAttachName, $mType = 'application/octet-stream')
{
if ( is_file($mFile) )
{
$body = @implode("", (file($mFile)));
array_push($this->gParts, array('body' => $body, 'name' => basename($mAttachName), 'type' => $mType));
}
}
/**
* BuildMessage
**/
function BuildMessage()
{
$boundary = '=_'.md5(uniqid(time()));
$this->gHeaders = "MIME-Version: 1.0\n";
$this->gHeaders .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$this->gMime = '';
$this->gMime .= "This is a MIME encoded message.\n\n";
$this->gMime .= "--$boundary\n";
if ( $this->gTypeHTML )
{
$this->gMime .= "Content-Type: text/html; charset=$this->gCharset\n";
$this->gMime .= "Content-Transfer-Encoding: Quot-Printed\n\n";
}
else
{
$this->gMime .= "Content-Type: text/plain; charset=$this->gCharset\n";
$this->gMime .= "Content-Transfer-Encoding: 8bit\n\n";
}
$this->gMime .= $this->gMessage."\n\n";
for ( $i = count($this->gParts)-1; $i >= 0; $i-- )
{
$this->gMime .= "--$boundary\n".$this->BuildPart($i);
}
$this->gMime .= "--$boundary--\n";
}
/**
* BuildPart
**/
function BuildPart($mNum)
{
$message_part = '';
$message_part .= "Content-Type: ".$this->gParts[$mNum][type];
if ( $this->gParts[$mNum][name] != '')
{
$message_part .= "; name = \"".$this->gParts[$mNum][name]."\"\n" ;
}
else
{
$message_part .= "\n";
}
$message_part .= "Content-Transfer-Encoding: base64\n";
$message_part .= "Content-Disposition: attachment; filename = \"".$this->gParts[$mNum][name]."\"\n\n" ;
$message_part .= chunk_split(base64_encode($this->gParts[$mNum][body]))."\ n";
return $message_part;
}
/**
* Send
**/
function Send($mTo, $mFrom, $mSubject)
{
$rcpt = explode(',', $mTo);
$mSubject = preg_replace("/\r\n|\n\r|\n|\r/", "", $mSubject);
$mSubject = "=?$this->gCharset?B?".base64_encode($mSubject)." ?=";
$headers = $this->gHeaders;
$headers .= "From: $mFrom\n";
$headers .= "Date: ".date("D, d M Y H:i:s") . " +0400 UT\n";
$headers .= "Reply-To:$mFrom\n";
if ( strlen($this->gServer) > 0 )
{
// Send via socket
$fp = @fsockopen($this->gServer, 25, $err_num, $err_text, 20);
if ( !$fp )
{
return false;
//die(" Server $this->gServer. Connection failed: $err_num, $err_text");
}
$headers .= "Subject: $mSubject\n";
$headers .= "X-Mailer: PHP/".phpversion()."\n";
@fputs($fp, "HELO $this->gServer\n");
@fputs($fp, "MAIL FROM: $mFrom\n");
foreach ( $rcpt as $to_email ) @fputs($fp, "RCPT TO: ".trim($to_email)."\n");
@fputs($fp, "DATA\n");
if ( count($rcpt) == 1 ) @fputs($fp, "To: $mTo\n");
@fputs($fp, $headers);
@fputs($fp, $this->gMime);
@fputs($fp, "\n.\nQUIT\n");
while( !feof($fp) ) $resp .= @fgets($fp, 1024);
@fclose($fp);
}
else
{
// Send via mail function
$headers .= "X-Mailer: PHP/".phpversion()."\n";
foreach ( $rcpt as $to_email ) $resp .= @mail(trim($to_email), $mSubject, $this->gMime, $headers);
}
return $resp;
}
}
?>
так же есть файл шаблона письма.