webew
Войти » Регистрация
 
PHP

Отправка e-mail в русской кодировке средствами PHP

17 апреля 2008, 19:22

Стандартная функция отправки почты в PHP не заботится о кодировке письма, а специальные классы отправки писем могут показаться слишком тяжеловесным решением. В настоящей статье приведена простая функция, которая позволяет отправлять MIME-совместимые письма на русском языке в виде простого текста или в формате HTML.

Тело письма может быть текстом в любой кодировке. Немного сложнее дело обстоит с составляющими заголовка письма (Subject, From, To), они по стандарту должны быть в US-ASCII. Использование в заголовках кодированного текста регламентируется стандартом RFC-2047. Стандарт задает две возможные формы кодирования - BASE64 и Quoted-Printable. BASE64 более универсальна и работает в том числе для кодировки UTF-8, поэтому мы выбрали именно эту форму. MIME-совместимый почтовый клиент обязан уметь читать обе формы.

Далее код функции, который достаточно схематичен:

<?php

function send_mime_mail($name_from, // имя отправителя
                        $email_from, // email отправителя
                        $name_to, // имя получателя
                        $email_to, // email получателя
                        $data_charset, // кодировка переданных данных
                        $send_charset, // кодировка письма
                        $subject, // тема письма
                        $body, // текст письма
                        $html = FALSE, // письмо в виде html или обычного текста
                        $reply_to = FALSE
                        ) {
  $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";
  $type = ($html) ? 'html' : 'plain';
  $headers .= "Content-type: text/$type; charset=$send_charset\r\n";
  $headers .= "Mime-Version: 1.0\r\n";
  if ($reply_to) {
      $headers .= "Reply-To: $reply_to";
  }
  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) . '?=';
}

?>

Мы определили собственную функцию mime_header_encode() для преобразования каждого заголовка в MIME-совместимый формат, несмотря на то, что в PHP предусмотрена аналогичная функция mb_encode_mimeheader(). От встроенной функции нам пришлось отказаться, так как на нашем сервере (PHP 5.1.6) она работает некорректно (возвращает неверный результат).

Использование описанной функции достаточно простое, см. пример ниже. В случае, если кодировка отправки письма отличается от текущей кодировки данных, используется iconv() для преобразования кодировки.

<?php
send_mime_mail('Автор письма',
               'sender@site.ru',
               'Получатель письма',
               'recepient@site.ru',
               'CP1251',  // кодировка, в которой находятся передаваемые строки
               'KOI8-R', // кодировка, в которой будет отправлено письмо
               'Письмо-уведомление',
               "Здравствуйте, я Ваша программа!");
?>

© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
NO USERPIC

rgbeast

У iconv обнаружилась одна особенность: если символ не существует в целевой кодировке, то строка обрезается на этом символе. http://ru.php.net/manual/ru/function.iconv.php

Такое происходит при попадании в отправляемый текст юникодовских кавычек или юникодовских тире (или символов алфафита третьего языка при преобразовании UTF-8 в однобайтовую кодировку).

Чтобы игнорировать непечатные символы, следует заменить вызовы iconv на следующие:
   $body = iconv($data_charset, $send_charset . '//IGNORE', $body);
    $str = iconv($data_charset, $send_charset . '//IGNORE', $str);
13.09.2008, 22:02
Ответить

1234ru

На самом деле эта проблема даже шире.

iconv() действительно очень плохо себя ведет, когда наталкивается на символ, которого нет в кодировке-приемнике (грубо говоря). //IGNORE подавляет ошибку, но результирующая строка по-прежнему получается обрезанной (неизвестно еще, что лучше). Т.е., например, iconv('UTF-8', 'KOI8-R//IGNORE', 'Заказ № 123') даст просто "Заказ " (потому что символ № в KOI8-R отсутствует).
Эта проблема достаточно широко известна в среде PHP-программистов (чего только стоят комментарии к странице руководства, посвященной этой функции).
Предлагают альтернативный путь - с использованием mb_convert_encoding(). Но там тоже не все гладко: проблема отсутствия в одних кодировках символов, присутствующих в других (особенно UTF-8) кодировках, там решается не так топорно, как в iconv(), но все же грубовато - они заменяются на знаки вопросов. Помогает установка соответствующей директивы:

ini_set('mbstring.substitute_character', "none");

ну или в php.ini:

mbstring.substitute_character = "none"
То, что не убивает нас, делает нас инвалидами.
09.08.2009, 08:52
Ответить

Serg_pnz

Немного не в тему: а что в пхп-скрипте написать, что бы запросить уведомление о прочтении? /*смотрел-смотрел код оутлукэкспресса, но так и не догнал*/
14.09.2008, 16:11
Ответить
NO USERPIC

rgbeast

Запрос уведомления о прочтении это дополнительный заголовок письма:
Disposition-Notification-To: $email_from

см. RFC 3798

В контексте кода выше:
  $headers = "From: $from\r\n";
  $headers .= "Disposition-Notification-To: $email_from\r\n";
  $headers .= "Content-type: text/plain; charset=$send_charset\r\n";

14.09.2008, 16:59
Ответить
NO USERPIC

Azazel

У меня есть необходимость отправки ссылки в тексте письма. Вместо ссылки приходит:<a href=.....................</a>. Что делать?
08.11.2008, 16:50
Ответить
NO USERPIC

rgbeast

Если тип письма text/plain, то оно будет отправленно как простой текст. Что отправились ссылки, формат письма нужно сделать html. В коде выше замените строчку с Content-Type на следующую
 $headers .= "Content-type: text/html; charset=$send_charset\r\n";


При этом письмо должно быть в html, то есть теги будут вести себя как теги, а новая строка игнорироваться.
08.11.2008, 17:13
Ответить
NO USERPIC

Azazel

Большое спасибо!
08.11.2008, 17:24
Ответить
NO USERPIC

neoromeo

Спасибо , очень полезная статья.
27.11.2008, 12:33
Ответить
NO USERPIC

colonel

Григорий, скажите пожалуйста, а как быть, когда нужно отправить письмо нескольким получателям?

Вопрос относится к этой статье: http://webew.ru/articles/297.webew
27.02.2009, 19:41
Ответить
NO USERPIC

rgbeast

Достаточно просто переписать функцию так, чтобы она принимала массив имен и массив email-адресов получателей:
function send_mime_mail_a($name_from, // имя отправителя
                        $email_from, // email отправителя
                        $name_to, // массив имен получателя
                        $email_to, // массив email-адресов получателя
                        $data_charset, // кодировка переданных данных
                        $send_charset, // кодировка письма
                        $subject, // тема письма
                        $body // текст письма
                        ) {
  $to = '';
  for($i=0;$i<count($name_to);$i++) {
    $to .= mime_header_encode($name_to[$i], $data_charset, $send_charset)  . ' <' . $email_to[$i] . '>' . ( ($i<count($name_to)-1)?', ':'');
  }
  $subject = mime_header_encode($subject, $data_charset, $send_charset);
  /* ... */
  /* далее без изменений */

27.02.2009, 20:34
Ответить
NO USERPIC

colonel

Сдается мне что это не работает ... Письма не приходят, хотя функция mail срабатывает.
28.02.2009, 00:21
Ответить
NO USERPIC

rgbeast

Странно, я ее протестировал, у меня письма дошли. Вызывать нужно примерно так:
send_mime_mail_a('Отправитель', 'sender@example.com', array('Петя', 'Иван'), array('peter@example.com', 'ivan@example.com'), 'KOI8-R', 'KOI8-R', 'Тема письма', 'Текст письма');

Посмотрите, что записано в /var/log/maillog после отправки
28.02.2009, 08:45
Ответить
NO USERPIC

colonel

Да, я там немного напутал с массивами. Просто я отправлял Как 'Петя'; 'asd@asd.ru, asd2@asd.ru'. Вот и не получалось.

Подскажите пожалуйста, как мне запросить уведомление о прочтении и открытии письма?

Спасибо.
01.03.2009, 21:57
Ответить
NO USERPIC

rgbeast

См. выше http://webew.ru/articles/297.webew#1253
01.03.2009, 22:06
Ответить
NO USERPIC

colonel

Спасибо большое. Буду пробовать.
27.02.2009, 21:49
Ответить
NO USERPIC

mixus

Спасибо, очень помогло.
28.04.2009, 13:10
Ответить
NO USERPIC

evgeni777

На основе Вашей статьи сделал скрипт
<?php

$file=file("../mailadr.txt");
$b1=$_POST['name'];
$b2=$_POST['email'];
$b3=$_POST['timer'];
$b4=$_POST['text'];

$headers = 'MIME-Version: 1.0' . "\r\n" ;
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n" ;

for($i=0;$i<sizeof($file);$i++)
{
sleep($b3);
mail($file[$i],"",$b4, $headers);}

echo "Почта отправлена ";
echo '<hr>';
echo '<a href="../index.htm"><font face="Times New Roman"><b>Главная</b></font></a>';
echo '<hr>';
echo '<a href="../news.htm"><font face="Times New Roman"><b>Рассылка</b></font></a>';

?>
где $b4=$_POST['text']; - тело письма
$headers = 'MIME-Version: 1.0' . "\r\n" ;
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n" ; - заголовки

Скрипт работает, при посылке письма содержащее URL ссылки, письма приходят, но ссылки имеют
URL адрес вида - attachment:/%22http://www.mysite.ru/%22 - как это поправить?
Evg
09.08.2009, 11:19
Ответить
NO USERPIC

rgbeast

%22 это кавычка, посмотрите внимательно содержимое $b4, нет ли лишних кавычек или слешей перед кавычкой. Посмотрите статью про магические кавычки.
10.08.2009, 00:28
Ответить
NO USERPIC

evgeni777

Огромное спасибо ! Статья действительно помогла в проблеме,
советую всем её почитать т.к. не знание такой тонкости может изрядно
потрепать нервы.
Evg
10.08.2009, 00:53
Ответить
NO USERPIC

BuHunyx

Большое спаибо за статью, оч помогла. Вопрос не совсем не потеме , как прикреплять вложения к письмам?
VesV
28.09.2009, 09:12
Ответить
NO USERPIC

rgbeast

Можно использовать один из пакетов, например PEAR::Mail_Mime http://pear.php.net/package/Mail_Mime

Если хотите вручную формировать письмо, то смотрите описание MIME: http://en.wikipedia.org/wiki/MIME
28.09.2009, 10:29
Ответить
NO USERPIC

BuHunyx

Огромное спасибо, все это очень интересно , но время на изучение (к сажелению) очень мало . может найдется пример кода?
VesV
28.09.2009, 11:05
Ответить
NO USERPIC

rgbeast

Вот здесь есть пример: http://phpclub.ru/detail/article/mail#part_7_1
28.09.2009, 14:41
Ответить

css

Вообще функция клевая, у меня только она не стала работать в Аутлуке, я им не пользуюсь, но проверку там делаю, так как остались еще пользователи и клиенты которые в нем сидят, или сидят вообще принудительно на работе.
В Аутлуке не приходило нормально..

Скидываю, как я переделала эту функцию, правда не проверяла если кодировка письма и кодировка сайта не совпадает, но если везде 1251, то все отлично работает. Уходит на несколько емайлов, только емайлы надо писать тупо емайл1, емайл2 и т.д. Без имен. Кодировка везде нормальная и в Бате и в Аутлуке.
Если мало разбираетесь, копируйте функцию, потом на приведенном примере переписывайте вызов.

Функция

function send_mime_mail($name_from, // имя отправителя
                        $email_from, // email отправителя
                        $email_to, // email получателя
                        $data_charset, // кодировка переданных данных
                        $send_charset, // кодировка письма
                        $subject, // тема письма
                        $body // текст письма
                        ) {
  $to = $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 ="Content-type: text/plain; charset=\"".$send_charset."\"\n";
  $headers .="From: $from\n";
  $headers.="Mime-Version: 1.0\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) . '?=';
}


И сам вызов функции
send_mime_mail('Название от кого пришло - Ваше ФИО или название фирмы',
               'dmin@leadsyou.ru', //Ваш емайл, или куда им отвечать на письмо
               'емайл1, емайл2, емайл3',  //куда письма рассылаем
               'windows-1251',  
               'windows-1251',
               'Тема письма',
               'Я пишу письмо большое, не плохое и кривое... Прочитай его без скуки В Бате или Аутлуке.. ну и так далее.. ');
16.02.2010, 09:56
Ответить
NO USERPIC

rgbeast

Спасибо за комментарий и за то, что поделились своим кодом, я в аутлуке не тестировал. Скажите, какое изменение было ключевым для аутлука - добавление Mime-version в заголовок или отказ от кодирования имени в $to? Вариант описанный в статье не предполагает нескольких адресатов, а Ваш вариант это допускает, но интересно что именно требуется аутлуку.
16.02.2010, 10:24
Ответить

css

Да Вы знаете, я даже точно не скажу.. Мучалась, мучалась, потмо взяла тот код который у меня работал в Аутлуке, совместила с этим.. Как говориться сделала оптимальный вариант. Кстати сейчас сижу над юникодовскими письмами. Приходит нормально, но опять Аутлук гадит, спецсимволы не проходят. Главное в письме проходят, в теле письма, в в теме вопросики на месте этих символов.
У меня название сайта на башкирском есть, там один спецсимвол.. В тело идет, а в тему или в From - нет.
А надо же народу показывать откуда письмо, с какого сайта, а то могут не снять.
Отказ от кодирования в To - это просто возможность добавить несколько емайлов, Аутлук тут не причем. Я думаю не обязательно присылать письма типа "Васе Пупкину <vasa@mail.ru>" можно и просто послать через запятую на емайлы. Потмоу что если мы кодируем емайлы через запятую - у меня есть подозрение, что запятые тоже кодируются.
А с Аутлуком меня просто клиенты достают, сидят на этом Глюке, я 15 писем тестовых сняла, он у меня уже умер, начал пароль просить.. и т.п. но хозяин -барин, приходится. Так что я ему интуитивно подсовываю что нибудь )))) главное чтобы съел. Может как раз добавление Mime-version помогло.

КСТАТИ!!! мне пришло уведомление от вас что комментарий ваш добавлен.. Копирую как это пришло в БАте

ъДТБЧУФЧХКФЕ, ьММБ.


rgbeast ПФЧЕФЙМ ОБ ЧБЫ ЛПННЕОФБТЙК Л УППВЭЕОЙА"пФРТБЧЛБ e-mail Ч ТХУУЛПК ЛПДЙТПЧЛЕ УТЕДУФЧБНЙ PHP":
http://webew.ru/articles/297.webew#2746

рТПЖЙМШ РПМШЪПЧБФЕМС rgbeast НПЦОП РПУНПФТЕФШ ОБ УФТБОЙГЕ
http://webew.ru/users/33.webew


----------
рПЮФПЧЩК ТПВПФ РПТФБМБ webew.ru

Срочно чистите! Это в Бате так пришло. Нет я могу канешно ручками кодировку сменить, но большая часть пользователей в России или не догадаются, или просто тупо не снимут ваше письмо, подумав что это спам.
16.02.2010, 10:38
Ответить
NO USERPIC

rgbeast

Добавил Ваш кусок Mime-Version. Как сейчас Вам пришло уведомление?
16.02.2010, 11:00
Ответить

css

Ну вот! теперь все отлично! приняла Батом, все ок, потмо переслала на другйо емайл, который у меня в Аутлуке сидит, там тоже все нормально.
16.02.2010, 11:05
Ответить
NO USERPIC

rgbeast

Значит дело в Mime-Version. Внес исправление в статью. Большое спасибо!
16.02.2010, 11:20
Ответить
NO USERPIC

misppa

<FORM ACTION="mailto:мойадрес@rambler.ru" ENCTYPE="text/plain" onSubmit="return checkForm(this);" method=post>

Эта штука является одной из частей JavaS скрипта. Пожалуйста помогите...

....куда и как прописывать вашу function send_mime_mail?

В моем случае ...с "этой штукой" - открывается аутлук,...где английские значения читается отлично, а русские на неведомом мне языке.
Адрес электронной почты настроила в аутлуке на прием эл. пимем. Когда жму "отправить" выскакивает ошибка....., и что письмо не прошло, но аутлук сам, потом показывает, что письмо достаклено на указанный адрес.
Как все это настроить до простого, земного, русского.

Есть скрипт, который шикарно отправляет почту без аутлука, и он мне очень нравится,но я ...тем более...! не знаю, как в него прописать корзину, со всеми зацепленными товарами....

Пожалуйста, помогите....
Буду очень признательна.


13
16.08.2011, 02:27
Ответить

1234ru

send_mime_mail должна работать на сервере.
Javascript отрабатывает на клиенте (в браузере).

Если хотите, чтобы письмо отправлялось этой функцией, Вам нужно вместо адреса в атрибут action прописать адрес скрипта на сервере, например:

<form action="send_mail.php" method="POST" >...</form>


В этом скрипте нужно получить имя и email получателя из массива $_POST, после чего вызвать send_mime_mail(), которая отправит письмо.

Потом добавьте onSubmit="checkForm(this)" (это какая-то проверка формы; сначала нужно было убрать, чтобы не мешалась при отладке).
То, что не убивает нас, делает нас инвалидами.
16.08.2011, 12:12
Ответить
NO USERPIC

webber

У меня проблема, если можете помогите

На nokia n97 письма отправленные функцией mail приходят в крякозяблах
скрин могу отправить
Что интересно с других почтовиков приходят в норм кодировке

Что я только немудрил включая пример приведенный выше
Все равно абра кодабра какая то

Помогите
10.03.2010, 12:11
Ответить
NO USERPIC

rgbeast

В какой кодировке отправляете? Лучше всего не скрин, а заголовки письма, отправленного данной прогой и заголовки нормально читаемого русского письма.
10.03.2010, 14:24
Ответить
NO USERPIC

webber

А отправляю вот так вот:

$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=windows-1251' . "\r\n"; // <<<< Здесь я что только непробовал ставить но все равно крякозяблы идут
$headers = 'From: www.тратата.ru <тратата@тратата.ru>' . "\r\n";
'Reply-To: тратата@тратата.ru' . "\r\n" .
'X-Mailer: PHP/';

//iconv("ANSI","windows-1251",$submess); ///здесь пробовал конвертировать в другую кодировку переменную темы письма
//iconv("us-ascii","windows-1251",$submess);
//iconv("UTF-8","windows-1251",$submess);
//iconv("ISO-8859-1","windows-1251",$submess);
//iconv("ISO-8859-5","windows-1251",$submess);

$messagen="Заявка с сайта \n\nИмя: $fio\nE-mail: $email\nТелефон: $phone\nАдрес: $adres\nМетро: $mmt\nКомментарий: $mess\n\n$zakaz";
mail($to1, $submess." (метро: $mmt)"."-(адрес: $adres)", $messagen, $headers);
mail($to2, $submess." (метро: $mmt)"."-(адрес: $adres)", $messagen, $headers);
10.03.2010, 14:38
Ответить
NO USERPIC

rgbeast

Это естественно, ведь функция mail не кодирует заголовки в MIME-совместимый формат. Воспользуйтесь функцией send_mime_mail(), описанной в статье.
10.03.2010, 15:04
Ответить
NO USERPIC

webber

Спасибо, заработало
но заработало вот в таком виде
а наоборот KOI8-R передавал
и отправлял CP когда неработало

send_mime_mail('www.тратата.ru',
'тратата@тратата.ru',
'тратата',
'тратата@тратата.ru',
'CP1251', // кодировка, в которой находятся передаваемые строки
'KOI8-R', // кодировка, в которой будет отправлено письмо
$submess." (: $mmt)"."-(: $adres)",
$messagen);
10.03.2010, 15:19
Ответить

1234ru

Бывает нужно также регулировать тип отправляемого письма: простой текст или HTML. Для этого можно сделать дополнительный необязательный аргумент:
function send_mime_mail(
    ...
    $body, // текст письма
    $html = FALSE // письмо в виде html или обычного текста
    ) {
    ...
    $type = ($html) ? 'html' : 'plain';
    $headers .= "Content-type: text/$type; charset=$send_charset\r\n";
    ...
}
То, что не убивает нас, делает нас инвалидами.
24.04.2010, 21:15
Ответить
NO USERPIC

ddonskoy

Мужики, помогите. Сил уже нет бороться.

Тестил на нескольких почтовых клиентах. Письмо приходит. Заголовки по русски, а вот в теле письма все ?????????
Что только не делал.
Где может быть затык??? Сайт на utf-8

Вот заголовок письма.

Date: Sat, 11 Sep 2010 00:28:39 +0400
To: testweb2010@yandex.ru
Subject: =?KOI8-R?B?9MXNwSDQydPYzcE=?=
Content-type: text/html; charset="KOI8-R"
From: =?KOI8-R?B?7sHa18HOycUgz9Qgy8/HzyDQ0snbzM8gLSD3wdvFIObp7yDJzMkgzsHa18HOycUgxsnSzdk=?= <dmin@leadsyou.ru>
Mime-Version: 1.0
Content-type: text/html; charset="KOI8-R"
Message-ID: <auto-000056602821@mail.ip.ncnet.ru>
Authentication-Results: mxfront67.mail.yandex.net; spf=softfail (mxfront67.mail.yandex.net: transitioning domain of leadsyou.ru does not designate 77.37.255.50 as permitted sender) smtp.mail=dmin@leadsyou.ru
X-Yandex-TimeMark: 1284150523
X-Yandex-Spam: 1
X-Yandex-Front: mxfront67.mail.yandex.net
X-Yandex-Forward: 8080d0ab96b8291066c1b0d759f1377d


???????? ????????????? TEST
10.09.2010, 20:32
Ответить
NO USERPIC

rgbeast

Попробуйте без кавычек:
Content-type: text/html; charset=KOI8-R

И посмотрите исходник письма, которое пришло. Что в нем содержится? Правильный текст в кодировке koi8?
11.09.2010, 09:09
Ответить
NO USERPIC

ddonskoy

rgbeast - спасибо за ответ.

Без ковычек тоже не пошло. :-(

Опять тело письма в ???????? , хотя английский читается нормально....

Исходник письма выше постом.
11.09.2010, 21:48
Ответить
NO USERPIC

rgbeast

Непонятно что в исходнике письма на месте вопросов. Это ведь не знаки вопросов в чистом виде, а какие-то символы. Какие?
11.09.2010, 23:14
Ответить

paulus

Это знаки вопросов в чистом виде: RFC позволяет в почте пропускать только
семибитные символы. Хорошие почтовики обрезают всё, что не пролезает в
RFC.

Автору: MIME Вас спасет.
12.09.2010, 07:10
Ответить
NO USERPIC

rgbeast

paulus, пришли пожалуйста, если у тебя есть готовый пример, как сконвертировать тело письма в 7-битное, чтобы хорошие почтовики его читали.
12.09.2010, 11:32
Ответить

paulus

Кажется, достаточно добавить заголовок
Content-Transfer-Encoding: base64
и над данными сделать, соответственно, base64_encode().

Кстати, в голову пришло, что в данном случае, возможно, вопросики выдает iconv, который не знает кодировки / не может найти подстановочные символы. В любом случае, base64 в почте — это правильная вещь.
12.09.2010, 14:00
Ответить
NO USERPIC

rgbeast

Кстати, если бы почтовики следовали бы RFC, то ты бы видел вопросы вместо письма с уведомлением о новом сообщении на webew. На webew работает тот код, который описан в статье выше
12.09.2010, 14:52
Ответить

paulus

Да, я знаю. Многие серверы относятся более толерантно к тому, что, казалось бы, очевидно. Например, нет смысла удалять восьмибитные данные, если тебе их не интерпретировать. Аналогично — какой смысл в том, что в DNS нельзя прописывать запись MX к записи, которая является CNAME? Это тоже архаичная глупость. И sendmail упорно не хочет отправлять почту на такие имена. И чистит восьмибитные символы. Ну, его писали во времена архаичных глупостей. Такой уж он есть.
12.09.2010, 16:15
Ответить
NO USERPIC

ddonskoy

Скопировал весь исходник письма, что выдает Bat

X-Yandex-FolderName: Vhodyashchie
Received: from mxfront76.mail.yandex.net ([127.0.0.1])
by mxfront76.mail.yandex.net with LMTP id ieqWv6xw
for <testweb2010@yandex.ru>; Sun, 12 Sep 2010 01:44:40 +0400
Received: from mail.ip.ncnet.ru (mail.onlime.ru [77.37.255.50])
by mxfront76.mail.yandex.net (Yandex) with SMTP id 6C57129A8069
for <testweb2010@yandex.ru>; Sun, 12 Sep 2010 01:44:40 +0400 (MSD)
Received: from [95.84.239.82] (HELO ?????????-??.onlime.ru)
by mail.ip.ncnet.ru (CommuniGate Pro SMTP 5.2.12)
with ESMTPS id 56635487 for testweb2010@yandex.ru; Sun, 12 Sep 2010 01:54:17 +0400
Date: Sun, 12 Sep 2010 01:44:39 +0400
To: testweb2010@yandex.ru
Subject: =?KOI8-R?B?8M/E1NfF0tbExc7JxSDSxcfJ09TB0sPJySDOwSDTwcrUxSB3d3cuZmlsbWFya2EucnU=?=
Content-type: text/html; charset="KOI8-R"
From: =?KOI8-R?B?RklsbWFya2EucnU=?= <dmin@leadsyou.ru>
Mime-Version: 1.0
Content-type: text/html; charset=".KOI8-R.
Message-ID: <auto-000056635487@mail.ip.ncnet.ru>
Authentication-Results: mxfront76.mail.yandex.net; spf=softfail (mxfront76.mail.yandex.net: transitioning domain of leadsyou.ru does not designate 77.37.255.50 as permitted sender) smtp.mail=dmin@leadsyou.ru
X-Yandex-TimeMark: 1284241480
X-Yandex-Spam: 1
X-Yandex-Front: mxfront76.mail.yandex.net
X-Yandex-Forward: 8080d0ab96b8291066c1b0d759f1377d

??? ????????? ???????? ???????? ?? ????????? ??????
??? Login\e-mail : Demo
??? ??????: Demo
12.09.2010, 08:53
Ответить

1234ru

Предлагаю добавить возможность указывать заголовок Reply-To:

function send_mime_mail($name_from, // имя отправителя
                        $email_from, // email отправителя
                        $name_to, // имя получателя
                        $email_to, // email получателя
                        $data_charset, // кодировка переданных данных
                        $send_charset, // кодировка письма
                        $subject, // тема письма
                        $body, // текст письма
                        $html = FALSE, // письмо в виде html или обычного текста
                        $reply_to = FALSE
                        ) {
  $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);
    $body = mb_convert_encoding($body, $send_charset, $data_charset);
  }
  $headers = "From: $from\r\n";
  $type = ($html) ? 'html' : 'plain';
  $headers .= "Content-type: text/$type; charset=$send_charset\r\n";
  $headers .= "Mime-Version: 1.0\r\n";
  if ($reply_to)
      $headers .= "Reply-To: $reply_to";

  return mail($to, $subject, $body, $headers);
}


А вообще надо сделать send_mime_mail2, которая аргументы принимает в виде массива (соответственно, ненужные можно опустить; например, если письма отправляются в той же кодировке, что и принимаются функцией; или если нет имени отправителя/получателя; часто бывают ситуации, когда из всех аргументов нужны только три-четыре)
То, что не убивает нас, делает нас инвалидами.
05.04.2012, 13:56
Ответить
NO USERPIC

rgbeast

Спасибо, добавил в основной код. Насчет массива, наверное имеет смысл для дополнительных заголовков.
08.04.2012, 21:43
Ответить
NO USERPIC

Cool16

А как "прикрутить" отправку файла (изображения) на мэйл к этому скрипту???? Поскажите плиз...
01.08.2012, 01:28
Ответить
NO USERPIC

rgbeast

См. ветвь обсуждения http://webew.ru/articles/297.webew#2469
01.08.2012, 15:29
Ответить
NO USERPIC

gcps

При отправке письма вашей функцией письма не принимаются на mail.ru !!!
Их да же в спаме нет.
А на нашем домене они принимаются и в Bat нормально отображаются.

Что уже только не пробовал... У кого такие проблемы были - помогите...
11.09.2012, 13:02
Ответить
NO USERPIC

rgbeast

Смотрите /var/log/maillog на сервере, с которого отправляете. Там может быть указана причина непринятия письма mail.ru. У нас бывало, что ip попадал в базу mail.ru и нужно было им писать в поддержку.
11.09.2012, 14:23
Ответить
Добавить комментарий
Отображение комментариев: Древовидное | Плоское
© 2008—2017 webew.ru, связаться: x собака webew.ru
Сайт использует Flede и соответствует стандартам WAI-WCAG 1.0 на уровне A.
Rambler's Top100

Реклама: