99% новичков сталкиваются с проблемой отправки почты стандартной функцией mail().
Основные проблемы:
1. Не доставляются письма на mail.ru или доставляется только 1 в сутки.
2. В теме и содержании письма отображаются крякозябры.
Первый вопрос в интернете предлагают решить отправкой через сокеты или установкой дополнительной библиотеки или класса. Но в основном данная проблема связана с отсутствием заголовка отправителя, что легко исправить.
Второй вопрос решается указанием правильной кодировки и кодированием заголовка темы.
PHP:
скопировать код в буфер обмена
## Функция кодирования function mime_header_encode($str, $data_charset, $send_charset=false){ # Если задана кодировка передачи и она не совпадает # с кодировкой данных, конвертируем строку if($send_charset AND $data_charset!=$send_charset){ $str = iconv($data_charset, $send_charset, $str); } else { $send_charset = $data_charset; } } function sendmail($to, $subj, $msg, $from, $attach=false){ $charset = 'windows-1251';//кодировка письма $subj = mime_header_encode($subj, $charset);//кодируем поле "Тема" $head = "MIME-Version: 1.0\r\n"; $head .= "X-Mailer: PHPMail Tool\r\n"; //$head .= "X-Sender: $from\r\n"; $head .= "X-Priority: 3\r\n";//приоритет $head .= "From: $from\r\n"; # Если есть вложение, присоединяем его $fp = fopen($attach, 'rb'); if($fp){ $msg .= "\r\n\r\n--$boundary\r\n"; $msg .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n"; $msg .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; $msg .= "Content-Transfer-Encoding: base64\r\n\r\n"; $msg .= "\r\n--$boundary--"; $head .= "Content-Type: multipart/mixed;\r\n"; $head .= " boundary=$boundary"; $head .= "\r\n\r\n--$boundary\r\n"; } } $head .= "Content-Type: text/plain; charset=$charset\r\n"; $head .= "Content-Transfer-Encoding: 8bit\r\n"; return mail($to, $subj, $msg, $head, '-f'.$from); }
Стандартной функции кодирования в PHP нет (есть, кажется, в какой-то библиотеке - пусть меня поправят), поэтому мы определяем свою.
Функция mime_header_encode() принимает 2 обязательных параметра - это кодируемая строка и ее кодировка, и один необязательный - кодировка передачи данных.
Функция sendmail() принимает 4 обязательных параметра - получатель, тема, сообщение, отправитель; и 1 необязательный - файл вложения.
В качестве отправителя рекомендуется указать реальный адрес, принадлежащий вашему хостингу.
Вполне возможно, что после отправки писем с отсутствующими необходимыми заголовками, Вы могли попасть в блэклист mail.ru и Ваши письма по прежнему не будут доставляться. В этом случае пишите кляузу на mail.ru -> Инструкция.(Отредактировано автором: 06 Июля, 2010 - 08:59:21)
|