web-dev-qa-db-fra.com

Récupérer le courrier d'un serveur POP3 à l'aide de php

J'essaie de récupérer un courrier à partir de POP3 (j'utilise le serveur de messagerie POP3 et j'essaie de récupérer le contenu du courrier et de le stocker dans une table de base de données pour mon projet.), Mais je ne trouve aucun PHP script pour cela, tous sont uniquement pour IMAP.

Savez-vous comment récupérer le courrier d'un serveur POP3?

Merci.

34
VinothPHP

De manière assez surprenante, la bibliothèque imap de PHP peut également être utilisée pour travailler avec les boîtes aux lettres POP3. La plupart des fonctionnalités IMAP avancées ne fonctionneront pas, bien sûr (par exemple, les dossiers ou la récupération de parties de message), mais la fonctionnalité POP3 de base est implémentée.

La principale différence est la chaîne d'options que vous passez à imap_open - pour citer cette page:

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

En dehors de cela, la navigation est équitable - vous n'aurez pas besoin de plus que imap_open, imap_num_msg, imap_body, imap_delete et imap_close pour un accès POP3 de base.

34
Piskvor

fonctions IMAP de PHP peut gérer à la fois les boîtes IMAP et POP3.

Ces fonctions vous permettent d'utiliser le protocole IMAP, ainsi que les méthodes d'accès aux boîtes aux lettres NNTP, POP3 et locales.

Soyez averti, cependant, que certaines fonctions IMAP ne fonctionneront pas correctement avec le protocole POP.

il y a Note contributive de l'utilisateur qui fournit un extrait intéressant. Vous voudrez peut-être y jeter un œil. Je ne peux rien dire sur sa qualité mais à première vue, ça a l'air bien.


Ci-dessous, la note contribuée:

Pour toutes les personnes qui viennent ici prier pour:

1) un moyen très simple de lire les pièces jointes MIME, ou

2) un moyen très simple d'accéder aux dossiers POP3

Cherchez pas plus loin.

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);
}
10
Pekka 웃

vous pouvez utiliser la classe du client de messagerie pop3 qui peut accéder aux boîtes aux lettres de messagerie à l'aide du protocole POP3. Vous obtiendrez chaque partie du corps de l'e-mail et pourrez le stocker dans la base de données, même vous pouvez récupérer les fichiers joints sans supprimer le courrier d'origine dans la boîte de réception. Pour en savoir plus, rendez-vous sur http://www.phpclasses.org/package/2-PHP-Access-to-e-mail-mailboxes-using-the-POP3-protocol.html

3
Shrishail

SI vous avez PHP build avec support IMAP, ce serait facile, voir la documentation IMAP (en particulier les commentaires sur cette page) sur http://php.net/manual/en/ book.imap.php

MISE À JOUR: pour clarifier ma réponse - comme vous le voyez dans les commentaires et la référence de la fonction, les fonctions PHP imap_ * peuvent également être utilisées pour pop3.

1