Что такое код imap_num_msg

Содержание

Что такое код imap_num_msg

imap_num_msg — выдаёт количество сообщений в текущем mailbox’е.

Описание

int imap_num_msg (int imap_stream)

Возвращает количество сообщений в текущем mailbox’е.


Назад Оглавление Вперёд
imap_msgno Вверх imap_num_recent

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

imap_num_msg

imap_num_msg — Gets the number of messages in the current mailbox

Описание

Gets the number of messages in the current mailbox.

Список параметров

Поток IMAP, полученный из imap_open() .

Возвращаемые значения

Return the number of messages in the current mailbox, as an integer.

Смотрите также

  • imap_num_recent() — Gets the number of recent messages in current mailbox
  • imap_status() — Returns status information on a mailbox
НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Протокол IMAP, или о том, как мы данные из писем вытаскивали

Электронная почта – это важнейший инструмент для обмена информацией и если вы её используете для работы, то наверняка сталкивались с ситуацией: на почту приходит письмо, в котором содержатся данные необходимые для обработки скрипом. Говорить мы будем о Яндекс почте – в этой статье я поделюсь с вами, дорогие читатели, опытом как достать письма из ящика, так же мы разберем вариант, когда в письме есть вложенный файл — как его обнаружить и в итоге скачать для дальнейших манипуляций над ним.

Сам я с этой задачей столкнулся достаточно давно, и тогда при наличии малого опыта работы c почтовыми программами Яндекса потратил массу времени и нервов для достижения требуемого результата. Первая моя ошибка заключалась в том, что, как многие веб-разработчики, я начел интенсивно искать похожие примеры в сети, но не воспользовался самой справкой (помощью) Яндекс. Да, там есть полезная информация, хотя её и очень мало, но она достаточно важная для написания такого рода скрипта (об этом будет ниже). На то время требовалось написать скрипт, суть которого сводилось: на Яндекс почту заказчика приходило письмо с прайсом товаров в xls формате раз в сутки, его необходимо было обработать (распарсить и сравнить с данными из БД интернет магазина и, в зависимости от результата, что-то обновить где-то, отключить или включить).

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

  1. Настроим почту для получения доступа через почтовые протоколы;
  2. Наметим саму структуру PHP приложения и определимся с кодировкой файлов;
  3. Познакомимся с почтовым протоколом IMAP и его возможностями;
  4. Подключимся к Яндекс почте через логин и пароль аккаунта и отследим ошибки на этом этапе;
  5. Обработаем шапку письма;
  6. Получим и обработаем тела письма;
  7. Получим и сохраним вложенные файлы;
  8. Визуализируем проделанную работу;
  9. Сделаем выводы.

Тема довольно объёмная, но я постараюсь изложить всё максимально компактно и понятно. Пожалуй, приступим.

Настройка почты

Переходим в свою почту и заходим в настройки, как показано ниже на скриншоте:

Далее в нижнем правом углу находим ссылку «Почтовые программы» и кликаем по ней:

Теперь мы попали в настройки работы почты через протоколы IMAP и POP3:

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

Структура приложения и её кодировка

В этом примере мы не будем придумывать сложную структуру приложения, так как она не нужна, а добавим только то, что необходимо (я работаю в редакторе Sublime Text):

  • tmp – папка в которую будем загружать вложенные файлы из письма, если они есть;
  • .htaccess – настройка серверной части, если у вас сервер apache;
  • functions.php – сюда будем добавлять наши функции;
  • main.css – файл стилей;
  • index.php – точка входа приложения;

Кодировку будем использовать UTF-8 и поэтому сразу заполним файл .htaccess следующими строками:

Протокол IMAP

Возвращаясь к первому пункту видно, что работать с почтой Яндекс можно также и через протокол POP3. Так почему же именно IMAP? Из двух этих протоков IMAP является более новым и альтернативным POP3, следовательно, у него есть ряд преимуществ (их можно изучить, воспользовавшись википедией), но в нашем случае на выбор повлияло только то, что он более новый. Лично я особой разницы не вижу, что использовать под конкретную задачу получения письма. Если по какой либо причине вам потребуется использовать протокол POP3 то все функции, которые применимы к IMAP будут работать и для него.

Подключаемся к Яндекс почте при помощи протокола IMAP

Для того чтобы подключиться к почте нам нужно знать три параметра: логин почты, её пароль и адрес почтового сервера. Если с двумя параметрами проблем нет, то второй можно найти именно в помощи Яндекс. Об этом (возникшей у меня проблеме) я выше и писал в сети масса примеров, где третий параметр указан не правильно и, представьте себе, что уже на стадии подключения возникают ошибки – это, как минимум, неприятно. Я не буду ходить вокруг да около и сразу дам прямую ссылку на страницу Яндекс – настройка почтовых программ . Вот собственно что нам нужно для подключения:

Теперь можно переходить непосредственно к самому коду:

Первым делом дополнительно указываем кодировку UTF-8 при помощи заголовка и отключаем отображение ошибок. Подключаем файл functions.php и указываем настройки, о которых выше была речь. В массиве $mail_filetypes прописываем форматы файлов, которые нам нужны. Так было решено сделать, чтобы отсеять ненужный мусор, и получать конкретные файлы. Соединение с почтой происходит при помощи функции imap_open(), которая при удачном выполнении возвращает IMAP-поток, а при неудачном — false (но если включить отображение ошибок, то это не так). Завершаем работу с потоками при помощи функции imap_close() передав ей индикатор соединения. Между этими двумя функциями идёт обычный условный оператор.

При удачном соединении при помощи imap_num_msg() узнаем число писем на почте и добавляем массив, в который будем помещать все нам необходимые данные из потока. Далее следует цикл, в котором будет обрабатываться каждое письмо по его номеру (нумерация происходит от 1) по отдельности.

Обработка шапки письма

Для получения шапки письма необходимо воспользоваться функцией imap_header(), вторым параметром которой являет номер письма:

На данном этапе мы получим объект, из которого и будем вытягивать нужные нам данные, сохраняя в массив $mails_data. Вот пример одного из писем:

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

Сохраняем в нашем массиве: временную метку, дату получения письма, email получателя и отправителя и переходим к получению темы письма. Для этого нам необходимо вначале добавить три функции в файл functions.php:

Названия говорящие и, я думаю, стоит пояснить только последнюю функцию. Она принимает закодированную строку и при помощи imap_mime_header_decode() декодирует ее, в результате чего возвращается массив объектов, у каждого из которых есть два свойства charset (кодировка) и text (текст темы). Дальше всё просто: в цикле проверяя кодировку, приводим к UTF-8 и склеиваем тему в единый заголовок и возвращаем его.

Теперь вернёмся в файл index.php и вытянем последний параметр:

На этом обработка шапки письма будет завершена.

Работаем с телом письма

Продолжаем постепенно формировать наш массив с обработанными данными письма и теперь для получения тела нам необходимо воспользоваться двумя функциями:

В первой переменной $msg_structure находится структура письма – это объект, в котором можно найти массу полезной информации, пример части этого объекта представлен ниже:

Что важно для решения нашей задачи:

  • type – первичный тип тела письма, в зависимости от того, что к нам приходит на почту он может меняться от 0 до 7 (каждой цифре советует свой вид контента который находиться в теле письма);
  • encoding – кодировка трансфера тела, меняется от 0 до 5 (0 — 7BIT, 1 — 8BIT, 2 – BINARY, 3 — BASE64, 4 — QUOTED-PRINTABLE, 5 — OTHER);
  • parts – массив частей письма, который соответствует структуре объекта уровнем выше.

Немного подробнее рассмотрим свойство parts. Первое, что нужно сказать это то, что в нулевой ячейке этого массива находиться информация, соответствующая именно тексту письма, а начиная с первого – вложенным файлам. Также в каждом объекте указывается type и в parameters кодировка в явном и в не явном виде.

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

Вторая функция imap_fetchbody() извлекает определённую часть письма, чаще всего в закодированном виде.

Теперь добавим переменную, в которую будем сохранять обработанную версию тела письма:

Вернёмся в файл functions.php и напишем рекурсивную функцию:

Функция recursive_search() принимает один параметр – структуру письма, где последовательно проверяет свойства и достает три параметра: encoding, charset, subtype. Точкой выхода из рекурсии является отсутствие свойства parts с нулевой ячейкой. Больше пояснять тут особо нечего, из кода я думаю понятно, что и как происходит.

Добавим ещё одну функцию для переконвертации тела письма, которая нам потребуется в дальнейшем:

Двигаемся дальше и возвращаемся в файл index.php, где пишем следующий код:

После того, как мы получили данные из рекурсии, постепенно проверяем кодировку трансфера и, в зависимости от этого, вызываем функцию structure_encoding() с соответствующими параметрами. В последнем условном операторе учитываем, то, что мы работает в UTF-8 и если после всех манипуляций у нас получится отличное от кодировки, перекодируем.

Осталось подвести черту:

В теле письма может оказаться, как и обычный текст, так и HTML разметка со своими стилями. Кодируем в BASE64, чтобы при визуализации не поехала уже наша верстка.

Вложенные файлы

Вот, плавно подбираемся к концу написания нашего приложения:

Кусок, отвечающий за обработку вложенного файла гораздо меньше, а теперь — почему именно так. Принцип работы с файлом аналогичен работе с телом письма, только этот этап начинаем с наличия его в массиве свойства parts. Не забываем отсеивать ненужные, сверяясь со списком типов. При помощи нехитрой функции file_put_contents() мы сохраняем наш файл к себе на сервер в папку tmp.

Хочу увидеть результат!

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

Вот какого вида примерно должен у вас получиться массив, увы, пришлось скрыть содержание файла по личным причинам. Теперь переходим к нашей HTML разметке:

Стили я не буду тут добавлять, так как они особой роли не играют, в итоге:

А на сервере в папке tmp у вас появится файл.

Заключение

Проделав все этапы из статьи, вы достигните должного результата, но всё не так просто, как может показаться – есть подводные камни, которые необходимо учитывать. При написании скрипта под конкретную задачу необходимо следить за кодировкой на всех этапах, письма могут идти с различных почт, у каждой из которых могут быть свои нюансы. Так же немаловажным будет учитывать, что Яндекс почта и их документация периодический обновляется, поэтому могут появиться различные подпункты для работы с почтовыми программами. На этом у меня всё, надеюсь вам пригодиться данная статья при работе с более низкоуровневым вариантом Яндекс почты.

Linux.yaroslavl.ru

Учебник РНР
Назад Вперёд

imap_num_msg — выдаёт количество сообщений в текущем mailbox’е.

Описание

int imap_num_msg (int imap_stream)

Возвращает количество сообщений в текущем mailbox’е.

Pixel.com

Скрипты и коды для веб-приложений

Место для рекламы

IMAP c PHP часть 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

Termin

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

imap_num_msg возвращаются меньше, чем количество реальных писем в почтовом ящике с поп-протокола

Я пытаюсь обрабатывать отскочил сообщения электронной почты в PHPlist с использованием почты на Gmail, который, как отраженном назад адрес. Когда я попытался обработать отскоки, я получил stucked в подобном сценарии , как указано в этом сообщении — Есть 250 отскоков для обработки .

PHPlist был в состоянии принести только 250 писем со счета моего Gmail. При дальнейшем исследовании кода phplists’ Я наткнулся на эту строку кода, который, кажется, как виновника.

$num = imap_num_msg($link); // получить только количество 250

Пропуская больше деталей. Я написал несколько строк кода , чтобы получить количество почты , используя imap и pop . Поп версия возвращает неправильный подсчет тогда, возвращаемой IMap версия верна

Я на самом деле нужно знать , почему отсчеты различны для той же электронной почты с различными протоколами. Кроме того , вся помощь я нашел в Интернете , связанный с PHPlist обработки ошибок явно прошу использовать INBOX версию. Поэтому я не могу рисковать , используя другую версию для обработки рикошетов.

Gmail имеет не стандартную реализацию POP, который только выставляет 250-300 сообщений в то время, пока вы не загружать и удалять их. Или, если вы используете в последнее время: имя пользователя в качестве имени пользователя, он покажет вам последние 30 дней вместо этого.

В любом случае, если вы хотите иметь полный доступ к вашей учетной записи Gmail необходимо использовать протокол IMAP.

imap_num_msg возвращает меньше количества, чем фактические сообщения электронной почты в папке «Входящие» с поп-протоколом

I am trying to process the bounced emails in phplist using a gmail’s email as the bounce back address. When I tried to process bounces, I got stucked in the similar scenario as mentioned in this Post — There are 250 bounces to process.

Phplist смог получить только 250 писем из моей учетной записи gmail. При дальнейшем изучении кода phplists я столкнулся с этой строкой кода, которая кажется виновной.

$num = imap_num_msg($link); //get only count of 250

Пропуск более подробной информации. Я написал несколько строк кода, чтобы получить почтовый счет, используя imap и pop . Поп-версия возвращает неверный счет, тогда как возвращаемая версией imap верна

imap_num_msg not detect forwarded emails

In php imap_num_msg not count how many mails are in inbox if there are forwarded mails. Also imap_headerinfo not display them. I there a method to do that?

1 Answer 1

If you are having problems reading the headers, perhaps some of your messages are not correctly formatted. That may also explain why other functions, such as imap_num_msgs are not giving the expected answer.

If it is happening with forwarded messages, perhaps whatever is forwarding the messages is trashing the headers in the process. That is much more likely to happen if they are being forwarded by some kind of custom script, than if they are forwarded by a proper mail server.

Not the answer you’re looking for? Browse other questions tagged php email imap or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2020 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0 with attribution required. rev 2020.11.12.35412

Linux.yaroslavl.ru

Учебник РНР
Назад Вперёд

imap_num_msg — выдаёт количество сообщений в текущем mailbox’е.

Описание

int imap_num_msg (int imap_stream)

Возвращает количество сообщений в текущем mailbox’е.

Протокол IMAP, или о том, как мы данные из писем вытаскивали

Электронная почта – это важнейший инструмент для обмена информацией и если вы её используете для работы, то наверняка сталкивались с ситуацией: на почту приходит письмо, в котором содержатся данные необходимые для обработки скрипом. Говорить мы будем о Яндекс почте – в этой статье я поделюсь с вами, дорогие читатели, опытом как достать письма из ящика, так же мы разберем вариант, когда в письме есть вложенный файл — как его обнаружить и в итоге скачать для дальнейших манипуляций над ним.

Сам я с этой задачей столкнулся достаточно давно, и тогда при наличии малого опыта работы c почтовыми программами Яндекса потратил массу времени и нервов для достижения требуемого результата. Первая моя ошибка заключалась в том, что, как многие веб-разработчики, я начел интенсивно искать похожие примеры в сети, но не воспользовался самой справкой (помощью) Яндекс. Да, там есть полезная информация, хотя её и очень мало, но она достаточно важная для написания такого рода скрипта (об этом будет ниже). На то время требовалось написать скрипт, суть которого сводилось: на Яндекс почту заказчика приходило письмо с прайсом товаров в xls формате раз в сутки, его необходимо было обработать (распарсить и сравнить с данными из БД интернет магазина и, в зависимости от результата, что-то обновить где-то, отключить или включить).

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

  1. Настроим почту для получения доступа через почтовые протоколы;
  2. Наметим саму структуру PHP приложения и определимся с кодировкой файлов;
  3. Познакомимся с почтовым протоколом IMAP и его возможностями;
  4. Подключимся к Яндекс почте через логин и пароль аккаунта и отследим ошибки на этом этапе;
  5. Обработаем шапку письма;
  6. Получим и обработаем тела письма;
  7. Получим и сохраним вложенные файлы;
  8. Визуализируем проделанную работу;
  9. Сделаем выводы.

Тема довольно объёмная, но я постараюсь изложить всё максимально компактно и понятно. Пожалуй, приступим.

Настройка почты

Переходим в свою почту и заходим в настройки, как показано ниже на скриншоте:

Далее в нижнем правом углу находим ссылку «Почтовые программы» и кликаем по ней:

Теперь мы попали в настройки работы почты через протоколы IMAP и POP3:

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

Структура приложения и её кодировка

В этом примере мы не будем придумывать сложную структуру приложения, так как она не нужна, а добавим только то, что необходимо (я работаю в редакторе Sublime Text):

  • tmp – папка в которую будем загружать вложенные файлы из письма, если они есть;
  • .htaccess – настройка серверной части, если у вас сервер apache;
  • functions.php – сюда будем добавлять наши функции;
  • main.css – файл стилей;
  • index.php – точка входа приложения;

Кодировку будем использовать UTF-8 и поэтому сразу заполним файл .htaccess следующими строками:

Протокол IMAP

Возвращаясь к первому пункту видно, что работать с почтой Яндекс можно также и через протокол POP3. Так почему же именно IMAP? Из двух этих протоков IMAP является более новым и альтернативным POP3, следовательно, у него есть ряд преимуществ (их можно изучить, воспользовавшись википедией), но в нашем случае на выбор повлияло только то, что он более новый. Лично я особой разницы не вижу, что использовать под конкретную задачу получения письма. Если по какой либо причине вам потребуется использовать протокол POP3 то все функции, которые применимы к IMAP будут работать и для него.

Подключаемся к Яндекс почте при помощи протокола IMAP

Для того чтобы подключиться к почте нам нужно знать три параметра: логин почты, её пароль и адрес почтового сервера. Если с двумя параметрами проблем нет, то второй можно найти именно в помощи Яндекс. Об этом (возникшей у меня проблеме) я выше и писал в сети масса примеров, где третий параметр указан не правильно и, представьте себе, что уже на стадии подключения возникают ошибки – это, как минимум, неприятно. Я не буду ходить вокруг да около и сразу дам прямую ссылку на страницу Яндекс – настройка почтовых программ . Вот собственно что нам нужно для подключения:

Теперь можно переходить непосредственно к самому коду:

Первым делом дополнительно указываем кодировку UTF-8 при помощи заголовка и отключаем отображение ошибок. Подключаем файл functions.php и указываем настройки, о которых выше была речь. В массиве $mail_filetypes прописываем форматы файлов, которые нам нужны. Так было решено сделать, чтобы отсеять ненужный мусор, и получать конкретные файлы. Соединение с почтой происходит при помощи функции imap_open(), которая при удачном выполнении возвращает IMAP-поток, а при неудачном — false (но если включить отображение ошибок, то это не так). Завершаем работу с потоками при помощи функции imap_close() передав ей индикатор соединения. Между этими двумя функциями идёт обычный условный оператор.

При удачном соединении при помощи imap_num_msg() узнаем число писем на почте и добавляем массив, в который будем помещать все нам необходимые данные из потока. Далее следует цикл, в котором будет обрабатываться каждое письмо по его номеру (нумерация происходит от 1) по отдельности.

Обработка шапки письма

Для получения шапки письма необходимо воспользоваться функцией imap_header(), вторым параметром которой являет номер письма:

На данном этапе мы получим объект, из которого и будем вытягивать нужные нам данные, сохраняя в массив $mails_data. Вот пример одного из писем:

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

Сохраняем в нашем массиве: временную метку, дату получения письма, email получателя и отправителя и переходим к получению темы письма. Для этого нам необходимо вначале добавить три функции в файл functions.php:

Названия говорящие и, я думаю, стоит пояснить только последнюю функцию. Она принимает закодированную строку и при помощи imap_mime_header_decode() декодирует ее, в результате чего возвращается массив объектов, у каждого из которых есть два свойства charset (кодировка) и text (текст темы). Дальше всё просто: в цикле проверяя кодировку, приводим к UTF-8 и склеиваем тему в единый заголовок и возвращаем его.

Теперь вернёмся в файл index.php и вытянем последний параметр:

На этом обработка шапки письма будет завершена.

Работаем с телом письма

Продолжаем постепенно формировать наш массив с обработанными данными письма и теперь для получения тела нам необходимо воспользоваться двумя функциями:

В первой переменной $msg_structure находится структура письма – это объект, в котором можно найти массу полезной информации, пример части этого объекта представлен ниже:

Что важно для решения нашей задачи:

  • type – первичный тип тела письма, в зависимости от того, что к нам приходит на почту он может меняться от 0 до 7 (каждой цифре советует свой вид контента который находиться в теле письма);
  • encoding – кодировка трансфера тела, меняется от 0 до 5 (0 — 7BIT, 1 — 8BIT, 2 – BINARY, 3 — BASE64, 4 — QUOTED-PRINTABLE, 5 — OTHER);
  • parts – массив частей письма, который соответствует структуре объекта уровнем выше.

Немного подробнее рассмотрим свойство parts. Первое, что нужно сказать это то, что в нулевой ячейке этого массива находиться информация, соответствующая именно тексту письма, а начиная с первого – вложенным файлам. Также в каждом объекте указывается type и в parameters кодировка в явном и в не явном виде.

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

Вторая функция imap_fetchbody() извлекает определённую часть письма, чаще всего в закодированном виде.

Теперь добавим переменную, в которую будем сохранять обработанную версию тела письма:

Вернёмся в файл functions.php и напишем рекурсивную функцию:

Функция recursive_search() принимает один параметр – структуру письма, где последовательно проверяет свойства и достает три параметра: encoding, charset, subtype. Точкой выхода из рекурсии является отсутствие свойства parts с нулевой ячейкой. Больше пояснять тут особо нечего, из кода я думаю понятно, что и как происходит.

Добавим ещё одну функцию для переконвертации тела письма, которая нам потребуется в дальнейшем:

Двигаемся дальше и возвращаемся в файл index.php, где пишем следующий код:

После того, как мы получили данные из рекурсии, постепенно проверяем кодировку трансфера и, в зависимости от этого, вызываем функцию structure_encoding() с соответствующими параметрами. В последнем условном операторе учитываем, то, что мы работает в UTF-8 и если после всех манипуляций у нас получится отличное от кодировки, перекодируем.

Осталось подвести черту:

В теле письма может оказаться, как и обычный текст, так и HTML разметка со своими стилями. Кодируем в BASE64, чтобы при визуализации не поехала уже наша верстка.

Вложенные файлы

Вот, плавно подбираемся к концу написания нашего приложения:

Кусок, отвечающий за обработку вложенного файла гораздо меньше, а теперь — почему именно так. Принцип работы с файлом аналогичен работе с телом письма, только этот этап начинаем с наличия его в массиве свойства parts. Не забываем отсеивать ненужные, сверяясь со списком типов. При помощи нехитрой функции file_put_contents() мы сохраняем наш файл к себе на сервер в папку tmp.

Хочу увидеть результат!

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

Вот какого вида примерно должен у вас получиться массив, увы, пришлось скрыть содержание файла по личным причинам. Теперь переходим к нашей HTML разметке:

Стили я не буду тут добавлять, так как они особой роли не играют, в итоге:

А на сервере в папке tmp у вас появится файл.

Заключение

Проделав все этапы из статьи, вы достигните должного результата, но всё не так просто, как может показаться – есть подводные камни, которые необходимо учитывать. При написании скрипта под конкретную задачу необходимо следить за кодировкой на всех этапах, письма могут идти с различных почт, у каждой из которых могут быть свои нюансы. Так же немаловажным будет учитывать, что Яндекс почта и их документация периодический обновляется, поэтому могут появиться различные подпункты для работы с почтовыми программами. На этом у меня всё, надеюсь вам пригодиться данная статья при работе с более низкоуровневым вариантом Яндекс почты.

Илон Маск рекомендует:  Введение в библиотеку stl
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL