Перейти к содержимому



Прием email

#1 Scream

Scream
  • Пользователь
  • 42 сообщений
  • Репутация: 0
0

Отправлено 13 Март 2010 - 03:05

sc2r2bey создал тему об отправке мыла средствами php а мне стало интересно - можно ли принимать?
Вот нашел код для реализации подобной задачи но в 10 строке возникла ошибка... помогите разобраться!
<?
$pop_conn = fsockopen("pop3.yandex.ru", 110,$errno, $errstr, 10);
$code=fgets($pop_conn,1024);
fputs($pop_conn,"USER myname\r\n");
$code= fgets($pop_conn,1024);
fputs($pop_conn,"PASS password\r\n");
$code= fgets($pop_conn,1024);

fputs($pop_conn,"RETR 1\r\n");
$text.= get_data($pop_conn);
// в переменной $text сейчас все письмо вместе с заголовками.

// разделяем письмо на заголовки и тело, еще раз советую почитать Почтовый стандарт "MIME" (RFC1521) (http://webi.ru/webi_files/26_15_f.html)
$struct=fetch_structure($text);

// теперь раскладываем заголовки по полочкам
// и получаем удобный ассоциативный массив с удобным обращением к любому заголовку.
// например $mass_header['subject'] == "=?windows-1251?B?7/Do4uXy?="
$mass_header=decode_header($struct['header']);

// чтобы воспользоваться заголовком, который может содержать не латинские символы
// например тема письма, нужно прогнать заголовок через функцию декодирования.
$mass_header["subject"] = decode_mime_string($mass_header["subject"]);
// теперь можно использовать тему, теперь тут обычный читаемый текст

// Сейчас разберем заголовок Content-Type, это тип содержимого. Определим, что в письме, только текст или еще и файлы.
// Content-Type: text/plain; charset=Windows-1251 это обычное текстовое письмо
// Content-Type: multipart/mixed; boundary="_----------=_118224799143839" это составное письмо из нескольких частей, с вложенными файлами.
$type = $ctype = $mass_header['content-type'];
$ctype = split(";",$ctype);
$types = split("/",$ctype[0]);
$maintype = trim(strtolower($types[0])); // text или multipart
$subtype = trim(strtolower($types[1])); // а это подтип(plain, html, mixed)

// сейчас проверяем тип содержимого письма
// Если это обычное текстовое содержимое (текст или html) без вложений
if($maintype=="text")
{
// $subtype можно использовать эту переменную для определения текстовое письмо или html
// эту проверку можете поставить сами
// Передаем тело письма в функцию, на перекодирование. И так же посылаем заголовки, информирующие о том, как было закодировано письмо.
$body = compile_body($struct['body'],$mass_header["content-transfer-encoding"],$mass_header["content-type"]);
print $body;
}

// теперь рассмотрим вариант, если письмо имеет несколько разных частей.
// тут рассматриваю подтипы signed,mixed,related, но есть еще подтип alternative, который служит для альтернативного отображения письма.
// например, письмо в html и к нему же можно добавить альтернативное текстовое содержание.
// подробнее читайте про этот подтип в Почтовом стандарте "MIME" (RFC1521) (http://webi.ru/webi_files/26_15_f.html)
elseif($maintype=="multipart" and ereg($subtype,"signed,mixed,related"))
{
// получаем метку-разделитель частей письма
$boundary=get_boundary($mass_header['content-type']);

// на основе этого разделителя разбиваем письмо на части
$part = split_parts($boundary,$struct['body']);

// теперь обрабатываем каждую часть письма
for($i=0;$i<count($part);$i++) {

// разбиваем текущую часть на тело и заголовки
$email = fetch_structure($part[$i]);
$header = $email["header"];
$body = $email["body"];

// разбираем заголовки на массив
$headers = decode_header($header);
$ctype = $headers["content-type"];
$cid = $headers["content-id"];
$Actype = split(";",$headers["content-type"]);
$types = split("/",$Actype[0]);
$rctype = strtolower($Actype[0]);

// теперь проверяем, является ли эта часть прикрепленным файлом
$is_download = (ereg("name=",$headers["content-disposition"].$headers["content-type"]) || $headers["content-id"] != "" || $rctype == "message/rfc822");

// теперь читаем и выводим само тело части, если это обычный текст
if($rctype == "text/plain" && !$is_download) {
$body = compile_body($body,$headers["content-transfer-encoding"],$headers["content-type"]);
print $body;
}

// если это html
elseif($rctype == "text/html" && !$is_download) {
$body = compile_body($body,$headers["content-transfer-encoding"],$headers["content-type"]);
print $body;
}

// и наконец, если это файл
elseif($is_download) {

// Имя файла можно выдернуть из заголовков Content-Type или Content-Disposition
$cdisp = $headers["content-disposition"];
$ctype = $headers["content-type"];
$ctype2 = explode(";",$ctype);
$ctype2 = $ctype2[0];
$Atype = split("/",$ctype);
$Acdisp = split(";",$cdisp);
$fname = $Acdisp[1];
if(ereg("filename=(.*)",$fname,$regs))
$filename = $regs[1];
if($filename == "" && ereg("name=(.*)",$ctype,$regs))
$filename = $regs[1];
$filename = ereg_replace("\"(.*)\"","\\1",$filename);

// как получили имя файла, теперь его нужно декодировать
$filename = trim(decode_mime_string($filename));

// теперь читаем файл в переменную.
$body = compile_body($body,$headers["content-transfer-encoding"],$ctype);
// содержимое файла теперь в переменной $body и сейчас можно отдать содержимое файла в браузер или например сохранить на диске
$ft=fopen($filename,"wb");
fwrite($ft,$body);
fclose($ft);
}
}
}
?>

 

 

  • 0

#2 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 13 Март 2010 - 03:19

Убери точку перед равно. Это, скорее всего, не ошибка, а предупреждение. Ибо этосимвол конкатенации(склеивания), но он здесь явно ни к чему. Нет ни цикла, ни заранее заданной этой переменной, чтобы ее дополнить. И соответственно, раз переменная определяется впервые, то приклеивать ее не к чему, вот PHP и предупреждает об этом, но код выполняет.
  • 0

#3 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 13 Март 2010 - 10:39

Вот нашел код для реализации подобной задачи но в 10 строке возникла ошибка... помогите разобраться!

Scream, вообще-то сообщенные об ошибке следовало бы процитировать.
А по сути: в вашем коде не описана функция get_data(), о чем ругательство скорее всего и сообщает примерно так:
Fatal error: Call to undefined function get_data() in index.php on line 10

перевод на человеческий язык:
"Неустранимая ошибка: Вызов неизвестной функции get_data() на 10й строке файла index.php"
  • 0

#4 Scream

Scream
    Topic Starter
  • Пользователь
  • 42 сообщений
  • Репутация: 0

Отправлено 13 Март 2010 - 10:50

yury, именно она.
Fatal error: Call to undefined function get_data() in /home/.../read.php on line 10

gaaarfild, все равно ошибка.


  • 0

#5 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 13 Март 2010 - 11:31

get_data - а резве есть такая функция?
  • 0

#6 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 13 Март 2010 - 11:42

именно она.
Fatal error: Call to undefined function get_data() in /home/.../read.php on line 10

Scream,
ну так исправляйте эту ошибку.
Т.е. необходимо эту функцию описать, примерно так:
function get_data($arg)
{
//куча кода, в котором описывается то, что должна делать функция get_data()
}
тогда php будет доволен и ругаться перестанет. :P
  • 0

#7 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 13 Март 2010 - 12:10

я ж про что и говорю
надо смотреть 10 строку этого файла и 9 с 11 :P
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 13 Март 2010 - 23:23

Scream, смешно... Самая важная функция получения данных и не описана.
Значит вы не весь код получили. Стандартной функции get_data() нету, она должна быть определена.
  • 0

#9 gaaarfild

gaaarfild
  • Пользователь
  • 596 сообщений
  • Репутация: 0

Отправлено 13 Март 2010 - 23:27

Там где скачали, ругнитесь, что фуфло толкают! =)

Присоедините все php-файлы, которые идут с этим скриптом.
  • 0

#10 Scream

Scream
    Topic Starter
  • Пользователь
  • 42 сообщений
  • Репутация: 0

Отправлено 14 Март 2010 - 10:04

Проблема в том что я не помню где качал это и код там на странице просто был написан так что ни каких прилагающихся фалов тоже не было.


  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru