IMAP c PHP часть 2

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

Работа с электронной почтой

Список с метками, как правило, связаны с каждым сообщением: прочитанное, ответил, помеченные, проект и др. Мы можем определить, было ли просмотрено сообщение или нет. Если сообщение не было просмотрено то мы получим значение “U”. Давайте модифицируем код из первой части статьи, чтобы отобразить прочитано/не прочитано.



<?php
$numMessages = imap_num_msg($imap);
for ($i = $numMessages; $i > ($numMessages - 20); $i--) {
    $header = imap_header($imap, $i);

    ...

    $uid = imap_uid($imap, $i);
    $class = ($header->Unseen == "U") ? "unreadMsg" : "readMsg";

    echo "<ul class="' . $class . '">';
    echo "<li><strong>From:</strong>" . $details["fromName"];
    echo " " . $details["fromAddr"] . "</li>";
    echo "<li><strong>Subject:</strong> " . $details["subject"] . "</li>";
    echo '<li><a href=
http://pixelcom.crimea.ua/"mail.php?folder=' . $folder . '&uid=' . $uid . '&func=read">Прочитано</a>';
    echo " | ";
    echo '<a href=
http://pixelcom.crimea.ua/"mail.php?folder=' . $folder . '&uid=' . $uid . '&func=delete">Удалить</a></li>';
    echo "</ul>";
}


Мы можем проверить статус  Unseen и присваивать различные классы CSS для разметки, которые помогут узнать нам прочитано или не прочитано письмо не открывая его заново.



.unreadMsg {
    color: #000;
    font-weight: bold;
}

.readMsg {
    color: #999;
}


Мы также можем создать специальные метки, для электронной почты. Например, предположим, что мы хотим, пометить сообщение как избранные. Для этого мы используем свойства, которое будут иметь значение «F».



<?php
if ($header->Flagged == "F") {
    $class .= " flaggedMsg";
}


Чтобы установить метки для сообщения, мы используем функцию  impa_setflag_full() .



<?php
$status = imap_setflag_full($imap, $uid, "\\Seen \\Flagged", ST_UID);


Приведенный выше код помечает сообщение как «Read(\Seen)» и отправляет в статус «F». Я всегда предпочитаю использовать UID вместо электронной почты номер последовательности в качестве второго параметра, поэтому я должен задать необязательный четвертый параметр-константа ST_UID . С этой функцией Вы можете предоставить и другие метки, например, Черновики, Удаленные, и т.д.

В примере метки установлены только для одного сообщения, Вы можете предоставлять широкий спектр как «1,10″ в качестве второго параметра для установки меток на несколько сообщений.

Удаление сообщений электронной почты

Функция Imap_delete()  используется для удаления сообщений. Функция только помечает их для удаления, но на самом деле не удаляет. Функция Imap_expunge()  отвечает за фактические удаления отмеченных сообщений.



<?php
imap_delete($imap, $uid, FT_UID);
imap_expunge($imap);


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

Просмотр вложений в письме

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

Существуют различные методы для чтения структуры сообщения и идентификацией вложений. Библиотека, упомянута в первой части статьи,  Получение класса  почты разработана Митул Корадиа, имеет возможности для скачивания. Но в примере Я буду использовать функцию  комментариев  для функции  imap_fetchstructure() , которая возможно, самый простой способ.

Перед тем как посмотреть на код, посмотрите структуру электронной почты с вложениями, возвращаемой  imap_fetchstructure()  .



stdClass Object
(
  [type] => 1
  [encoding] => 0
  [ifsubtype] => 1
  [subtype] => MIXED
  [ifdescription] => 0
  [ifid] => 0
  [ifdisposition] => 0
  [ifdparameters] => 0
  [ifparameters] => 1
  [parameters] => Array
    (
      [0] => stdClass Object
        (
            [attribute] => BOUNDARY
            [value] => bcaec54b516462cef304c7e9d5c3
        )
    )
  [parts] => Array
    (
      [0] => stdClass Object
        (
          [type] => 1
          [encoding] => 0
          [ifsubtype] => 1
          [subtype] => ALTERNATIVE
          [ifdescription] => 0
          [ifid] => 0
          [ifdisposition] => 0
          [ifdparameters] => 0
          [ifparameters] => 1
          [parameters] => Array
            (
              [0] => stdClass Object
                (
                  [attribute] => BOUNDARY
                  [value] => bcaec54b516462ceeb04c7e9d5c1
                )
            )
          [parts] => Array
            (
              [0] => stdClass Object
                (
                  [type] => 0
                  [encoding] => 0
                  [ifsubtype] => 1
                  [subtype] => PLAIN
                  [ifdescription] => 0
                  [ifid] => 0
                  [lines] => 1
                  [bytes] => 2
                  [ifdisposition] => 0
                  [ifdparameters] => 0
                  [ifparameters] => 1
                  [parameters] => Array
                    (
                      [0] => stdClass Object
                        (
                          [attribute] => CHARSET
                          [value] => ISO-8859-1
                        )
                    )
                )
              [1] => stdClass Object
                (
                  [type] => 0
                  [encoding] => 0
                  [ifsubtype] => 1
                  [subtype] => HTML
                  [ifdescription] => 0
                  [ifid] => 0
                  [lines] => 1
                  [bytes] => 6
                  [ifdisposition] => 0
                  [ifdparameters] => 0
                  [ifparameters] => 1
                  [parameters] => Array
                    (
                      [0] => stdClass Object
                        (
                          [attribute] => CHARSET
                          [value] => ISO-8859-1
                        )
                    )
                )
            )
        )
      [1] => stdClass Object
        (
          [type] => 3
          [encoding] => 3
          [ifsubtype] => 1
          [subtype] => ZIP
          [ifdescription] => 0
          [ifid] => 0
          [bytes] => 115464
          [ifdisposition] => 1
          [disposition] => ATTACHMENT
          [ifdparameters] => 1
          [dparameters] => Array
            (
              [0] => stdClass Object
                (
                  [attribute] => FILENAME
                  [value] => weekly-reports.zip
                )
            )
          [ifparameters] => 1
          [parameters] => Array
            (
              [0] => stdClass Object
                (
                  [attribute] => NAME
                  [value] => weekly-reports.zip
                )
            )
        )
    )
)


Если вы внимательно посмотрите на структуру, вы увидите, что вложения разбросаны. Это письмо имеет 1 привязку, но можно сделать несколько вложений и тем самым несколько частей с привязкой. С этим параметром мы можем легко определить вложения:



<?php
$mailStruct = imap_fetchstructure($imap, $i);
$attachments = getAttachments($imap, $i, $mailStruct, "");


Внутри функция viewMailbox() . Сначала мы получаем структуру каждого письма с помощью функции imap_fetchstructure() . Это будет возвращать объект, как показано ранее. Затем мы вызываем функцию getAttachments() , которая определит вложенные части.



<?php
function getAttachments($imap, $mailNum, $part, $partNum) {
    $attachments = array()</code>;

    if (isset($part->parts)) {
        foreach ($part->parts as $key => $subpart) {
            if($partNum != "") {
                $newPartNum = $partNum . "." . ($key + 1);
            }
            else {
                $newPartNum = ($key+1);
            }
            $result = getAttachments($imap, $mailNum, $subpart,
                $newPartNum);
            if (count($result) != 0) {
                 array_push($attachments, $result);
             }
        }
    }
    else if (isset($part->disposition)) {
        if ($part->disposition == "ATTACHMENT") {
            $partStruct = imap_bodystruct($imap, $mailNum,
                $partNum);
            $attachmentDetails = array(
                "name"    => $part->dparameters[0]->value,
                "partNum" => $partNum,
                "enc"     => $partStruct->encoding
            );
            return $attachmentDetails;
        }
    }

    return $attachments;
}


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

Если частей больше нет, мы проверяем, был ли доступен параметр и его значение является “ATTACHMENT” “ВЛОЖЕНИЕ”. В таких ситуациях мы получаем структуру данной части с помощью  imap_bodystruct() . Оба  imap_bodystruct()  и  imap_fetchstructure()  обеспечивает такой же результат. Единственная разница между ними в том, что мы можем использовать  imap_bodystruct()  для получения конкретной информации, а не всей структуры.

Теперь у нас есть список частей для данной электронной почты, и мы отобразим ссылки для скачивания вложений:



<?php
echo "Attachments: ";
foreach ($attachments as $attachment) {

echo '<a href=
http://pixelcom.crimea.ua/"mail.php?func=' . $func . '&folder=' . $folder . '&uid=' . $uid .
    '&part=' . $attachment["partNum"] . '&enc=' . $attachment["enc"] . '">' .
    $attachment["name"] . "</a>";
}


Скачать вложения

Чтобы скачать вложение, необходим UID отправителя письма, номер части и тип кодировки вложения. Я включил эти параметры в ссылке, созданной выше. После нажатия на ссылку, может быть вызвана следующая функция:



<?php
function downloadAttachment($imap, $uid, $partNum, $encoding, $path) {
    $partStruct = imap_bodystruct($imap, imap_msgno($imap, $uid), $partNum);

    $filename = $partStruct->dparameters[0]->value;
    $message = imap_fetchbody($imap, $uid, $partNum, FT_UID);

    switch ($encoding) {
        case 0:
        case 1:
            $message = imap_8bit($message);
            break;
        case 2:
            $message = imap_binary($message);
            break;
        case 3:
            $message = imap_base64($message);
            break;
        case 4:
            $message = quoted_printable_decode($message);
            break;
    }

    header("Content-Description: File Transfer");
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=" . $filename);
    header("Content-Transfer-Encoding: binary");
    header("Expires: 0");
    header("Cache-Control: must-revalidate");
    header("Pragma: public");
    echo $message;
}


Сначала мы должны получить структуру данной части, чтобы определить название вложения, которое делается с  imap_bodystruct() . Вы видите, что используется  imap_msgno() , чтобы получить порядковый номер UID; это потому, что imap_bodystruct() не понимает UID, поэтому мы должны преобразовать UID в порядковый номер.

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

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

Заключение

На этом мы завершаем изучение функции IMAP PHP, теперь у вас достаточно знаний, для сборки простой электронной почты.

Рубрики: PHP , PHP5 , Записи | Метки: , , , , , | Ссылка ↑ www.pixelcom.crimea.ua

Termin

Веб-дизайнер, цифровая графика, разработка веб-приложений, а также SEO, создаю сайты в качестве фрилансера. Основное содержание, статьи и обзоры инновационных веб-технологий и проектов.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *


6 + = 8

Можно использовать следующие HTML -теги и атрибуты: <a href= http://pixelcom.crimea.ua/"" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>