Выслал одно письмо на 4 разных адреса(дополнительных заголовков не посылал): Res = mail($to1,"Тест", "Русский текст"); Res = mail($to2,"Тест", "Русский текст"); Res = mail($to3,"Тест", "Русский текст"); Res = mail($to4,"Тест", "Русский текст"); 1) Ящик на gmail.com получил письмо сразу же. Заголовок и текст письма отобразил по русски. 2) Ящик на yandex.ru сработал аналогично gmail. 3) Ящик на mail.ru аналогично 1) и 2) но текст письма отобразил не правильно. При ручном выборе кодировки - win тело письма отобразилось правильно. (Хотя скрипт отправки сохранен в utf-8) 4) Ящик на rambler.ru вообще не получил ничего. (Хотя ящик рабочий и письма с разных адресов на него приходят) И это всего проверка на 4-х серверах. Вопрос собственно, какими заголовками надо дополнять письмо что бы на большинстве сервером оно приходило в одинаковом виде(хотя бы кодировка правильно отображалась)?
Добавил 2 заголовка $headers = 'From: a@a.ru\r\n' . 'Content-type: text/html;charset=utf-8\r\n'; rambler стал тоже получать. Осталась проблема что mail.ru не хочет отображать письмо в правильной кодировке (без ручного переключения).
Все проблемы решились. Нашел в инете 2 правильные функции: PHP: function send_mime_mail($name_from, // имя отправителя $email_from, // email отправителя $name_to, // имя получателя $email_to, // email получателя $data_charset, // кодировка переданных данных $send_charset, // кодировка письма $subject, // тема письма $body // текст письма ) { $to = mime_header_encode($name_to, $data_charset, $send_charset) . ' <' . $email_to . '>'; $subject = mime_header_encode($subject, $data_charset, $send_charset); $from = mime_header_encode($name_from, $data_charset, $send_charset) .' <' . $email_from . '>'; if($data_charset != $send_charset) { $body = iconv($data_charset, $send_charset, $body); } $headers = "From: $from\r\n"; $headers .= "Content-type: text/plain; charset=$send_charset\r\n"; return mail($to, $subject, $body, $headers); } function mime_header_encode($str, $data_charset, $send_charset) { if($data_charset != $send_charset) { $str = iconv($data_charset, $send_charset, $str); } return '=?' . $send_charset . '?B?' . base64_encode($str) . '?='; } И вместо mail вызывать: send_mime_mail('Пользователь', $email, 'Админ', $mailsap, 'UTF-8', // кодировка, в которой находятся передаваемые строки 'KOI8-R', // кодировка, в которой будет отправлено письмо 'Заявка', $mstring)); Работает все как нужно, только не могу понять что делает строка: return '=?' . $send_charset . '?B?' . base64_encode($str) . '?=';
в utf-8. Я правильно понимаю что, заголовки и subject нельзя посылать в utf-8? Само тело письма вроде как можно, но в функции его все равно перекодируют.
нет не правильно. PHP: <? $subject = 'Привет мир!'; $subject = '=?UTF-8?B?'.base64_encode($subject).'?='; ?> при этом файл должен быть в UTF-8 или кодируемые данные.
А я вот перепробовал все эти примеры, на отправку письма принимаются, но ни на mail.ru ни на gmail.com письма не приходят. Я в отчаянии уже...
PHP: <?php include_once('data.php'); include_once('text.php'); function send_mime_mail($name_from, // имя отправителя $email_from, // email отправителя $name_to, // имя получателя $email_to, // email получателя $data_charset, // кодировка переданных данных $send_charset, // кодировка письма $subject, // тема письма $body // текст письма ) { $to = mime_header_encode($name_to, $data_charset, $send_charset) . ' <' . $email_to . '>'; $subject = mime_header_encode($subject, $data_charset, $send_charset); $from = mime_header_encode($name_from, $data_charset, $send_charset) .' <' . $email_from . '>'; if($data_charset != $send_charset) { $body = iconv($data_charset, $send_charset, $body); } $headers = "From: $from\r\n"; $headers .= "Content-type: text/plain; charset=$send_charset\r\n"; return mail($to, $subject, $body, $headers); } function mime_header_encode($str, $data_charset, $send_charset) { if($data_charset != $send_charset) { $str = iconv($data_charset, $send_charset, $str); } return '=?' . $send_charset . '?B?' . base64_encode($str) . '?='; } ?> HTML: <html> <head> <title><?php echo $title_index; echo( ' - '.$title_reg); ?></title> <link rel="stylesheet" href="main.css" type="text/css"> <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $code_pages; ?>"> </head> <body class="cbody"> <MAP NAME="upimg"> <AREA ID="EN" SHAPE="RECT" HREF="index.php" COORDS="14,11,164,29"> </MAP> <center> <img src="img/2.gif" USEMAP="#upimg" WIDTH="756" HEIGHT="131" BORDER="0"> <table width="756px" height="21px" class="up" cellSpacing="0" cellPadding="0"> <tr> <td><a href="index.php" class="upl"><?php echo $ref_text_on_main; ?></a></td> <td><img src="img/li.gif"></td> <td><a href="about.php" class="upl"><?php echo $ref_text_about; ?></a></td> <td><img src="img/li.gif"></td> <td><a href="contact.php" class="upl"><?php echo $ref_text_contact; ?></a></td> <td><img src="img/li.gif"></td> <td><a href="reg.php" class="upl"><?php echo $ref_text_reg; ?></a></td> <td><img src="img/li.gif"></td> <td><a href="start.php" class="upl"><?php echo $ref_text_start; ?></a></td> <td><img src="img/li.gif"></td> <td><a href="news.php" class="upl"><?php echo $ref_text_news; ?></a></td> <td><img src="img/li.gif"></td> <td><a href="ask.php" class="upl"><?php echo $ref_text_ask; ?></a></td> </tr> </table> <table width="756px"> <tr><td width="74%" valign="top"> <table class="mt" cellSpacing="1" cellPadding="5" width="100%"> <tr class="tH"><td> <table cellSpacing="0" cellPadding="0"> <tr class="tHT"> <td><img src="img/ar.gif" align="left"></td> <td><?php echo $word_reg_on_proj; ?></td> </tr> </table> </td></tr> <tr><td class="tT" height="500" valign="top"> <center> PHP: <?php if(!isset($_POST['mail'])) { echo (' '.$msg_from_reg.' <form action="reg.php" method="post"> <p><input type="text" name="mail" maxlength="40" size="40" /></p> <p><input type="submit" value="'.$submit_text_begin_reg.'" /></p> </form> '); } else { $mail = $_POST['mail']; if(preg_match("/^[a-zA-Z0-9]+[-_.a-zA-Z0-9]*[a-zA-Z0-9]+[@]{1}[a-zA-Z0-9]+[a-zA-Z0-9.]*[a-zA-Z0-9]{2,}$/", $mail)) { if(!preg_match("/^[-_.a-zA-Z0-9]+[@]{1}[-_.a-zA-Z0-9]*[.]{2,}[-_.a-zA-Z0-9]*$/", $mail)) { $today = getdate(); $inttoday = $today[mday]*24*60 + $today[hours]*60 + $today[minutes]; $link = mysql_connect($host, $user, $passworddb) or die("Could not connect : " . mysql_error()); mysql_select_db($db); $sql = "select * from reg where email='".$mail."'"; $result = mysql_query($sql); $row = mysql_fetch_array($result); if (!$row["email"]) { $sql = "insert into reg (date, email) values ('".$inttoday."', '".$mail."')"; $result = mysql_query($sql); if (!$result) { echo "There's been a problem: ".mysql_error(); } } else { $query = "UPDATE reg SET date='".$inttoday."' WHERE email='".$mail."'"; mysql_query($query) or die (mysql_error()); } /* ==================== here mail func =============================== */ $sql = "select * from reg where email='".$mail."'"; $result = mysql_query($sql); $row = mysql_fetch_array($result); $link_to_reg=$title_index; $link_to_reg.='?id='.$row[id]; $subject = $word_reg_on_proj.' '.$title_index; $message = ' '.$text_to_reg_email.' '.$link_to_reg; $res=send_mime_mail($name_from_email, $mail_of_proj, 'Cанек', $mail, $code_pages, // кодировка, в которой находятся передаваемые строки 'KOI8-R', // кодировка, в которой будет отправлено письмо $subject, $message); if($res) { echo $msg_ok_reg; } mysql_close($link); } else { echo (' <br>'.$msg_wrong_reg.' <form action="reg.php" method="post"> <p><input type="text" name="mail" maxlength="40" size="40" /></p> <p><input type="submit" value="'.$submit_text_begin_reg.'" /></p> </form> '); } } else { echo (' <br>'.$msg_wrong_reg.' <form action="reg.php" method="post"> <p><input type="text" name="mail" maxlength="40" size="40" /></p> <p><input type="submit" value="'.$submit_text_begin_reg.'" /></p> </form> '); } } ?> HTML: </center> </td></tr> </table> </td></tr> </table> </center> </body> </html> вот о чем я