PHP e-posta ve eklerini almak için nasıl

6 Cevap php

Ben bir arkadaşınızın düğün için bir fotoğraf galerisi webapp yazıyorum ve onlar gün almak dijital fotoğraf göndermek için misafirler için bir fotoğraf galerisi istiyorum.

Kullanıcılar bunları tanıdık bir arayüz (e-posta) kullanmasına izin ve onları sadece ek olarak resim göndermek için olurdu için tüm seçenekleri değerlendirdikten sonra, ben kolay şey karar verdik.

Ben bir posta kutusu oluşturduk ama şimdi galeri sistemine ekleyerek için otomatik işleme için bu ekleri bağlamak ve almak gerekir. Ama nasıl? Bunu yapmak için gördüğüm herhangi Öğreticiler veya prefabrik sınıflar var mı?

6 Cevap

Ne MTA kullanıyorsunuz? Eğer postfix'i kullanmak + maildrop Eğer o zaman, gelen postaları işleyen bir PHP komut dosyası aracılığıyla borular belirli iletileri bir filtreleme kuralı oluşturabilirsiniz. (Maildrop ve xfilter için google).

Ben önce bu bir sürü yapmak için kullanılan, ama kodu bulamıyorum, burada buldum küçültülmüş bir versiyonu. Bu doğru yolda size koymak gerekir. Ben bir cronjob gelen komut dosyası bu tür çalıştırmak için kullanılır. Üzgünüm son sürümünü bulamıyorum. , (

// 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);

İyi şanslar!

Eğer bir filtreleme mekanizmasını kullanarak, bu amaç için özel bir posta kutusu oluşturmak ediyorsanız ne istediğiniz neredeyse kesinlikle değil. Bunun yerine, posta kutusu uygulamaya bir boru olmak var, ve uygulama sadece Stdin'den mesajında ​​okudum, vücudu ayrıştırmak, ve MIME ekleri almak için vücut ayrıştırmak istiyorum.

Bir posta kutusu bir boru olabilir olması sendmail, postfix ve qmail gibi biliyorum, tüm popüler Unix tabanlı MTA'larla tarafından desteklenmektedir. Genellikle size aliases dosyasının içinde tanımlamak, şöyle:


# sendmail or postfix syntax
msgsubmit: "| /usr/bin/php ~path/to/example.php"

Sonra msgsubmit postalar @ teslimat için bir php programı yönlendirilir olsun.

Bu bir IMAP sunucusu veya MTA hayatta olmanın ötesinde başka bir sunucuya güvenmek değil avantajı vardır, ve bu sürece hedef ana MTA üzerinde kontrole sahip olarak çalışıyor. Filtreleme Eğer durum böyle değil ben tahmin ediyorum komut tarafından kontrol edilmesi için bir sistem üzerinde tüm iletileri istedim eğer isterdim şeydir.

Eğer isterseniz, bir kopyasını (kötü bir fikir değil) sadece birden fazla adrese gitmek için takma tanımlamak gibi bir yere kadar bir posta kutusunda muhafaza:


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

Ya da sanal biçimi postfix:


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

Ben bir MIME iletisi ayrıştırıcı istiyorum düşünüyorum.

Ben (dijital kameralar alabilirsiniz yani 2-3MB dosyaları) gerçekten büyük ekleri üzerinde test edilmemiş olmasına rağmen, ben this one daha önce kullandım ve gayet iyi iş gibi görünüyor.

Zaten POP3 / IMAP posta kutuları okumak için bir sistem var mı? Belki adil bir hacmi indirirken olacak ise ancak birkaç C-tabanlı araştırmak isteyeceksiniz - another class de (Ben bir IMAP bir de olduğuna inanıyorum) POP3 çalışır aynı sitede var ben bir saf PHP inanıyorum çözümleri.

Majordomo, e-postalar işlemek için bir alternatif olabilir, ancak dosya eki işleme konusunda bazı sınırlamalar vardır olabilir.

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


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


            $to="youremail@yourdomain.com";

          $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: ben bu çalışmalarını code.hope kullanılan ve you.just kopyasını yardımcı ve textfield adını bu files.for başka soruların her türlü iş page.its olarak aynı olduğundan emin paste.make, sadece şah bana e-posta @ mc-oren.com.anyway, ben de öğrenme sürecinde. =). teşekkürler.