Страница 1 из 1

Пара слов про почту

Добавлено: 04 фев 2009, 15:15
Karlson
Честно говоря, я- человек ленивый, чего и Вам желаю, и мне надоело для каждого почтового сервера писать свой скрипт проверки почты (обычно применяется при необходимости подтверждать регистрацию).
Вот и нашёл небольшой скрипт, который позволяет проверять почту по POP3 или IMAP, собственно, чем и решил поделиться:

Код: Выделить всё

<?php
class xMailClient {
    /*
        host connect to server
        example: mail.example.com
    */
    public $server;

	 public $errText;
 
    /*
        port connect to server
		example: 110, 993, 995
    */
    public $port = 110;
 
    /*
        type connect to server
		example: pop3, pop3/ssl, pop3/ssl/novalidate-cert
    */
    public $type = "pop3";
 
    public $count;
 
    public $msg;
 
    /*
        user login connect to server
    */
    private $user;
 
    /*
        user password connect to server
    */
    private $pass;
 
    private $box;
 
    public function __construct() {
			$this->errText='';
        if (!extension_loaded("imap"))
        {
            if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
				{
					 dl('php_imap.dll');
				}
            else
				{
                dl('php_imap.so');
				 }
            if (!extension_loaded("imap"))
				{
					 $this->error("Could not load required extension... Please install extansion.");
				}
        }   
 
    }
 
    public function user( $user, $pass ) {
	    $this->user = $user;
	    $this->pass = $pass;
   }
 
    public function server( $server, $port, $type ) {
	    $this->server = $server;
    	$this->port = $port;
    	$this->type = $type;
    }
 
    public function open() {
    	$this->box = @imap_open("{".$this->server.":".$this->port."/".$this->type."}INBOX", $this->user, $this->pass);
 
    	if($this->box)
		{
    	    return true;
		}
    	if (imap_last_error())
		{
    	    $this->error(imap_last_error());
			return false;
		}
      else
		{
    	    $this->error("Couldn't open stream  ".$this->server.":".$this->port."...");
			return false;
		}
 
    	return true;
    }
 
    public function select($id) {
        $this->msg = $id;
        return imap_headerinfo($this->box, $id);
        }
    public function count() {
        $this->count = imap_num_msg($this->box);
        return $this->count;
        }
 
    public function msg_body() {
        return imap_body($this->box,$this->msg);
        }
 
    public function delete($id) {
        imap_delete($this->box, $id);
        imap_expunge($this->box);
        }
 
    public function error($error) {
        $this->errText=$error;
        return true;
        }
 
    public function close() {
	    return imap_close($this->box);
	}
 
}
?>
Использование скрипта просто до идиотизма:

Код: Выделить всё

<?php
// объект почтового клиента
$box = new xMailClient;
	
// настраиваем
$box->user("login","pass");
$box->server("imap.gmail.com","993","imap/ssl/novalidate-cert");
		
// открываем ящик
if (!$box->open())
{
	echo "<br> Невозможно открыть ящик: ".$box->errText."\n";
	// если ящик невозможно открыть
	unset($box);
	$app->quit	()
}
	unset($box);
?>
Кому интересно,- задавайте вопросы.
Кстати, не забудьте модуль ext php_imap.dll подключить в php.ini, ну или скачать обновлённый php по адресу https://xn--80awbbeioodeq4h3a.xn--p1ai/download/PHP_XHE.RAR.

Добавлено: 05 фев 2009, 06:01
rulfer
можно пример получения тела письма?
ни как не могу разобраться :oops:

Добавлено: 05 фев 2009, 08:34
Karlson
rulfer писал(а):можно пример получения тела письма?
ни как не могу разобраться :oops:
Пожалуйста:

Код: Выделить всё

$box = new xMailClient;
$box->user("login","pass");
$box->server("imap.gmail.com","993","imap/ssl/novalidate-cert");
$box->open();
$cnt=$box->count();
// проверяем каждое
for ($i=1;$i<=$cnt;$i++)
{
	$txt=$box->select($i);
	$txt=$box->msg_body();
	// что- то там делаем
}

Добавлено: 05 фев 2009, 15:22
rulfer
спасибо, разобрался. дополню:

Код: Выделить всё

$count = $box -> count();
for($im=1;$im<=$count;$im++){
    $msgs = $box -> select($im);
	$msgs=$box->msg_body(); 
	// ищем в письме упоминание хоста с которомы работаем
	if(strpos($msgs,$parse_host)){
		// парсим ссылку для активации
		preg_match("#http:\/\/www\.host\.com\/.*#i", $msgs, $matches);
		$url_for_activation = $matches['0'];
		// удаляем письмо
		$box->delete($im);
	}
}

Добавлено: 30 апр 2010, 13:11
willyns
спасибо за полезный скрипт, только вот нужны ли апострофы в ключе массива?

Код: Выделить всё

$url_for_activation = $matches['0']; 

Добавлено: 02 авг 2010, 16:40
willyns
Как с помощью этого класса получить письмо в HTML?

Добавлено: 12 окт 2010, 00:38
tailor
Спасибо за скрипт.
Не подскажите как с каракулями в письмах бороться?

Re:

Добавлено: 02 мар 2012, 00:07
Karlson
tailor писал(а):Спасибо за скрипт.
Не подскажите как с каракулями в письмах бороться?
Просто. Надо преобразовывать кодировку.
iconv забавная функция есть, ещё base64 декодируем.

Re: Пара слов про почту

Добавлено: 02 мар 2012, 02:59
satih
смотрим на текст меила, видим что-то вроде
"Content-Transfer-Encoding: quoted-printable"
используем:
http://php.net/manual/en/function.quote ... decode.php

если видим base64:
http://php.net/manual/en/function.base64-decode.php

Re: Пара слов про почту

Добавлено: 17 янв 2016, 17:35
Pvaska
Помогите, вот такая проблема:
Ссылка активации после preg_match("#http:\/\/www\.host\.com\/.*#i", $msgs, $matches); выводится не полностью.
В результате имеем лишь часть ссылки активации: "http://www.host.com/activation/=" и все.
Остальное где-то "пропадает"