Como obter dados de e-mail brutos com a extensão Iap?

Estou procurando uma maneira de baixar todos os dados de e-mail brutos (incluindo anexo), semelhante ao que você obtém clicando em “Mostrar original” no Gmail.

Atualmente, eu posso obter o header bruto e algumas partes do corpo de correio por este código:

$this->MailBox = imap_open($mailServer, $userName, $password, OP_SILENT); ... $email->RawEmail = imap_fetchbody($this->MailBox, $msgNo, "0"); $email->RawEmail .= "\n".imap_fetchbody($this->MailBox, $msgNo, "1"); 

Também eu sei que mudar o parâmetro 3 de imap_fetchbody pode retornar o anexo codificado. Adivinho, eu preciso de um loop aqui para obter a parte de e-mail bruta por parte, mas qual é a condição para parar o loop?

Existe uma maneira fácil de receber todo o email de uma só vez?

Qualquer ajuda seria apreciada.

Se você quiser buscar tudo, você precisa buscar

  • Os headers imap_fetchheader .
  • Obter o número de corpos que a mensagem possui imap_fetchstructure .
  • Cada mina-encabeçamentos um corpo tem imap_fetchmime .
  • Cada corpo tem imap_fetchbody .

Como mime-mensagem pode ter múltiplos corpos, você precisa processar cada parte após a outra. Para reduzir a carga no servidor, use a opção imap_fetchheader para imap_fetchheader . Algum código de exemplo sobre imap_fetchstructure em outra resposta que mostra manipular a conexão imap e iterar sobre partes de uma mensagem já através do encapsulamento.

Eu encontrei essa questão quando eu estava procurando o mesmo problema. Eu sabia que tinha que ser mais fácil do que a solução por hakre e encontrei a resposta certa na página para imap_fetchbody em uma publicação de 5 anos atrás .

Para obter a mensagem cheia completa, use apenas o seguinte:

 $imap_stream = imap_open($server, $username, $password); $raw_full_email = imap_fetchbody($imap_stream, $msg_num, ""); 

Observe a seqüência vazia como terceiro parâmetro de imap_fetchbody isto significa todas as partes e subpastas do e-mail, incluindo headers e todos os corpos.

A resposta do hakre é excessiva, se você realmente não se importa com a estrutura, então você não precisará imap_fetchstructure .

Para um simples ‘Show Source’, você só precisa de imap_fetchheader e imap_body .

Exemplo:

 $conn = imap_open('{'."$mailServer:$port/pop3}INBOX", $userName, $password, OP_SILENT && OP_READONLY); $msgs = imap_fetch_overview($conn, '1:5'); /** first 5 messages */ foreach ($msgs as $msg) { $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno); print $source; } 

Um erro comum é usar "\n" ou PHP_EOL .

De acordo com RFC RFC821, RFC2060, RFC1939 "\r\n" deve ser usado. Enquanto alguns servidores de email converter esses erros, Cyrus não faz um bom erro.

PHP_EOL é um sistema dependente constante, é "\n" no Linux, "\r" no Mac e "\r\n" no Windows, por exemplo.

Além disso, imap_fetchheader() contém o "\r\n" como esperado. Então, o exemplo correto seria:

  $source = imap_fetchheader($conn, $msg->msgno) . imap_body($conn, $msg->msgno);