IMAP、POP3 和 NNTP

添加说明

用户贡献说明 3 个说明

Wil Barath
14 年前
对于所有来这里祈祷的人

1) 一种非常容易的方法来读取 MIME 附件,或
2) 一种非常容易的方法来访问 POP3 文件夹

不必再找了。

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

[由 danbrown AT php DOT net 编辑:包含由 "mn26826" 在 09-JUN-2010 修复的错误修复,修复了用户函数 pop3_stat() 中对 $imap 的错误引用,该函数传递给 imap_mailboxmsginfo()。这本来应该用 $connection。]

[由 visualmind AT php DOT net 编辑:包含由 "elias-jobview" 在 17-AUG-2010 修复的错误修复,修复了 pop3_list 函数中的错误,该函数没有:return $result]

[由 danbrown AT php DOT net 编辑:包含由 "chrismeistre" 在 09-SEP-2010 修复的错误修复,修复了 pop3_list() 函数中对 $mbox(应为 $connection)的错误引用。]
opto
12 年前
似乎在新版 PHP 中,即使不使用 ssl,也必须指定 $ssl - 我只有在添加 /notls 后才让 POP3 正常工作(遵循我从某个地方找到的帖子)。
Klaus
dev at bluehead dot com dot br
12 年前
由于我对正则表达式不熟悉,因此我修改了 mail_parse_headers() 函数,以便正确获取报头字符串中的最后一行。

<?php
function mail_parse_headers($headers)
{

$headers=preg_replace('/\r\n\s+/m', '',$headers);
$headers=trim($headers)."\r\n"; /* 下一行中的 preg_match_all 的一个技巧 */
preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)?\r\n/m', $headers, $matches);
foreach (
$matches[1] as $key =>$value) $result[$value]=$matches[2][$key];
return(
$result);
}
?>
To Top