Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.07.2017, 15:28   #1
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию Получение почты по POP3 из PHP

Идея такова:
Написать скрипт который будет принимать в качестве аргумента логин, пароль, адрес POP3 сервера и порт.
Заходить и проверять почту на данном ящике.
Если есть новое письмо обрабатывать его получая тело письма и его тему.
Этот не работает, в чём ошибка:
Код:
<?php
ob_implicit_flush();
header('content-type: text/html; charset=windows-1251');

// Определим пару CRLF:
define('CRLF',"\r\n");

// Функция для получения многострочного ответа:
function getData($fp)
{
    $data='';

    while ( !feof($fp) )
    {
        $line = trim(fgets($fp,1024));
        if(trim($line) == '.') break;
        $data .= $line;
    }
    return $data;
}

// Открываем сокет
$fp = fsockopen('pop.mysite.ru', 110, $errNo, $errStr, 10);
print fgets($fp,1024).'<br />';

// Посылаем Логин:
fputs($fp,'login'.CRLF);
print fgets($fp,1024).'<br />';

// Посылаем Пароль:
fputs($fp,'PASS *******'.CRLF);
print fgets($fp,1024).'<br />';

// Запрашиваем количество сообщений в ящике
fputs($fp,'STAT'.CRLF);
print getData($fp);

// Запрашиваем письмо № 1
fputs($fp,'RETR 1'.CRLF);
print getData($fp);

// Закрываем сессию:
fputs($fp,'QUIT'.CRLF);
?>
Или здесь в чём проблема:
Код:
<?php
//задаем форматированный вывод, чтобы удобнее было читать ответы по строкам
echo '<pre>';

$login='login';
$pass='*******';

//подключаемся к серверу
$f=fsockopen('pop.mysite.ru',110,$errno,$errstr,10);
if(!$f)
{
    die("Не удается подключиться к pop.mysite.ru: [$errno] $errstr");
}

/*
*читаем статус ответа, он может быть либо +OK, либо -ERR
*/
echo $s=fgets($f);
if (strpos($s,'+OK')!==0) die('ошибка подключения');

//авторизируемся, для этого надо отправить имя пользователя
fwrite($f,"USER $login\r\n");

//отправляем пароль
fwrite($f,"PASS $pass\r\n");

echo $s=fgets($f);

/*
*если авторизация успешна, то сервер выбросит сколько писем в ящике,
*иначе будет ошибка авторизации
*/
echo $s=fgets($f);
if (strpos($s,'+OK')!==0) die('ошибка авторизации');

//для примера получим первое сообщение командой TOP 1 1000(если задать много строк, то возвратится все сообщение.
// Для получения сообщения целиком можно также воспользоваться командой RETR 1, в данном случаи, если сообщение короче 1000 строк это тоже самое)
//сначала будут идти заголовки, потом пуcтая строка \r\n, потом само сообщение
//многострочные ответы почтовый сервер завершает строкой .\r\n

//посылка команды
fwrite($f,"TOP 1 1000\r\n");

$msg='';
$head='';

//чтение ответа
while (false!==($s=fgets($f)))
{
    //строка .\r\n данные закончились
    if ($s===".\r\n") break;

    //строка \r\n, заголовки закончились
    if ($s=="\r\n" && !$msg)
        $msg=' ';

    if (!$msg) $head.=$s;
    else $msg.=$s;
}

//выводим сообщение и заголовки
echo trim($head);
echo "\n\n---конец заголовков---\n\n";
echo trim($msg);

?>
Если у Вас есть свой вариант, буду толька рад.
YARK0S вне форума Ответить с цитированием
Старый 05.07.2017, 16:30   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

ошибка может быть в чем угодно.... от запятой до неверных портов
ошибки то пишет?
пошагово отлаживали?
ADSoft вне форума Ответить с цитированием
Старый 05.07.2017, 17:41   #3
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
ошибка может быть в чем угодно.... от запятой до неверных портов
ошибки то пишет?
пошагово отлаживали?
Не подключаеться к любой адресе $f=fsockopen('adresa',110,$errno,$e rrstr,10);
Попробуй у себя запустить, протестируй свой адрес.
Вторую часть кода.
YARK0S вне форума Ответить с цитированием
Старый 05.07.2017, 18:27   #4
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

а там точно есть к чему подключаться? (сервер pop)
ADSoft вне форума Ответить с цитированием
Старый 06.07.2017, 10:10   #5
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
а там точно есть к чему подключаться? (сервер pop)
Вроде всё гуд подключился! Одна ошибка:
Код:
WARNING fgets() has been disabled for security reasons on line
YARK0S вне форума Ответить с цитированием
Старый 06.07.2017, 11:37   #6
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

это предупреждение а не ошибка
ну и говорит о том что, в php.ini директива allow_url_fopen = 0,
или схожая
ADSoft вне форума Ответить с цитированием
Старый 06.07.2017, 13:04   #7
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
это предупреждение а не ошибка
ну и говорит о том что, в php.ini директива allow_url_fopen = 0,
или схожая
Заработало. Подскажи теперь как зделать если есть новое письмо, обрабатывать его получая тело письма и его тему.
Иммено новое!
Или отобразить непрочитанные письма.

Последний раз редактировалось YARK0S; 06.07.2017 в 13:32.
YARK0S вне форума Ответить с цитированием
Старый 06.07.2017, 15:59   #8
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

а вы в курсе, что протокол pop не позволяет такого делать?
хотите полноценной работы с непрочитанными письмами, папкама в ящиках и другими плюшками - посмотрите на протокол imap
ADSoft вне форума Ответить с цитированием
Старый 06.07.2017, 16:32   #9
YARK0S
Пользователь
 
Регистрация: 12.05.2017
Сообщений: 30
По умолчанию

Цитата:
Сообщение от ADSoft Посмотреть сообщение
а вы в курсе, что протокол pop не позволяет такого делать?
хотите полноценной работы с непрочитанными письмами, папкама в ящиках и другими плюшками - посмотрите на протокол imap
Да наслышан, спасибо тебе, где тебе лайк кинуть)
YARK0S вне форума Ответить с цитированием
Старый 06.07.2017, 17:49   #10
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

Цитата:
Сообщение от YARK0S Посмотреть сообщение
Да наслышан, спасибо тебе, где тебе лайк кинуть)
ну так слева - под профилем весы - отзыв так сказать
ADSoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение писем pop3 / imap с сервера phpusers PHP 0 02.05.2013 17:47
Подключение к серверу входящей почты (POP3-сервер) BuT@JL Работа с сетью в Delphi 0 04.02.2011 17:46
Получение почты чере pop3 Angel86rus Работа с сетью в Delphi 0 06.04.2010 08:28
POP3 получение количества новых писем KoBRaAndrey Работа с сетью в Delphi 0 11.12.2009 18:01
Получение почты NoName_emaNoN Win Api 0 29.11.2007 20:47