Как получить электронную почту и вложения к ней с PHP

StackOverflow https://stackoverflow.com/questions/114953

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

Раньше я многое из этого делал, но не могу найти код, вот нашел уменьшенную версию.Это должно направить вас на правильный путь.Раньше я запускал скрипты такого типа из 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);

Удачи!

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

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

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


# Синтаксис sendmail или postfix
сообщение отправить:"| /usr/bin/php ~путь/к/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

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

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

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

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

<?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.в любом случае, я тоже в процессе обучения.=).спасибо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top