Как получить электронную почту и вложения из PHP - PullRequest
16 голосов
/ 22 сентября 2008

Я пишу веб-приложение для создания фотогалереи на свадьбу друга, и им нужна фотогалерея, чтобы гости могли отправлять цифровые фотографии, сделанные ими в день.

Оценив все параметры, я решил, что пользователям будет проще всего использовать знакомый интерфейс (свою электронную почту) и просто отправлять фотографии в виде вложений.

Я создал почтовый ящик, но теперь мне нужно подключить и извлечь эти вложения для автоматической обработки для добавления в систему галереи. Но как? Есть ли у вас какие-либо учебные пособия или сборные классы для этого?

Ответы [ 7 ]

10 голосов
/ 22 сентября 2008

Раньше я делал много этого раньше, но я не могу найти код, вот уменьшенная версия, которую я нашел. Это должно поставить вас на правильный путь. Я использовал для запуска этого типа сценария из cronjob. Извините, я не могу найти окончательную версию. ; (

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

Удачи!

6 голосов
/ 22 сентября 2008

Рассматривали ли вы использование Google Веб-альбомов Picasa ? Вы можете настроить адрес электронной почты, чтобы отправлять фотографии и делиться ими в Интернете. Затем вы можете получить RSS-ленту с этими фотографиями, что большинство программистов более знакомы с MTA.

6 голосов
/ 22 сентября 2008

Если вы создаете выделенный почтовый ящик для этой цели, использование механизма фильтрации почти наверняка не то, что вам нужно. Вместо этого вы хотите, чтобы почтовый ящик был каналом для приложения, и чтобы приложение просто считывало сообщение из stdin, анализировало тело и MIME анализировало тело, чтобы получить вложения.

Наличие почтового ящика в качестве канала поддерживается всеми известными мне известными MTA на основе Unix, такими как sendmail, postfix и qmail. Обычно вы определяете его в файле псевдонимов, например:


# синтаксис sendmail или postfix
msgsubmit: "| / usr / bin / php ~ path / to / example.php"

Затем письма к msgsubmit @ направляются в программу php для доставки.

Это имеет то преимущество, что не полагается на IMAP-сервер или любой другой сервер, кроме действующего MTA, и работает нормально, если у вас есть контроль над MTA хоста назначения. Фильтрация - это то, что вам нужно, если вы хотите, чтобы все сообщения в системе проверялись сценарием, что, как мне кажется, не так.

Если вы хотите, чтобы копия хранилась где-то в почтовом ящике (неплохая идея), просто определите псевдоним для перехода по нескольким адресам, например:


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

Или постфиксный виртуальный формат:


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

3 голосов
/ 22 сентября 2008

Какой MTA вы используете? Если вы используете postfix + maildrop, вы можете создать правило фильтрации, которое передает определенные сообщения через скрипт PHP, который затем обрабатывает входящие письма. (Google для maildrop и xfilter).

1 голос
/ 22 сентября 2008

Я думаю, вам нужен анализатор сообщений MIME.

Я использовал этот и раньше, и, кажется, он работает нормально, хотя я не проверял его на действительно больших вложениях (например, 2-3 МБ файлы, которые вы можете получить с цифровых камер).

У вас уже есть система для чтения почтовых ящиков POP3 / IMAP? На том же сайте есть другой класс , который также работает на POP3 (я полагаю, что есть и IMAP) - однако, если вы будете загружать достаточный объем, возможно, вы захотите исследовать несколько C- основанные на решениях, так как я считаю, что один чистый PHP.

0 голосов
/ 07 октября 2012

Majordomo, может быть альтернативой для обработки электронных писем, но есть некоторые ограничения на обработку вложенных файлов.

0 голосов
/ 15 декабря 2008
<?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: я использовал этот код. Надеюсь, что он работает я на shah @ mc-oren.com.anyway, я тоже в процессе обучения. =). спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...