por - Cómo obtener correos electrónicos y sus archivos adjuntos de PHP
enviar varios archivos adjuntos php (7)
¿Has considerado utilizar los Álbumes web de Google Picasa ? 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 que los MTA.
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 el día.
Después de evaluar todas las opciones, decidí que lo más fácil para los usuarios sería dejarles usar una interfaz familiar (su correo electrónico) y hacer que envíen las imágenes como archivos adjuntos.
Creé un buzón, pero ahora necesito conectarme y recuperar estos archivos adjuntos para que el procesamiento automático pueda agregarse al sistema de la galería. ¿Pero cómo? ¿Hay algún tutorial o clase prefabricada que haya visto para hacer esto?
Creo que quieres un analizador de mensajes MIME.
He usado este 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 tienes un sistema para leer los buzones POP3 / IMAP? Hay otra clase en el mismo sitio que también funciona en POP3 (creo que también hay una IMAP); sin embargo, si va a descargar un volumen justo, tal vez querrá investigar algunas soluciones basadas en C, ya que creo que uno es puro PHP.
Si está creando un buzón dedicado para este fin, el uso de un mecanismo de filtrado casi definitivamente no es lo que quiere. En su lugar, desea que el buzón sea un conducto para la aplicación, y haga que la aplicación simplemente lea el mensaje de stdin, analice el cuerpo y MIME analice el cuerpo para obtener los archivos adjuntos.
Todos los populares populares MTA basados en Unix que conozco, tales como sendmail, postfix y qmail, admiten el uso de un buzón. Generalmente lo defines en tu archivo de alias, así:
# sintaxis sendmail o postfix
msgsubmit: "| / usr / bin / php ~ ruta / a / ejemplo.php"
Luego se envía a msgsubmit @ get enrutado a un programa de php para su entrega.
Esto tiene la ventaja de no confiar en que un servidor IMAP o cualquier otro servidor más allá del MTA esté activo, y funciona bien siempre que 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 que se guarde una copia en un buzón en algún lugar (no es una mala idea) simplemente defina el alias para ir a varias direcciones, de esta manera:
msgsubmit: "| /usr/bin/php ~path/to/example.php", msgsubmit-box
O formato postal de postfix:
msgsubmit
"| /usr/bin/php ~path/to/example.php"
msgsubmit-box
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!
¿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
).
Majordomo
, podría ser una alternativa para manejar correos electrónicos, pero existen algunas limitaciones en el manejo de archivos adjuntos.
<?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: utilicé este código. Espero que funcione y lo ayude. Simplemente copie y pegue. Asegúrese de que su nombre de campo de texto sea el mismo que en esta página. Funciona para todo tipo de archivos. Para más preguntas, solo envíeme un correo electrónico a shah. @ mc-oren.com.anyway, también estoy en proceso de aprendizaje. =). Gracias.