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

Проверка, отправка, получение, подтверждение регистраций и всё что касается почты.
Ответить
Аватара пользователя
Karlson
Сообщения: 31
Зарегистрирован: 27 янв 2009, 16:54

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

Сообщение Karlson » 04 фев 2009, 15:15

Честно говоря, я- человек ленивый, чего и Вам желаю, и мне надоело для каждого почтового сервера писать свой скрипт проверки почты (обычно применяется при необходимости подтверждать регистрацию).
Вот и нашёл небольшой скрипт, который позволяет проверять почту по 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.
Заходи тихо, проси мало, уходи быстро...
ebaymails.com реальные продавцы реальных товаров

rulfer
Сообщения: 7
Зарегистрирован: 05 фев 2009, 05:55

Сообщение rulfer » 05 фев 2009, 06:01

можно пример получения тела письма?
ни как не могу разобраться :oops:

Аватара пользователя
Karlson
Сообщения: 31
Зарегистрирован: 27 янв 2009, 16:54

Сообщение Karlson » 05 фев 2009, 08:34

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();
	// что- то там делаем
}
Заходи тихо, проси мало, уходи быстро...
ebaymails.com реальные продавцы реальных товаров

rulfer
Сообщения: 7
Зарегистрирован: 05 фев 2009, 05:55

Сообщение rulfer » 05 фев 2009, 15:22

спасибо, разобрался. дополню:

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

$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);
	}
}

willyns
Сообщения: 6
Зарегистрирован: 18 май 2009, 10:55

Сообщение willyns » 30 апр 2010, 13:11

спасибо за полезный скрипт, только вот нужны ли апострофы в ключе массива?

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

$url_for_activation = $matches['0']; 

willyns
Сообщения: 6
Зарегистрирован: 18 май 2009, 10:55

Сообщение willyns » 02 авг 2010, 16:40

Как с помощью этого класса получить письмо в HTML?

tailor
Сообщения: 19
Зарегистрирован: 12 окт 2010, 00:35

Сообщение tailor » 12 окт 2010, 00:38

Спасибо за скрипт.
Не подскажите как с каракулями в письмах бороться?

Аватара пользователя
Karlson
Сообщения: 31
Зарегистрирован: 27 янв 2009, 16:54

Re:

Сообщение Karlson » 02 мар 2012, 00:07

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

satih
Сообщения: 269
Зарегистрирован: 31 мар 2010, 23:44

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

Сообщение satih » 02 мар 2012, 02:59

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

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

Pvaska
Сообщения: 1
Зарегистрирован: 17 янв 2016, 17:30

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

Сообщение Pvaska » 17 янв 2016, 17:35

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

Ответить