IMAP - Script Teste - Funcionando

Script esta funcionando, precisa ter o imap configurado no php.ini.

basta configurar a conexão em $mailBoxes, exemplo:

'label' 	=> 'Meu Email', // Nome para identificação
'ativo'	=> true,  //True = Ativo    False Inativo
'mailbox' 	=> '{mail.provedor.com.br:143/notls}INBOX',  //Dados do provedor de Email
'usuario' 	=> 'email@email.com', // usuario 
'senha' 	=> 'senha'  // Senha

**Crie uma blank, copie e cole o código abaixo, altere uma das conexões como acima e execute… não tem layout, nem é uma classe foi sendo escrito baseado em exemplos e modelos para teste e ser utilizado em um sistema que vai capturar apenas o assunto e o texto do corpo.

para duvidas ou adicionar algo a mais https://www.php.net/manual/en/book.imap.php
espero que ajude

/**
 * 
 * PHP-IMAP
 * Autor : Jair Issa - jissa2@gmail.com
 * Pesquisas e ajuda:
 * Base principal retirada em  https://github.com/thinkholic/php-imap-email-inbox/blob/master/index.php
 * https://www.php.net/manual/en/book.imap.php
 * http://davidwalsh.name/gmail-php-imap/
 * http://www.codediesel.com/php/downloading-gmail-attachments-using-php/
 * get_part peguei no stackoverflow (quando encontrar o link/autor incluo)
 */

# IMAP opções para cada tipo de conexão
/**
 * --POP3--
 * "{localhost:995/pop3/ssl/novalidate-cert}"
 * "{localhost:110/pop3/notls}"
 
 * IMAP puro
 * "{localhost:993/imap/ssl/novalidate-cert}"
 * "{localhost:143/imap/notls}"

 * Gmail com POP3 ou  IMAP
 * "{pop.gmail.com:995/pop3/ssl/novalidate-cert}"
 * "{imap.gmail.com:993/imap/ssl/novalidate-cert}"
 */

//Local para armazenar os anexos recebidos nos email´s 
$CaminhoAnexos = "anexos/";  //(esta comentado para não ser baixado)

//Com IMAP pode configurar varios email´s para recebimento, 
/basta adicionar as configurações e definir em ativo como True ou False

//O INBOX esta como padrão, mas pode-se utilizar outros

$mailBoxes = array(
	array(
		'label' 	=> 'Gmail',
		'ativo'	=> false,
		'mailbox' 	=> '{imap.gmail.com:993/imap/ssl}INBOX',
		'usuario' 	=> 'email@email.com',
		'senha' 	=> 'senha'
	),
	array(
		'label' 	=> 'Email 2',
		'ativo'	=> false,
		'mailbox' 	=> '{mail.provedor.com.br:143/notls}INBOX',
		'usuario' 	=> 'email@email.com',
		'senha' 	=> 'senha'
	),
	array(
		'label' 	=> 'Email 3',
		'ativo'	=> true,
		'mailbox' 	=> '{mail.provedor.com.br:143/notls}INBOX',
		'usuario' 	=> 'email@email.com',
		'senha' 	=> 'senha'
	)
);
   
    	if (!count($mailBoxes)) { 
        	echo "<p><h1>Configuração inválida</h1></p>";
         } else { 
        
        	foreach ($mailBoxes as $curMailBox) {            
            	echo "<h3>".$curMailBox['label']."</h3>";
					if (!$curMailBox['ativo'])
					{
                    	echo '<p><b>>>> INATIVO <<<</b></p>';
					}
                    else
					{ 
						// IMAP Open
						$inbox = @imap_open($curMailBox['mailbox'], $curMailBox['usuario'], $curMailBox['senha']); 
						
						if ( $inbox )
						{
							// recebe somente os ultimos email´s da semana
							// para todos usar imap_search($inbox,'ALL');
							$emails = imap_search($inbox, 'SINCE '. date('d-M-Y',strtotime("-1 week")));
							
							if (!count($emails))
							{
								echo '<p>Nenhum email encontrado.</p>';
							}
							else
							{
								// ordena
								rsort($emails);

								foreach($emails as $email)
								{
									$overview = imap_fetch_overview($inbox,$email,0);
									
									/*echo "<pre>";
									print_r($overview);
									echo "</pre>";*/

/*
 *  imap_fetchbody  
 *  0=> retorna o body da mensagem com o texto que o servidor recebe
 *  1=> retorna somente o conteudo da mensagem em plain-text
 *  2=> retorna o conteudo da mensagem em html
*php.net opções de retorno
*	(empty) - Entire message
*	0 - Message header
*	1 - MULTIPART/ALTERNATIVE
*	1.1 - TEXT/PLAIN
*	1.2 - TEXT/HTML
*	2 - MESSAGE/RFC822 (entire attached message)
*	2.0 - Attached message header
*	2.1 - TEXT/PLAIN
*	2.2 - TEXT/HTML
*	2.3 - file.ext
 */
echo "<hr /><b>Mensagem Texto</b><br>";
$body_1 = ( imap_fetchbody($inbox, $email, 1) );
echo nl2br($body_1);
echo "<hr /><b>FIM Mensagem Texto</b><br>";

//echo "<hr /><b>Mensagem HTML</b><br>";
//Retorna Corpo com codificação
//$body_2 = ( imap_fetchbody($inbox, $email, 2) );
//echo $body_2;
//echo "<br>";

//Retorna Corpo Html Formatado(já decodificado)
$VarRethtml = pegaCorpoEmail($inbox, $email);

//echo "<br>".nl2br($VarRethtml)."<br>";
//echo "<hr /><b>FIM Mensagem HTML</b><br>";

echo "<hr /><b>Cabeçalho</b><br>";
$cabecalho = ( imap_fetchbody($inbox, $email, 0) );
echo nl2br($cabecalho);
echo "<hr /><b>FIM Cabeçalho</b><br>";
echo "<hr />";

																	
									// Anexos
									$structure = imap_fetchstructure($inbox,$email);
									
									/*echo "<pre>";
									print_r($structure);
									echo "</pre>";*/
									
									$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, $i+1);
												
												// 3 = BASE64
												// 4 = QUOTED-PRINTABLE 
												if($structure->parts[$i]->encoding == 3) 
												{ 
													$attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
												}
												
												elseif($structure->parts[$i]->encoding == 4) 
												{ 
													$attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
												}
											}
										}
									}
									

										echo "<br>".$overview[0]->seen?"<font color='gren'>LIDA</font>":"<font color='red'>NÃO LIDA</font>";
										
                                    	echo "<br><b>Assunto :</b>".decodeIMAPTexto($overview[0]->subject);
                                        echo "<br><b>De :</b>".decodeIMAPTexto($overview[0]->from);
                                        echo "<br><b>Data :</b>".$overview[0]->date."</b>";
                                        echo "<hr>";   
										//Recupera Corpo e decodifica
										$VarRethtml = pegaCorpoEmail($inbox, $email);
										echo nl2br($VarRethtml); //decodificada e Formatada
																							// Anexos, recupera e salva no diretorio definido
										/*foreach($attachments as $attachment)
										{
											if($attachment['is_attachment'] == 1)
											{
												$filename = $attachment['name'];
												if(empty($filename)) $filename = $attachment['filename'];
								 
												if(empty($filename)) $filename = time() . ".dat";
								 
												 //Caso tiver mesmo nome salva com prefixo.
												$fp = fopen($CaminhoAnexos.$email . "-" . $filename, "w+");
												fwrite($fp, $attachment['attachment']);
												fclose($fp);
												
												echo '<p><a href="'.$email . "-" . $filename.'">'.$filename.'</a></p>';
											}
								 
										}*/
								}
							}
                            
                            imap_close($inbox); 
						}
						else
						{
							echo "<hr><b><h1>ERRO NA CONEXÃO<br>Retorno : ". imap_last_error()."</h1><hr>";
						}
					}
					
                
         	 }
    
    	 } 


function pegaCorpoEmail($imap,$uid)
{
    $body = get_part($imap, $uid, "TEXT/HTML");
    // se corpo do HTML estiver vazio tenta colocar o texto no corpo
    if ($body == "") {
        $body = get_part($imap, $uid, "TEXT/PLAIN");
    }
    return $body;
}

function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false)
{
    if (!$structure) {
        $structure = imap_fetchstructure($imap, $uid);
    }
    if ($structure) {
        if ($mimetype == get_mime_type($structure)) {
            if (!$partNumber) {
                $partNumber = 1;
            }
            $textoEmail = imap_fetchbody($imap, $uid, $partNumber);
            switch ($structure->encoding) {
				case 0:
                     return imap_8bit ($textoEmail);
				case 1:
                     return imap_8bit ($textoEmail);
                case 2:
                    return imap_binary ($textoEmail);
                case 3:
                    return imap_base64($textoEmail);
                case 4:
                    return imap_qprint($textoEmail);
                default:
                    return $textoEmail;
            }
        }



        // multipart
        if ($structure->type == 1) {
            foreach ($structure->parts as $index => $subStruct) {
                $prefix = "";
                if ($partNumber) {
                    $prefix = $partNumber . ".";
                }
                $data = get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}

function get_mime_type($structure)
{
    $primaryMimetype = ["TEXT", "MULTIPART", "MESSAGE", "APPLICATION", "AUDIO", "IMAGE", "VIDEO", "OTHER"];

    if ($structure->subtype) {
        return $primaryMimetype[(int)$structure->type] . "/" . $structure->subtype;
    }
    return "TEXT/PLAIN";
}

function decodeIMAPTexto( $str )
{
    $op = '';
    $decode_header = imap_mime_header_decode($str);
    
	foreach ($decode_header AS $obj)
	{
        $op .= htmlspecialchars(rtrim($obj->text, "\t"));
	}
    
	return $op;
}
3 Curtidas