Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Доработанная функция отправки почты
Форумы портала PHP.SU » PHP » Пользовательские функции » Доработанная функция отправки почты

Страниц (1): [1]
 

1. Uchkuma - 06 Июля, 2010 - 08:51:44 - перейти к сообщению
99% новичков сталкиваются с проблемой отправки почты стандартной функцией mail().

Основные проблемы:
1. Не доставляются письма на mail.ru или доставляется только 1 в сутки.
2. В теме и содержании письма отображаются крякозябры.

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

Второй вопрос решается указанием правильной кодировки и кодированием заголовка темы.
PHP:
скопировать код в буфер обмена
  1. ## Функция кодирования
  2. function mime_header_encode($str, $data_charset, $send_charset=false){
  3. # Если задана кодировка передачи и она не совпадает
  4. # с кодировкой данных, конвертируем строку
  5. if($send_charset AND $data_charset!=$send_charset){
  6. $str = iconv($data_charset, $send_charset, $str);
  7. } else {
  8. $send_charset = $data_charset;
  9. }
  10. return '=?'.$send_charset.'?B?'.base64_encode($str).'?=';
  11.  
  12. }
  13.  
  14.  
  15. function sendmail($to, $subj, $msg, $from, $attach=false){
  16.  
  17. $charset = 'windows-1251';//кодировка письма
  18.  
  19. $subj = mime_header_encode($subj, $charset);//кодируем поле "Тема"
  20.  
  21. $head = "MIME-Version: 1.0\r\n";
  22. $head .= "X-Mailer: PHPMail Tool\r\n";
  23. //$head .= "X-Sender: $from\r\n";
  24. $head .= "X-Priority: 3\r\n";//приоритет
  25. $head .= "From: $from\r\n";
  26.  
  27. # Если есть вложение, присоединяем его
  28. if($attach AND is_file($attach)){
  29. $fp = fopen($attach, 'rb');
  30. if($fp){
  31. $file = fread($fp, filesize($attach));
  32. fclose($fp);
  33. $filename = basename($attach);
  34. $boundary = '--'.md5(uniqid(time()));
  35. $msg .= "\r\n\r\n--$boundary\r\n";
  36. $msg .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
  37. $msg .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
  38. $msg .= "Content-Transfer-Encoding: base64\r\n\r\n";
  39. $msg .= chunk_split(base64_encode($file));
  40. $msg .= "\r\n--$boundary--";
  41. $head .= "Content-Type: multipart/mixed;\r\n";
  42. $head .= " boundary=$boundary";
  43. $head .= "\r\n\r\n--$boundary\r\n";
  44. }
  45. }
  46.  
  47. $head .= "Content-Type: text/plain; charset=$charset\r\n";
  48. $head .= "Content-Transfer-Encoding: 8bit\r\n";
  49.  
  50. return mail($to, $subj, $msg, $head, '-f'.$from);
  51.  
  52. }

Стандартной функции кодирования в PHP нет (есть, кажется, в какой-то библиотеке - пусть меня поправят), поэтому мы определяем свою.

Функция mime_header_encode() принимает 2 обязательных параметра - это кодируемая строка и ее кодировка, и один необязательный - кодировка передачи данных.

Функция sendmail() принимает 4 обязательных параметра - получатель, тема, сообщение, отправитель; и 1 необязательный - файл вложения.
В качестве отправителя рекомендуется указать реальный адрес, принадлежащий вашему хостингу.

Вполне возможно, что после отправки писем с отсутствующими необходимыми заголовками, Вы могли попасть в блэклист mail.ru и Ваши письма по прежнему не будут доставляться. В этом случае пишите кляузу на mail.ru -> Инструкция.

 

Powered by ExBB FM 1.0 RC1