2012-04-02 32 views
10

Estoy desarrollando un sitio en el que los usuarios pueden enviar tickets por correo y adjuntar cualquier tipo de archivo a una identificación de correo específica. Necesito agregar el asunto del correo, el contenido y el archivo adjunto a la base de datos. Estoy haciendo esto usando cron. Excepto por los archivos adjuntos, todo funciona perfecto. He visto algunas publicaciones que crean enlaces de descarga. Como estoy usando cron, no puedo hacerlo manualmente.cómo descargar archivos adjuntos a una carpeta específica usando IMAP y php

 $hostname = '{xxxx.net:143/novalidate-cert}INBOX'; 
     $username = '[email protected]'; 
     $password = 'zzzz'; 
     /* try to connect */ 
     $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to : ' . imap_last_error()); 
     $emails = imap_search($inbox,'ALL'); 

       if($emails) { 
      $output = ''; 
      rsort($emails); 
      foreach($emails as $email_number) { 
      $structure = imap_fetchstructure($inbox, $email_number); 
      $name = $structure->parts[1]->dparameters[0]->value; // name of the file 
      $type = $structure->parts[1]->type; //type of the file 
}} 

estoy en condiciones de obtener el tipo y el nombre de los archivos, pero no saben cómo proceder en adelante

Cualquiera favor ayúdame. gracias ...

Respuesta

6

Para guardar los archivos adjuntos como archivos, debe analizar la estructura del mensaje y eliminar todas las partes que son archivos adjuntos (disposición del contenido). Usted debe envolver que en las clases de su propia para que tenga un fácil acceso y se puede manejar los errores más fácilmente a través del tiempo, el análisis de correo electrónico puede ser frágil:

$savedir = __DIR__ . '/imap-dump/'; 

$inbox = new IMAPMailbox($hostname, $username, $password); 
$emails = $inbox->search('ALL'); 
if ($emails) { 
    rsort($emails); 
    foreach ($emails as $email) { 
     foreach ($email->getAttachments() as $attachment) { 
      $savepath = $savedir . $attachment->getFilename(); 
      file_put_contents($savepath, $attachment); 
     } 
    } 
} 

El código de estas clases es más o menos envolviendo el imap_... funciones, pero para las clases de archivos adjuntos, también está analizando las estructuras. You find the code on github. Espero que esto sea útil.

+0

muchas gracias ... & + 1.Now está trabajando – Juice

+0

Hola @LimiJerin, ¿Serías tan amable de publicar los códigos de trabajo aquí? parece que no funciona desde mi final, no se está descargando ningún archivo adjunto –

5

Aunque podría funcionar el uso de PHP + Cron y un servidor de correo estándar, la cantidad de trabajo necesario para manejar todos los casos extremos, informes de errores, etc. puede no valer la pena el tiempo. Aunque no lo he usado, Postmark Inbound parece un servicio increíble (pago) que eliminará la mayor parte del dolor de cabeza de procesar el correo electrónico a través de la API api de imap.

Si desea tratar de manejar todo a través de PHP, es posible que desee comprobar this resource.

+0

Nunca subestimes la carga de integrar e informar errores de eliminación de servicios. Especialmente los casos extremos. – hakre

+0

Es cierto: ambos lados definitivamente tienen que ser pesados. Si el procesamiento del correo electrónico no es el núcleo de su proyecto, podría ser mejor escribir el suyo propio, pero si está buscando simplificar la externalización del procesamiento del correo entrante, la lógica podría ser una buena opción. – iloveitaly

0

En caso de que si quiere descargar los archivos adjuntos como zip

$zip = new ZipArchive(); 
$tmp_file = tempnam('.', ''); 
$zip->open($tmp_file, ZipArchive::CREATE); 

$mailbox = $connection->getMailbox('INBOX'); 
foreach ($mailbox->getMessage() as $message) { 
    $attachments = $message->getAttachments(); 
    foreach ($attachments as $attachment) { 
     $zip->addFromString($attachment->getFilename(), $attachment->getDecodedContent()); 
    } 
} 

$zip->close(); 

# send the file to the browser as a download 
header('Content-disposition: attachment; filename=download.zip'); 
header('Content-type: application/zip'); 
readfile($tmp_file); 

This code uses library hosted on GitHub. Espero que esto sea útil.

Cuestiones relacionadas