使用 PHP imap 函数的问题
我正在尝试为我们的网站构建一个电子邮件解析器。我最终要做的是遍历带有附件的邮件,并在邮件来自特定电子邮件地址时保存附件。
这只是初步测试,但是,我遇到了问题,请参阅下面的评论。
<?php
echo "Loading..."."<br />\n";
$mailuser="[email protected]";
echo "User=$mailuser"."<br />\n";;
$mailpass="mypassword";
echo "Pass=$mailpass"."<br />\n";
// had to use this because we have SSL on site and regular port 110 didn't work
$mailhost="{localhost:995/pop3/ssl/novalidate-cert}";
echo "Host=$mailhost"."<br />\n";
$mailbox=imap_open($mailhost,$mailuser,$mailpass) or die("<br />\nFAILLED! ".imap_last_error());
$check = imap_check($mailbox);
// last message parsed will be stored in the file msgcounter.dat
$firstmsg = file_get_contents('msgcounter.dat') + 1;
$lastmsg = $firstmsg+$check->Recent; // should be == last msg index + count of latest messages
echo 'First:'.$firstmsg.' - Last:'.$lastmsg."<br>";
$result = imap_fetch_overview($mailbox,"$firstmsg:$lastmsg");
print_r($result);
foreach ($result as $overview) {
echo "#{$overview->msgno} ({$overview->date}) - From: {$overview->from}
{$overview->subject}\n";
}
// the following approach didn't work either, Kept getting warnings about
// Bad message number
//
// Some messages in the sequence HAVE been deleted.
/*
for ($index = $firstmsg-1; $index <= ($lastmsg); $index++ ) {
if (strlen(trim(imap_fetchheader($mailbox, $index))) > 0) {
echo 'in message index loop:'.$index;
}
}
*/
imap_close($mailbox);
echo "completed.". "<br />\n";;
?>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
IMAP 是一个低标准和糟糕实施的污水池。如果你不介意一点脏话(或者,呃,很多),有一个臭名昭著的 Ruby 库开发人员的 IMAP 咆哮,其中包含一些有趣的见解。
您可能应该考虑使用别人的代码来做肮脏的事情工作。
IMAP is a cesspool of poor standards and worse implementations. If you don't mind a little profanity (or, er, a lot), there's an infamous IMAP rant by a Ruby library dev with some interesting insights.
You should probably consider using someone else's code to do the dirty work.
好吧,现在我已经完成了我正在努力做的大部分工作。
我剩下的唯一问题实际上是将邮件移动到另一个“文件夹”。
POP3 邮箱不支持 imap_mail_move,因此我不得不想出一种不同的处理方式。
我遇到的最后一个问题是知道什么消息 FILE 与我刚刚打开的消息对应。我知道我可以使用 std rename() 函数来移动文件,但我发现我可以在 courierimapuiddb 文件中查找 msgnum,并且文件名将在那里。
这是我现在正在使用的代码,除了移动文件之外:
Ok I have a big part of what I'm trying to do working, now.
The only problem I have left is actually moving the message to another "folder".
imap_mail_move is not supported on POP3 mailboxes and si I have had to come up with a different way of doing things.
The last problem I have is knowing what message FILE goes with what message that I have just opened. I know I can use the std rename() function to move the file but I found that I can lookup the msgnum in the courierimapuiddb file and the filename will be there.
Here's the code I now have working, with the exception of the moving of the file:
问题是我没有在这一行中检查 imap 邮箱:
$mailhost="{localhost:995/pop3/ssl/novalidate-cert}";
这是要使用的正确行:
$mailhost="{localhost/imap/ssl/novalidate-cert}";
The problem was that I wasn't checking the imap mailbox in this line:
$mailhost="{localhost:995/pop3/ssl/novalidate-cert}";
This is the correct line to use:
$mailhost="{localhost/imap/ssl/novalidate-cert}";