За последние 24 часа нас посетили 17552 программиста и 1315 роботов. Сейчас ищут 1549 программистов ...

отправка письма на mail.ru - проблема с кодировкой

Тема в разделе "Работа с почтой", создана пользователем Diakon, 27 июн 2014.

  1. Diakon

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

    С нами с:
    22 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Добрый день. Сталкнулся с такой проблеммой.
    Я отправляю на mail.ru письмо с атачем файла. Все приходит, но русский текст идет символами вопроса(http://c2n.me/ioStfH.png), хотя когда смотриш на письмо в списке - текст отображается нормально (а когда открываеш письмо - вместо кирилицы символы).
    http://c2n.me/ioLZ0e.png - тут в списке тело письма видно нормально
    http://c2n.me/ioStfH.png - а когда открываеш письмо - символы вместо кириллицы

    • header('Content-Type: text/plain; charset="UTF-8"');
      header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
      header('Cache-Control: no-store, no-cache, must-revalidate');
      header('Cache-Control: post-check=0, pre-check=0', FALSE);
      header('Pragma: no-cache');
      .........
      $to = "mail@mail.ru";
      $from = "dget@gdet.ru";
      $subject = "ДЖЭТ. Резюме от ".$surname." ".$name;
      $message = "Пользователь ".$surname." ".$name." отправил на сайте ДЖЭТ свое резюме.".((!empty($comment)) ? " Сопроводительное письмо: ".$comment : "");
      $boundary = "---";
      $headers = "From: $from\nReply-To: $from\n";
      $headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"";
      $body = "--$boundary\n";
      $body .= "Content-type: text/html; charset='utf-8'\n";
      $body .= "Content-Transfer-Encoding: quoted-printablenn";
      $body .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode($filename)."?=\n\n";
      $body .= $message."\n";
      $body .= "--$boundary\n";
      $file = fopen($uploaddir . $filename, "r");
      $text = fread($file, filesize($uploaddir . $filename));
      fclose($file);
      $body .= "Content-Type: application/octet-stream; name==?utf-8?B?".base64_encode($uploaddir . $filename)."?=\n";
      $body .= "Content-Transfer-Encoding: base64\n";
      $body .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode($uploaddir . $filename)."?=\n\n";
      $body .= chunk_split(base64_encode($text))."\n";
      $body .= "--".$boundary ."--\n";
      mail($to, $subject, $body, $headers);

    Может кто подсказать в чем причина? Заранее спасибо! (файл с кодом в кодировке UTF-8 (без BOM))
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    помоему лишняя строка есть: первый Content-Disposition который перед $message.
     
  3. Diakon

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

    С нами с:
    22 сен 2009
    Сообщения:
    7
    Симпатии:
    0
    Нет, без $body .= "Content-Disposition: attachment; filename==?utf-8?B?".base64_encode($filename)."?=\n\n"; в теле письма вообще нет текта - только присоединенный файл
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.099
    Симпатии:
    1.243
    Адрес:
    там-сям
    это из-за еще предыдущей строчки:
    )))
    каждый заголовок должен заканчиваться: \n
    а между заголовками и телом должно быть два перевода: \n\n.

    edited 2014-06-29: согласно RFC вместо \n должна использоваться пара \r\n. но готовые примеры и масса обсуждений говорят, что на практике почтовые агенты принимают и \n тоже.
    (однако лучше следовать правилам)

    Итого (если не заменять \n на \r\n):
    Код (PHP):
    1. $body = "--$boundary\n";
    2. $body .= "Content-type: text/html; charset='utf-8'\n";
    3. $body .= "Content-Transfer-Encoding: quoted-printable\n\n"; // отделяем тело сообщения двумя переводами строки!
    4. $body .= $message."\n";
    5. $body .= "--$boundary\n";