Получение почты с сервера POP3 с использованием php - PullRequest
33 голосов
/ 02 июля 2010

Я пытаюсь получить почту из POP3 (я использую почтовый сервер POP3, и я пытаюсь извлечь почтовый контент и сохранить его в таблице базы данных для моего проекта.), Но я не могу найти скрипт PHP дляэто все только для IMAP.

Знаете ли вы, как получать почту с сервера POP3?

Спасибо.

Ответы [ 4 ]

34 голосов
/ 02 июля 2010

Удивительно, но PHP-библиотека imap также может использоваться для работы с почтовыми ящиками POP3. Конечно, большинство расширенных функций IMAP не будут работать (например, папки или извлечение частей сообщений), но реализованы основные функции POP3.

Основным отличием является строка опции, которую вы передаете imap_open - чтобы процитировать эту страницу:

// To connect to a POP3 server on port 110 on the local server, use:
$mbox = imap_open ("{localhost:110/pop3}INBOX", "user_id", "password");

Кроме этого, это честное плавание - вам не нужно больше, чем imap_open, imap_num_msg, imap_body, imap_delete и imap_close для базового доступа по протоколу POP3.

9 голосов
/ 02 июля 2010

Функции PHP IMAP могут работать как с блоками IMAP, так и с POP3.

Эти функции позволяют вам работать с протоколом IMAP, а также с NNTP, POP3 и локальнымметоды доступа к почтовому ящику.

Однако имейте в виду, что некоторые функции IMAP не будут работать правильно с протоколом POP.

есть Пользовательское примечание , в котором содержится интересный фрагмент.Вы можете взглянуть на это.Я ничего не могу сказать о его качестве, но на первый взгляд все выглядит хорошо.


Ниже приведено примечание:

Для всех людей, приходящих сюда молиться за:

1) простой способ чтения MIME-вложений или

2) простой способ доступа к папкам POP3

Не смотрите дальше.

function pop3_login($host,$port,$user,$pass,$folder="INBOX",$ssl=false)
{
    $ssl=($ssl==false)?"/novalidate-cert":"";
    return (imap_open("{"."$host:$port/pop3$ssl"."}$folder",$user,$pass));
}
function pop3_stat($connection)        
{
    $check = imap_mailboxmsginfo($connection);
    return ((array)$check);
}
function pop3_list($connection,$message="")
{
    if ($message)
    {
        $range=$message;
    } else {
        $MC = imap_check($connection);
        $range = "1:".$MC->Nmsgs;
    }
    $response = imap_fetch_overview($connection,$range);
    foreach ($response as $msg) $result[$msg->msgno]=(array)$msg;

    return $result;
}
function pop3_retr($connection,$message)
{
    return(imap_fetchheader($connection,$message,FT_PREFETCHTEXT));
}
function pop3_dele($connection,$message)
{
    return(imap_delete($connection,$message));
}
function mail_parse_headers($headers)
{
    $headers=preg_replace('/\r\n\s+/m', '',$headers);
    preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)?\r\n/m', $headers, $matches);
    foreach ($matches[1] as $key =>$value) $result[$value]=$matches[2][$key];
    return($result);
}
function mail_mime_to_array($imap,$mid,$parse_headers=false)
{
    $mail = imap_fetchstructure($imap,$mid);
    $mail = mail_get_parts($imap,$mid,$mail,0);
    if ($parse_headers) $mail[0]["parsed"]=mail_parse_headers($mail[0]["data"]);
    return($mail);
}
function mail_get_parts($imap,$mid,$part,$prefix)
{    
    $attachments=array();
    $attachments[$prefix]=mail_decode_part($imap,$mid,$part,$prefix);
    if (isset($part->parts)) // multipart
    {
        $prefix = ($prefix == "0")?"":"$prefix.";
        foreach ($part->parts as $number=>$subpart) 
            $attachments=array_merge($attachments, mail_get_parts($imap,$mid,$subpart,$prefix.($number+1)));
    }
    return $attachments;
}
function mail_decode_part($connection,$message_number,$part,$prefix)
{
    $attachment = array();

    if($part->ifdparameters) {
        foreach($part->dparameters as $object) {
            $attachment[strtolower($object->attribute)]=$object->value;
            if(strtolower($object->attribute) == 'filename') {
                $attachment['is_attachment'] = true;
                $attachment['filename'] = $object->value;
            }
        }
    }

    if($part->ifparameters) {
        foreach($part->parameters as $object) {
            $attachment[strtolower($object->attribute)]=$object->value;
            if(strtolower($object->attribute) == 'name') {
                $attachment['is_attachment'] = true;
                $attachment['name'] = $object->value;
            }
        }
    }

    $attachment['data'] = imap_fetchbody($connection, $message_number, $prefix);
    if($part->encoding == 3) { // 3 = BASE64
        $attachment['data'] = base64_decode($attachment['data']);
    }
    elseif($part->encoding == 4) { // 4 = QUOTED-PRINTABLE
        $attachment['data'] = quoted_printable_decode($attachment['data']);
    }
    return($attachment);
}
3 голосов
/ 28 мая 2011

вы можете использовать pop3 почтовый клиентский класс, который может получить доступ к почтовым ящикам по протоколу POP3.Вы получите каждую часть сообщения электронной почты и сможете сохранить ее в базе данных, даже если вы можете извлечь вложенные файлы, не удаляя исходную почту в папке «Входящие».Для получения дополнительной информации перейдите на http://www.phpclasses.org/package/2-PHP-Access-to-e-mail-mailboxes-using-the-POP3-protocol.html

1 голос
/ 02 июля 2010

ЕСЛИ у вас есть сборка PHP с поддержкой IMAP, было бы легко, см. Документацию IMAP (особенно комментарии на этой странице) по адресу http://php.net/manual/en/book.imap.php

ОБНОВЛЕНИЕ: чтобы уточнить мой ответ - как вы видите в комментарияхи справочник по функциям, функции PHP imap_ * можно использовать и для pop3.

...