За последние 24 часа нас посетили 14990 программистов и 1771 робот. Сейчас ищут 1442 программиста ...

Отличия почтовых серверов.

Тема в разделе "Работа с почтой", создана пользователем Phantik, 24 ноя 2009.

  1. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Выслал одно письмо на 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. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Добавил 2 заголовка
    $headers = 'From: a@a.ru\r\n' .
    'Content-type: text/html;charset=utf-8\r\n';

    rambler стал тоже получать.

    Осталась проблема что mail.ru не хочет отображать письмо в правильной кодировке (без ручного переключения).
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну а сам текст в какой? текст в скрипте в какой кодировке?
     
  4. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Все проблемы решились. Нашел в инете 2 правильные функции:

    PHP:
    1.  
    2. function send_mime_mail($name_from, // имя отправителя
    3.                         $email_from, // email отправителя
    4.                         $name_to, // имя получателя
    5.                         $email_to, // email получателя
    6.                         $data_charset, // кодировка переданных данных
    7.                         $send_charset, // кодировка письма
    8.                         $subject, // тема письма
    9.                         $body // текст письма
    10.                         ) {
    11.   $to = mime_header_encode($name_to, $data_charset, $send_charset)
    12.                  . ' <' . $email_to . '>';
    13.   $subject = mime_header_encode($subject, $data_charset, $send_charset);
    14.   $from =  mime_header_encode($name_from, $data_charset, $send_charset)
    15.                      .' <' . $email_from . '>';
    16.   if($data_charset != $send_charset) {
    17.     $body = iconv($data_charset, $send_charset, $body);
    18.   }
    19.   $headers = "From: $from\r\n";
    20.   $headers .= "Content-type: text/plain; charset=$send_charset\r\n";
    21.  
    22.   return mail($to, $subject, $body, $headers);
    23. }
    24.  
    25. function mime_header_encode($str, $data_charset, $send_charset) {
    26.   if($data_charset != $send_charset) {
    27.     $str = iconv($data_charset, $send_charset, $str);
    28.   }
    29.   return '=?' . $send_charset . '?B?' . base64_encode($str) . '?=';
    30. }
    И вместо mail вызывать:
    send_mime_mail('Пользователь',
    $email,
    'Админ',
    $mailsap,
    'UTF-8', // кодировка, в которой находятся передаваемые строки
    'KOI8-R', // кодировка, в которой будет отправлено письмо
    'Заявка',
    $mstring));

    Работает все как нужно, только не могу понять что делает строка:
    return '=?' . $send_charset . '?B?' . base64_encode($str) . '?=';
     
  5. Phantik

    Phantik Активный пользователь

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    в utf-8. Я правильно понимаю что, заголовки и subject нельзя посылать в utf-8? Само тело письма вроде как можно, но в функции его все равно перекодируют.
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    нет не правильно.

    PHP:
    1.  
    2. <?
    3.  
    4. $subject = 'Привет мир!';
    5. $subject = '=?UTF-8?B?'.base64_encode($subject).'?=';
    6.  
    7. ?>
    8.  
    при этом файл должен быть в UTF-8 или кодируемые данные.
     
  7. incondition

    incondition Активный пользователь

    С нами с:
    5 янв 2009
    Сообщения:
    30
    Симпатии:
    0
    А я вот перепробовал все эти примеры, на отправку письма принимаются, но ни на mail.ru ни на gmail.com письма не приходят. Я в отчаянии уже...
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а пошли на 440hz@php.ru ?
     
  9. incondition

    incondition Активный пользователь

    С нами с:
    5 янв 2009
    Сообщения:
    30
    Симпатии:
    0
    PHP:
    1. <?php
    2.  
    3. include_once('data.php');
    4. include_once('text.php');
    5.  
    6. function send_mime_mail($name_from, // имя отправителя
    7.                         $email_from, // email отправителя
    8.                         $name_to, // имя получателя
    9.                         $email_to, // email получателя
    10.                         $data_charset, // кодировка переданных данных
    11.                         $send_charset, // кодировка письма
    12.                         $subject, // тема письма
    13.                         $body // текст письма
    14.                         ) {
    15.   $to = mime_header_encode($name_to, $data_charset, $send_charset)
    16.                  . ' <' . $email_to . '>';
    17.   $subject = mime_header_encode($subject, $data_charset, $send_charset);
    18.   $from =  mime_header_encode($name_from, $data_charset, $send_charset)
    19.                      .' <' . $email_from . '>';
    20.   if($data_charset != $send_charset) {
    21.     $body = iconv($data_charset, $send_charset, $body);
    22.   }
    23.   $headers = "From: $from\r\n";
    24.   $headers .= "Content-type: text/plain; charset=$send_charset\r\n";
    25.  
    26.   return mail($to, $subject, $body, $headers);
    27. }
    28.  
    29. function mime_header_encode($str, $data_charset, $send_charset) {
    30.   if($data_charset != $send_charset) {
    31.     $str = iconv($data_charset, $send_charset, $str);
    32.   }
    33.   return '=?' . $send_charset . '?B?' . base64_encode($str) . '?=';
    34. }
    35. ?>
    HTML:
    1.     <title><?php echo $title_index; echo( ' - '.$title_reg); ?></title>
    2.     <link rel="stylesheet" href="main.css" type="text/css">
    3.     <meta http-equiv="Content-Type" content="text/html; charset=<?php echo $code_pages; ?>">
    4. </head>
    5. <body class="cbody">
    6. <MAP NAME="upimg">
    7. <AREA ID="EN" SHAPE="RECT" HREF="index.php" COORDS="14,11,164,29">
    8. </MAP>
    9. <center>
    10. <img src="img/2.gif" USEMAP="#upimg" WIDTH="756" HEIGHT="131" BORDER="0">
    11. <table width="756px" height="21px"  class="up" cellSpacing="0" cellPadding="0">
    12.     <tr>
    13.     <td><a href="index.php" class="upl"><?php echo $ref_text_on_main; ?></a></td>
    14.     <td><img src="img/li.gif"></td>
    15.     <td><a href="about.php" class="upl"><?php echo $ref_text_about; ?></a></td>
    16.     <td><img src="img/li.gif"></td>
    17.     <td><a href="contact.php" class="upl"><?php echo $ref_text_contact; ?></a></td>
    18.     <td><img src="img/li.gif"></td>
    19.     <td><a href="reg.php" class="upl"><?php echo $ref_text_reg; ?></a></td>
    20.     <td><img src="img/li.gif"></td>
    21.     <td><a href="start.php" class="upl"><?php echo $ref_text_start; ?></a></td>
    22.     <td><img src="img/li.gif"></td>
    23.     <td><a href="news.php" class="upl"><?php echo $ref_text_news; ?></a></td>
    24.     <td><img src="img/li.gif"></td>
    25.     <td><a href="ask.php" class="upl"><?php echo $ref_text_ask; ?></a></td>
    26.     </tr>
    27. <table width="756px">
    28.     <tr><td width="74%" valign="top">
    29.     <table class="mt" cellSpacing="1" cellPadding="5" width="100%">
    30.         <tr class="tH"><td>
    31.         <table cellSpacing="0" cellPadding="0">
    32.             <tr class="tHT">
    33.             <td><img src="img/ar.gif" align="left"></td>
    34.             <td><?php echo $word_reg_on_proj; ?></td>
    35.             </tr>
    36.         </table>
    37.         </td></tr>
    38.         <tr><td class="tT" height="500" valign="top">
    39.         <center>
    PHP:
    1. <?php
    2.         if(!isset($_POST['mail']))
    3.         {
    4.             echo
    5.             ('
    6.                 '.$msg_from_reg.'
    7.                 <form action="reg.php" method="post">
    8.                 <p><input type="text" name="mail" maxlength="40" size="40" /></p>
    9.                 <p><input type="submit" value="'.$submit_text_begin_reg.'" /></p>
    10.                 </form>
    11.             ');
    12.         }
    13.         else
    14.         {
    15.             $mail = $_POST['mail'];
    16.             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))
    17.             {
    18.                 if(!preg_match("/^[-_.a-zA-Z0-9]+[@]{1}[-_.a-zA-Z0-9]*[.]{2,}[-_.a-zA-Z0-9]*$/", $mail))
    19.                 {
    20.                     $today = getdate();
    21.                     $inttoday = $today[mday]*24*60 + $today[hours]*60 + $today[minutes];
    22.                     $link = mysql_connect($host, $user, $passworddb)
    23.                             or die("Could not connect : " . mysql_error());
    24.                     mysql_select_db($db);
    25.                     $sql = "select * from reg where email='".$mail."'";
    26.                     $result = mysql_query($sql);
    27.                     $row = mysql_fetch_array($result);
    28.                     if (!$row["email"])
    29.                     {
    30.                         $sql = "insert into reg (date, email) values ('".$inttoday."', '".$mail."')";
    31.                         $result = mysql_query($sql);
    32.                         if (!$result)
    33.                         {
    34.                             echo "There's been a problem: ".mysql_error();
    35.                         }
    36.                     }
    37.                     else
    38.                     {
    39.                         $query = "UPDATE reg SET date='".$inttoday."' WHERE email='".$mail."'";
    40.                         mysql_query($query) or die (mysql_error());
    41.                     }
    42.                     /* ==================== here mail func =============================== */
    43.                    
    44.                     $sql = "select * from reg where email='".$mail."'";
    45.                     $result = mysql_query($sql);
    46.                     $row = mysql_fetch_array($result);
    47.                     $link_to_reg=$title_index;
    48.                     $link_to_reg.='?id='.$row[id];
    49.                     $subject = $word_reg_on_proj.' '.$title_index;
    50.                     $message = ' '.$text_to_reg_email.' '.$link_to_reg;
    51.                     $res=send_mime_mail($name_from_email,
    52.                         $mail_of_proj, 'Cанек', $mail,
    53.                         $code_pages,  // кодировка, в которой находятся передаваемые строки
    54.                         'KOI8-R', // кодировка, в которой будет отправлено письмо
    55.                         $subject, $message);
    56.                     if($res)
    57.                     {
    58.                         echo $msg_ok_reg;
    59.                     }
    60.                     mysql_close($link);
    61.                 }
    62.                 else
    63.                 {
    64.                     echo
    65.                     ('
    66.                         <br>'.$msg_wrong_reg.'
    67.                         <form action="reg.php" method="post">
    68.                         <p><input type="text" name="mail" maxlength="40" size="40" /></p>
    69.                         <p><input type="submit" value="'.$submit_text_begin_reg.'" /></p>
    70.                         </form>
    71.                     ');
    72.                 }
    73.             }
    74.             else
    75.             {
    76.                 echo
    77.                 ('
    78.                     <br>'.$msg_wrong_reg.'
    79.                     <form action="reg.php" method="post">
    80.                     <p><input type="text" name="mail" maxlength="40" size="40" /></p>
    81.                     <p><input type="submit" value="'.$submit_text_begin_reg.'" /></p>
    82.                     </form>
    83.                 ');
    84.             }
    85.         }
    86.         ?>
    HTML:
    1. </center>
    2.         </td></tr>
    3.     </table>
    4.     </td></tr>
    5. </center>
    6. </body>
    7. </html>
    вот о чем я