Как скрипту авторизоваться в почте?

PHPMailer, SwiftMailer отправляют почту, задача обратная - авторизоваться по нужному протоколу что бы получить доступ к списку писем из почтового ящика. Интересуют основные сервисы - Яндекс, Майл, Gmail
Может есть какие библиотеки? Как они называются, по каким ключевым словам их искать?
  • Вопрос задан
  • 158 просмотров
Решения вопроса 3
nazarpc
@nazarpc
Open Source enthusiast
В самом PHP уже есть нужная функциональность: https://secure.php.net/manual/en/book.imap.php
Ответ написан
Комментировать
mhthnz
@mhthnz
PHP, YII2, Golang, Linux
Вам нужна работа с протоколами POP3 или IMAP, вот есть библиотека для PHP:
https://github.com/Eden-PHP/Mail
Ответ написан
Комментировать
yarkov
@yarkov
Помог ответ? Отметь решением.
<?php

class pop3 {

  protected $fp = null;

  // коннект и логин на сервере
  public function __construct($host, $port, $user, $pwd) {
    if ( !$this->connect($host, $port) )
      throw new Exception('Connect to pop3 server failed');
    if ( !$this->login($user, $pwd) )
      throw new Exception('Login on pop3 server failed');
  }

  // возвращает количество писем в ящике и их размер
  public function count() {
    fwrite($this->fp, "STAT\r\n");
    $stat = fread($this->fp, 1024);
    if ( $stat[0] == '+' ) {
      list(, $num, $size) = explode(' ', $stat);
      return array($num, $size);
    } else {
      return false;
    }
  }

  // удаляем письма
  public function dele($id) {
    fwrite($this->fp, "DELE ".$id."\r\n");
    fread($this->fp, 1024);
  }

  // список писем
  /*public function mlist($mess_id = null) {
    if ( $mess_id > 0 ) {
      $mess = ' '.$mess_id;
      $concrette = true;
    } else {
      $mess = '';
      $concrette = false;
    }
    fwrite($this->fp, "LIST".$mess."\r\n");
    $data = fread($this->fp, 1024);
    if ( $data[0] == '+' ) {
      if ( $concrette ) {
        list(,, $size) = explode(' ', $data);
        return $size;
      } else {
        preg_match_all('!\d+!', $data, $m);
        return array($m[0][0], $m[0][1]);
      }
    } else {
      return false;
    }
  }*/

  // получение письма
  public function retr($id) {
    fwrite($this->fp, "RETR ".$id."\r\n");

    $data = '';
    while ( true )  {
      $tmp = fgets($this->fp, 1024);
      if ($tmp == ".\r\n") break;
      $data .= $tmp;
    }
    return explode("\r\n\r\n", $data, 2);
  }

  // соединение с сервером
  protected function connect($host, $port) {
    if ( function_exists('fsockopen') ) {
      $this->fp = fsockopen($host, $port, $errno, $errstr, 5);
      if ( !$this->fp || $errno > 0 ) {
        return false;
      }
      $banner = fread($this->fp, 1024); // баннер
    } else {
      return false;
    }
    return true;
  }

  // авторизация на сервере
  protected function login($user, $pwd) {
    fwrite($this->fp, "USER ".$user."\r\n");
    $answ = fread($this->fp, 1024);
    if ( $answ[0] == '+' ) {
      fwrite($this->fp, "PASS ".$pwd."\r\n");
      $answ = fread($this->fp, 1024);
      return $answ[0] == '+';
    } else {
      return false;
    }
    return $answ[0] == '+';
  }

  // прощаемся
  public function __destruct() {
    fwrite($this->fp, "QUIT\r\n");
    $quit = fread($this->fp, 1024);
    fclose($this->fp);
  }

}


<?php 

include('pop3.php'); 

// коннект к базе 
mysql_connect('localhost', 'root', '') or die('Connect to mysql server failed'); 
mysql_select_db('mbox') or die('DB selection failed'); 

try { 

  // читаем почту 
  $pop = new pop3('pop.mail.ru', 110, 'xxx', '******'); 

  // получаем количество писем 
  list($num) = $pop->count(); 

  // проходимся по всем письмам 
  for ( $i = 1; $i <= $num; $i++ ) { 

    list($hdr, $body) = $pop->retr($i); // письмо номер $i 

    // mail.ru кодирует всё в base64 и кодировку koi8-r 
    // обработка тела сообщения 
    $body = base64_decode($body); 
    $body = iconv('KOI8-R', 'WINDOWS-1251', $body); 

    // поиск темы письма 
    if ( preg_match("!Subject: ([^\n]+)!", $hdr, $m) ) { 
      list(, $charset, , $subj) = explode('?', $m[1]); 
      $subj = base64_decode($subj); 
      $subj = iconv('KOI8-R', 'WINDOWS-1251', $subj); 
    } 

    // вставляем в базу 
    $sql = 'INSERT INTO `mail` (`subj`, `body`) VALUES ('"'.$subj.'", "'.$body.'")'; 
    mysql_query($sql); 
    $pop->dele($i); // и удаляем письмо 
  } 

} catch (Exception $e) { 
  print $e->getMessage(); 
}
?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы