SMF`den gönderilen maillerdeki Türkçe karakter sorununun çözümü
Evet, nihayet hotmail'e giden emaillerdeki Türkçe karakter sorunu çözüldü.
Bunun için yapacağınız üç şey var.
Önce, Sources / Subs-Post.php dosyasını açın.
Bulun:
Kod:
Kod:
// Send off an email.
// Note: the $priority parameter is added merely for future compatibility.
function sendmail($to, $subject, $message, $from = null, $message_id = null, $send_html = false, $priority = 1, $hotmail_fix = null)
{
global $webmaster_email, $context, $modSettings, $txt, $scripturl;
// So far so good.
$mail_result = true;
// If the recipient list isn't an array, make it one.
$to_array = is_array($to) ? $to : array($to);
// Sadly Hotmail doesn't support character sets properly.
if ($hotmail_fix === null)
{
$hotmail_to = array();
foreach ($to_array as $i => $to_address)
{
if (preg_match('~@hotmail.[a-zA-Z\.]{2,6}$~i', $to_address) === 1)
{
$hotmail_to[] = $to_address;
$to_array = array_diff($to_array, array($to_address));
}
}
// Call this function recursively for the hotmail addresses.
if (!empty($hotmail_to))
$mail_result = sendmail($to, $subject, $message, $from, $message_id, $send_html, $priority, true);
// The remaining addresses no longer need the fix.
$hotmail_fix = false;
// No other addresses left? Return instantly.
if (empty($to_array))
return $mail_result;
}
// Get rid of slashes and entities.
$subject = un_htmlspecialchars(stripslashes($subject));
// Make the message use \r\n's only.
$message = str_replace(array("\r", "\n"), array('', "\r\n"), stripslashes($message));
// Make sure hotmail mails are sent as HTML so that HTML entities work.
if ($hotmail_fix && !$send_html)
{
$send_html = true;
$message = strtr($message, array("\r\n" => "<br />\r\n"));
$message = preg_replace('~(' . preg_quote($scripturl, '~') . '([?/][\w\-_%\.,\?&;=#]+)?)~', '<a href="$1">$1</a>', $message);
}
// pass this to the integration before we start modifying the output -- it'll make it easier later
if (isset($modSettings['integrate_outgoing_email']) && function_exists($modSettings['integrate_outgoing_email']))
{
if ($modSettings['integrate_outgoing_email']($subject, $message, $headers) === false)
return false;
}
list ($charset, $message, $encoding) = mimespecialchars($message, false, $hotmail_fix);
// Sending HTML? Let's plop in some basic stuff, then.
if ($send_html)
{
// This should send a text message with MIME multipart/alternative stuff.
$mime_boundary = 'SMF-' . md5($message . time());
$headers .= 'Mime-Version: 1.0' . "\r\n";
$headers .= 'Content-Type: multipart/alternative; boundary="' . $mime_boundary . '"' . "\r\n";
$headers .= 'Content-Transfer-Encoding: ' . ($encoding == '' ? '7bit' : $encoding);
// Save the original message...
$orig_message = $message;
// But, then, dump it and use a plain one for dinosaur clients.
$message = un_htmlspecialchars(strip_tags(strtr($orig_message, array('</title>' => "\r\n")))) . "\r\n--" . $mime_boundary . "\r\n";
// This is the plain text version. Even if no one sees it, we need it for spam checkers.
$message .= 'Content-Type: text/plain; charset=' . $charset . "\r\n";
$message .= 'Content-Transfer-Encoding: ' . ($encoding == '' ? '7bit' : $encoding) . "\r\n\r\n";
$message .= un_htmlspecialchars(strip_tags(strtr($orig_message, array('</title>' => "\r\n")))) . "\r\n--" . $mime_boundary . "\r\n";
// This is the actual HTML message, prim and proper. If we wanted images, they could be inlined here (with multipart/related, etc.)
$message .= 'Content-Type: text/html; charset=' . $charset . "\r\n";
$message .= 'Content-Transfer-Encoding: ' . ($encoding == '' ? '7bit' : $encoding) . "\r\n\r\n";
$message .= $orig_message . "\r\n--" . $mime_boundary . '--';
}
// Text is good too.
else
{
$headers .= 'Content-Type: text/plain; charset=' . $charset . "\r\n";
if ($encoding != '')
$headers .= 'Content-Transfer-Encoding: ' . $encoding;
}
// Send off an email.
// Note: the $priority parameter is added merely for future compatibility.
function sendmail($to, $subject, $message, $from = null, $message_id = null, $send_html = false, $priority = 1, $hotmail_fix = null)
{
global $webmaster_email, $context, $modSettings, $txt, $scripturl;
// Use sendmail if it's set or if no SMTP server is set.
$use_sendmail = empty($modSettings['mail_type']) || $modSettings['smtp_host'] == '';
// Line breaks need to be \r\n only in windows or for SMTP.
$line_break = $context['server']['is_windows'] || !$use_sendmail ? "\r\n" : "\n";
// So far so good.
$mail_result = true;
// If the recipient list isn't an array, make it one.
$to_array = is_array($to) ? $to : array($to);
// Sadly Hotmail doesn't support character sets properly.
if ($hotmail_fix === null)
{
$hotmail_to = array();
foreach ($to_array as $i => $to_address)
{
if (preg_match('~@hotmail.[a-zA-Z\.]{2,6}$~i', $to_address) === 1)
{
$hotmail_to[] = $to_address;
$to_array = array_diff($to_array, array($to_address));
}
}
// Call this function recursively for the hotmail addresses.
if (!empty($hotmail_to))
$mail_result = sendmail($hotmail_to, $subject, $message, $from, $message_id, $send_html, $priority, true);
// The remaining addresses no longer need the fix.
$hotmail_fix = false;
// No other addresses left? Return instantly.
if (empty($to_array))
return $mail_result;
}
// Get rid of slashes and entities.
$subject = un_htmlspecialchars(stripslashes($subject));
// Make the message use the proper line breaks.
$message = str_replace(array("\r", "\n"), array('', $line_break), stripslashes($message));
// Make sure hotmail mails are sent as HTML so that HTML entities work.
if ($hotmail_fix && !$send_html)
{
$send_html = true;
$message = strtr($message, array($line_break => '<br />' . $line_break));
$message = preg_replace('~(' . preg_quote($scripturl, '~') . '([?/][\w\-_%\.,\?&;=#]+)?)~', '<a href="$1">$1</a>', $message);
}
// pass this to the integration before we start modifying the output -- it'll make it easier later
if (isset($modSettings['integrate_outgoing_email']) && function_exists($modSettings['integrate_outgoing_email']))
{
if ($modSettings['integrate_outgoing_email']($subject, $message, $headers) === false)
return false;
}
list ($charset, $message, $encoding) = mimespecialchars($message, false, $hotmail_fix);
// Sending HTML? Let's plop in some basic stuff, then.
if ($send_html)
{
// This should send a text message with MIME multipart/alternative stuff.
$mime_boundary = 'SMF-' . md5($message . time());
$headers .= 'Mime-Version: 1.0' . $line_break;
$headers .= 'Content-Type: multipart/alternative; boundary="' . $mime_boundary . '"' . $line_break;
$headers .= 'Content-Transfer-Encoding: ' . ($encoding == '' ? '7bit' : $encoding);
// Save the original message...
$orig_message = $message;
// But, then, dump it and use a plain one for dinosaur clients.
$message = un_htmlspecialchars(strip_tags(strtr($orig_message, array('</title>' => $line_break)))) . $line_break . '--' . $mime_boundary . $line_break;
// This is the plain text version. Even if no one sees it, we need it for spam checkers.
$message .= 'Content-Type: text/plain; charset=' . $charset . $line_break;
$message .= 'Content-Transfer-Encoding: ' . ($encoding == '' ? '7bit' : $encoding) . $line_break . $line_break;
$message .= un_htmlspecialchars(strip_tags(strtr($orig_message, array('</title>' => $line_break)))) . $line_break . "--" . $mime_boundary . $line_break;
// This is the actual HTML message, prim and proper. If we wanted images, they could be inlined here (with multipart/related, etc.)
$message .= 'Content-Type: text/html; charset=' . $charset . $line_break;
$message .= 'Content-Transfer-Encoding: ' . ($encoding == '' ? '7bit' : $encoding) . $line_break . $line_break;
$message .= $orig_message . $line_break . "--" . $mime_boundary . '--';
}
// Text is good too.
else
{
$headers .= 'Content-Type: text/plain; charset=' . $charset . $line_break;
if ($encoding != '')
$headers .= 'Content-Transfer-Encoding: ' . $encoding;
}
// Convert all 'special' characters to HTML entities.
preg_replace('~[\x80-\x{10FFFF}]~eu', '$entityConvert("\1")', $string);
return array($charset, $string, '7bit');
değiştir:
Kod:
Kod:
// Convert all 'special' characters to HTML entities.
return array($charset, preg_replace('~([\x80-\x{10FFFF}])~eu', '$entityConvert("\1")', $string), '7bit');
Sonra da ilk eklediğimiz kodda şunu bulun:
Kod:
Kod:
// Line breaks need to be \r\n only in windows or for SMTP.
$line_break = $context['server']['is_windows'] || !$use_sendmail ? "\r\n" : "\n";
Eğer sunucunuz linux ise şöyle değiştirin:
Kod:
// Line breaks need to be \r\n only in windows or for SMTP.
$context['server']['is_windows'] = false;
$line_break = $context['server']['is_windows'] || !$use_sendmail ? "\r\n" : "\n";
Eğer windows ise de şöyle değiştirin:
Kod:
// Line breaks need to be \r\n only in windows or for SMTP.
$context['server']['is_windows'] = true;
$line_break = $context['server']['is_windows'] || !$use_sendmail ? "\r\n" : "\n";
Sunucunuzun ne olduğuna emin değilseniz, sunucu sahibine sorun. Ya da FTP'den dosyalara CHMOD yapabiliyorsanız sunucunuz linux demektir, CHMOD yapamıyorsanız sunucunuz windowstur.