2008-09-22 17 views
16

Estoy escribiendo una aplicación de la galería de fotos para la boda de un amigo y quieren una galería de fotos para que los invitados envíen las fotos digitales que toman en el día.Cómo recibir correos electrónicos y sus archivos adjuntos de PHP

Después de evaluar todas las opciones, he decidido que lo más fácil para los usuarios sería dejarles usar una interfaz familiar (su correo electrónico) y simplemente hacer que envíen las imágenes como archivos adjuntos.

He creado un buzón, pero ahora necesito conectar y recuperar estos archivos adjuntos para un procesamiento automatizado para agregar al sistema de la galería. ¿Pero cómo? ¿Hay algún tutorial o clase prefabricada que haya visto para hacer esto?

Respuesta

3

¿Qué MTA estás usando? Si usa postfix + maildrop, puede crear una regla de filtrado que canalice ciertos mensajes a través de un script PHP que luego maneja los correos entrantes. (google para maildrop y xfilter).

+0

Sí postfix-routing parece una buena solución desde donde estoy sentado. ¡Gracias! – Oli

+0

Esto es mucho más elegante, pero mi servidor no parece ser compatible. Parece que está integrado con hosts que usan cPanel (Quizás es el momento de buscar otro host) – Shanimal

1

Creo que quiere un analizador de mensajes MIME.

He usado this one antes y parece funcionar bien, aunque no lo he probado en archivos realmente grandes (es decir, archivos de 2-3MB que puede obtener de cámaras digitales).

¿Ya tiene un sistema para leer los buzones POP3/IMAP? Hay another class en el mismo sitio que también funciona en POP3 (creo que también hay un IMAP). Sin embargo, si va a descargar un volumen justo, quizás desee investigar algunas soluciones basadas en C, ya que creo que uno es puro PHP

10

Solía ​​hacer mucho de esto antes, pero no puedo encontrar el código, aquí hay una versión reducida que encontré. Debería ponerte en el camino correcto. Solía ​​ejecutar este tipo de script desde un cronjob. Lo siento, no puedo encontrar la versión final. ; (

// Open pop mailbox 
if (!$mbox = imap_open ("{localhost:110/pop3/notls}INBOX", "user", "tester")) { 
    die ('Cannot connect/check pop mail! Exiting'); 
} 

if ($hdr = imap_check($mbox)) { 
    $msgCount = $hdr->Nmsgs; 
} else { 
    echo "Failed to get mail"; 
    exit; 
} 

$MN=$msgCount; 
$overview=imap_fetch_overview($mbox,"1:$MN",0); 

for ($X = 1; $X <= $MN; $X++) { 

    $file = imap_fetchbody($mbox, $X, 1); 

    imap_delete($mbox, $X); 
} 

imap_expunge($mbox); 
imap_close($mbox); 

Buena suerte

+1

Si controlan el MTA receptor, creo que es más elegante enviar el MTA al programa, en lugar de a un servidor IMAP, porque es simplemente menos puntos de falla. Eso no siempre es una opción, concedo. –

6

Si está creando un buzón dedicado para este propósito, el uso de un mecanismo de filtrado es casi definitivamente no es lo que quiere su lugar, usted quiere tener el buzón sea una!. canalizar a la aplicación, y hacer que la aplicación simplemente lea el mensaje de stdin, analizar el cuerpo y MIME analizar el cuerpo para obtener los archivos adjuntos.

Tener un buzón de correo es compatible con todas las Unix populares. basado en MTA que conozco, como sendmail, postfix y qmail. Generalmente lo define en su archivo de alias, como lo siguiente:


# sintaxis sendmail o postfix
msgsubmit: "|/Usr/bin/php ~ ruta/a/ejemplo.php"

Entonces electrónicos a msgsubmit @ son enrutados a un programa php para la entrega.

Esto tiene la ventaja de no depender de un servidor IMAP o cualquier otro servidor más allá del MTA está vivo, y funciona bien siempre y cuando tenga control sobre el MTA del host de destino. Filtrar es lo que desea si desea que todos los mensajes de un sistema sean inspeccionados por el script, que Supongo que no es el caso.

Si desea una copia guardado en un buzón de correo en alguna parte (no es una mala idea) simplemente definir el alias de ir a varias direcciones, así:


msgsubmit: "| /usr/bin/php ~path/to/example.php", msgsubmit-box 

O postfix formato virtual:


msgsubmit 
    "| /usr/bin/php ~path/to/example.php" 
    msgsubmit-box 

6

¿Ha considerado usar Google Picasa Web Albums? Puede configurar una dirección de correo electrónico para enviar fotos y compartirlas en línea. A continuación, puede obtener una fuente RSS de estas fotos, que la mayoría de los programadores están más familiarizados con MTA que .

+0

¡Esta es una buena alternativa! Sin embargo, Google recomienda no compartir su clave secreta, por lo que es posible que desee envolverla con su alias de MTA con una dirección determinada, con algo como esto en su archivo de alias: msgsubmit: [email protected] –

+0

plus uno para ti por pensar fuera de la caja –

+0

Funciona muy bien. Buena idea. Gracias. – evanmcd

-4
<?php 
//make sure that submit button name is 'Submit' 
if(isset($_POST['Submit'])){ 


     $name = $_POST['visitorname']; 
     $email = $_POST['visitoremail']; 
     $message = $_POST['visitormessage']; 


      $to="[email protected]"; 

      $subject="From ".$name; 


      $from = $email; 

      // generate a random string to be used as the boundary marker 
      $mime_boundary="==Multipart_Boundary_x".md5(mt_rand())."x"; 

      // now we'll build the message headers 
      $headers = "From: $from\r\n" . 
      "MIME-Version: 1.0\r\n" . 
      "Content-Type: multipart/mixed;\r\n" . 
      " boundary=\"{$mime_boundary}\""; 

      // next, we'll build the invisible portion of the message body 
      // note that we insert two dashes in front of the MIME boundary 
      // when we use it 
      $message = "This is a multi-part message in MIME format.\n\n" . 
      "--{$mime_boundary}\n" . 
      "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . 
      "Content-Transfer-Encoding: 7bit\n\n" . 
      $message . "\n\n"; 

foreach($_FILES as $userfile) 
      { 
      // store the file information to variables for easier access 
      $tmp_name = $userfile['tmp_name']; 
      $type = $userfile['type']; 
      $name = $userfile['name']; 
      $size = $userfile['size']; 



      // if the upload succeded, the file will exist 
      if (file_exists($tmp_name)) 
      { 

       // check to make sure that it is an uploaded file and not a system file 
       if(is_uploaded_file($tmp_name)) 
       { 

        // open the file for a binary read 
        $file = fopen($tmp_name,'rb'); 

        // read the file content into a variable 
        $data = fread($file,filesize($tmp_name)); 

        // close the file 
        fclose($file); 

        // now we encode it and split it into acceptable length lines 
        $data = chunk_split(base64_encode($data)); 
       } 

       // now we'll insert a boundary to indicate we're starting the attachment 
       // we have to specify the content type, file name, and disposition as 
       // an attachment, then add the file content. 
       // NOTE: we don't set another boundary to indicate that the end of the 
       // file has been reached here. we only want one boundary between each file 
       // we'll add the final one after the loop finishes. 
       $message .= "--{$mime_boundary}\n" . 
        "Content-Type: {$type};\n" . 
        " name=\"{$name}\"\n" . 
        "Content-Disposition: attachment;\n" . 
        " filename=\"{$fileatt_name}\"\n" . 
        "Content-Transfer-Encoding: base64\n\n" . 
       $data . "\n\n"; 
      } 
      } 


$ok = @mail($to, $subject, $message , $headers); 
if ($ok) { 
if (($_FILES["file"]["type"] == "image/gif") 
|| ($_FILES["file"]["type"] == "image/jpeg") 
|| ($_FILES["file"]["type"] == "image/pjpeg") 
&& ($_FILES["file"]["size"] < 20000)) 
    { 
    if ($_FILES["file"]["error"] > 0) 
    { 
    echo "Return Code: " . $_FILES["file"]["error"] . "<br />"; 
    } 
    else 
    { 

if (file_exists("upload/" . $_FILES["file"]["name"])) 
     { 
     echo $_FILES["file"]["name"] . " already exists. "; 
     } 
    else 
     { 
     move_uploaded_file($_FILES["file"]["tmp_name"], 
     "upload/" . $_FILES["file"]["name"]); 

     } 
    } 
    } 
else 
    { 

    } 
echo "<span class='red'>E-mail has been sent successfully from $mail_name to $to</span>"; } 
else{ 
echo "<span class='red'>Failed to send the E-mail from $from to $to</span>"; 
} 
} 
?> 

p/s: He utilizado este code.hope su trabajo y ayudar you.Just copia y paste.make que su nombre de campo de texto es el mismo que en este page.its trabajo para todos los tipos de files.For más preguntas, solo envíeme un correo electrónico a shah @ mc-oren.com.anyway, también estoy en proceso de aprendizaje. =). gracias.

+2

-1: El OP no pregunta cómo enviar correos electrónicos. Él quiere recuperarlos. – Shannon

0

Majordomo, podría ser una alternativa para manejar correos electrónicos, pero existen algunas limitaciones en el manejo de archivos adjuntos.

Cuestiones relacionadas