使用php从POP3服务器获取邮件

时间:2010-07-02 10:46:21

标签: php pop3

我正在尝试从POP3获取邮件(我正在使用POP3邮件服务器,我正在尝试获取邮件内容并存储到我的项目的数据库表中。),但我找不到任何PHP脚本那些,都只适用于IMAP。

您知道如何从POP3服务器获取邮件吗?

感谢。

4 个答案:

答案 0 :(得分:34)

有些令人惊讶的是,PHP's imap library也可以用于处理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访问。

答案 1 :(得分:9)

PHP's IMAP functions可以同时处理IMAP和POP3框。

  

这些功能使您可以使用IMAP协议以及NNTP,POP3和本地邮箱访问方法进行操作。

     

但请注意,某些IMAP功能无法与POP协议一起正常工作。

User Contributed Note提供了一个有趣的片段。你可能想看看它。我不能说它的质量,但从表面看,它看起来还不错。


下面,贡献说明:

  

所有来这里的人都在祈祷:

     

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

答案 2 :(得分:3)

您可以使用pop3电子邮件客户端类,它可以使用POP3协议访问电子邮件邮箱。 您将获得每个电子邮件正文部分并可以将其存储在数据库中,即使您可以检索附加文件而不删除收件箱中的原始邮件。 有关更多信息,请转到http://www.phpclasses.org/package/2-PHP-Access-to-e-mail-mailboxes-using-the-POP3-protocol.html

答案 3 :(得分:1)

如果您使用IMAP支持进行PHP构建,那将很容易,请参阅http://php.net/manual/en/book.imap.php上的IMAP文档(尤其是此页面上的评论)

更新:澄清我的答案 - 正如您在评论和函数参考中所看到的,PHP imap_ *函数也可以用于pop3。