使用PHP中的IMAP将附件下载到目录中的操作会随机进行 [英] Downloading attachments to directory with IMAP in PHP, randomly works
问题描述
我在网上找到了PHP代码,可以从此处使用IMAP将附件下载到目录中. http://www.nerdydork.com/download-pop3imap-email -attachments-with-php.html
I found PHP code online to download attachments to a directory using IMAP from here. http://www.nerdydork.com/download-pop3imap-email-attachments-with-php.html
我对其进行了稍微的修改
I modified it slightly changing
$structure = imap_fetchstructure($mbox, $jk);
$parts = ($structure->parts);
到
$structure = imap_fetchstructure($mbox, $jk);
$parts = ($structure);
使其正常运行,否则我将收到有关stdClass如何未定义名为$ parts的属性的错误.这样做,我能够下载所有附件.我最近又对其进行了测试,但没有成功.好吧,它没有工作6次,没有工作7次,但是此后一直没有工作.我认为这与我搞砸了部分处理有关,因为count($ parts)会为每条消息始终返回1,因此找不到我认为的任何附件.
to get it to run properly, as otherwise I got an error about how stdClass doesn't define a property called $parts. Doing that, I was able to download all the attachments. I tested it again recently though, and it didn't work. Well, it didn't work 6 times, worked the 7th, and then hasn't worked since. I'm thinking it has something to do with me screwing up the parts handling, since count($parts) keeps returning 1 for each message, so it's not finding any attachments I think.
由于它一口气下载了附件,没有任何问题,所以我有信心解决问题的地方就在这里.在此代码块之前是for循环,它将遍历框中的每个消息,而在循环之后,将仅循环每个imap结构的$ parts.感谢您的任何帮助,您可以提供.我查看了php.net上的imap_fetchstructure页面,但无法弄清楚我在做什么错.
Since it downloaded the attachments at one point with no issues, I feel confident that the area things are getting screwed up is right here. Before this block of code is a for loop that goes through each message in the box, and after it is loop that just goes through $parts for each imap structure. Thanks for any help you can provide. I looked at the imap_fetchstructure page on php.net and can't figure out what I'm doing wrong.
我只是在输入问题后仔细检查了文件夹,然后所有文件都弹出了.我觉得我疯了.在开始键入此代码之前几分钟,我就没有运行过代码,并且触发它需要很长时间对我来说没有任何意义.我的邮箱中有大约800条消息,但是我想起了,因为它在PHP的最后打印了我的声明,所有文件创建工作都已完成.
I just double-checked the folder after typing up my question and it all popped up. I feel like I'm going nuts. I hadn't run the code since a few minutes before I started typing this, and it doesn't make sense to me that it would take this long to trigger. I have some 800 messages in the mailbox, but I figured since it printed my statement at the very end of the PHP that all of the file creation work was done.
推荐答案
这是最终的工作示例
<? include('application.php');
/* connect to gmail */
$hostname = '{imap.gmail.com:993/imap/ssl}INBOX';
$username = 'XX@XX.com';
$password = 'XX';
/* try to connect */
$inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error());
/* grab emails */
$emails = imap_search($inbox, 'FROM "xxx@gmail.com"');
/* if emails are returned, cycle through each... */
if($emails) {
/* begin output var */
$output = '';
/* put the newest emails on top */
rsort($emails);
foreach($emails as $email_number) {
/* get information specific to this email */
$overview = imap_fetch_overview($inbox,$email_number,0);
$message = imap_fetchbody($inbox,$email_number,2);
$structure = imap_fetchstructure($inbox,$email_number);
pre($overview);
$attachments = array();
if(isset($structure->parts) && count($structure->parts)) {
for($i = 0; $i < count($structure->parts); $i++) {
$attachments[$i] = array(
'is_attachment' => false,
'filename' => '',
'name' => '',
'attachment' => '');
if($structure->parts[$i]->ifdparameters) {
foreach($structure->parts[$i]->dparameters as $object) {
if(strtolower($object->attribute) == 'filename') {
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['filename'] = $object->value;
}
}
}
if($structure->parts[$i]->ifparameters) {
foreach($structure->parts[$i]->parameters as $object) {
if(strtolower($object->attribute) == 'name') {
$attachments[$i]['is_attachment'] = true;
$attachments[$i]['name'] = $object->value;
}
}
}
if($attachments[$i]['is_attachment']) {
$attachments[$i]['attachment'] = imap_fetchbody($inbox, $email_number, $i+1);
if($structure->parts[$i]->encoding == 3) { // 3 = BASE64
$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
}
elseif($structure->parts[$i]->encoding == 4) { // 4 = QUOTED-PRINTABLE
$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
}
}
} // for($i = 0; $i < count($structure->parts); $i++)
} // if(isset($structure->parts) && count($structure->parts))
if(count($attachments)!=0){
foreach($attachments as $at){
if($at['is_attachment']==1){
file_put_contents($at['filename'], $at['attachment']);
}
}
}
}
// echo $output;
}
/* close the connection */
imap_close($inbox);
?>
这篇关于使用PHP中的IMAP将附件下载到目录中的操作会随机进行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!