Сделать модуль обработки входящей почты для сайта на Laravel

10 000 руб. за проект
11 сентября 2020, 10:16 • 7 откликов • 57 просмотров
Есть сайт на Laravel. Нужно в нем сделать универсальный модуль/компонент/функцию/задачу (не знаю как правильно назвать) который будет ежеминутно обрабатывать все письма поступающие на заданный почтовый ящик, анализировать эти письма и на базе полученной информации выполнять те или иные действия (функции). Почтовый ящик расположен на другом сервере.
Модуль должен:
  1. Подключаться к заданному в настройках почтовому ящику
  2. Обрабатывать входящие письма
  3. Удалять письма после их обработки
Обработка писем осуществляется исходя из
  • адреса источника письма
  • темы письма
  • содержимого письма
Пример: Завершение задачи
В системе есть пользователь testuser
  • testuser.mail == test[@]mail.ru
  • testuser.company_id == 99
В системе есть задача
  • task.id == 347
  • task.company_id == 99
  • task.is_done == false
Если
  • письмо поступило от test [@] mail.ru и
  • заголовок содержит [taskID:347] и
  • тело письма содержит текст [taskID:347 status:done]
то
  • завершить задачу (task(347).is_done = true)
  • к задаче добавить описание task.result взятое из тела письма
Алгоритм, более подробно:
Каждую минуту проверяем ящик на наличие новых писем. К ящику подключаемся по pop3 или imap, логин/пароль указаны в конфигурационном файле. Если новые письма есть то поочередно их обрабатываем.
Обработка письма:
  1. Проверяем адрес отправителя, ищем его в users.mail, если он там есть - берем у этого пользователя user.company_id и идем дальше
  2. Ищем тип объекта, к которому привязано письмо, для этого парсим Заголовок письма, ищем там [taskID: или например [postID: и т.д. то есть письма могут поступать в отношении разных моделей (tasks, posts, ...), если что-нибудь нашли то идем дальше.
  3. Ищем объект по его id который взяли из Заголовка, сверяем что у этого объекта task.company_id == user.company_id. Если соответствует - идем дальше.
  4. Ищем тип операции, который от нас требуется. Для этого в теле письма ищем что то вроде [taskID:347, если нашли то парсим далее тип операции, в нашем случае это status:done, операция смены статуса объекта. Могут быть и другие операции, например добавление комментария [taskID:347 comment]. Если все успешно (найдена операция в теле письма) то идем дальше
  5. Парсим тело письма вытягивая текст, который находится между "____" и "____" (или между "____" и концом письма), обрабатываем его убрав лишнее, сохраняем в $mail_text.
  6. Выполняем функцию, соответствующую заданному в письме типу операции, в нашем случае что то вроде TaskController::doneTask(['id'=>'327', 'result'=>$mail_text, 'user'=>user.id, 'source'=>'mail'])
Отмечаем письмо в ящике как прочтенное или удаляем его из ящика.

Пример обрабатываемого письма:
От: user[@]mail.ru
Куда: service[@]service.com
Тема: Re: Задача: Тестовая задача [taskID:347]
Тело письма:
[taskID:347 status:done]
____
Все готово
___

Все делать на базе предоставленного приложения. Дадим доступ к VDS/GitHub. В приложении уже есть какие то объекты (posts, products), есть пользователи, разделенные на компании. Т.е. разворачивать приложение с нуля не нужно.
Для отработки и демонстрации модуля создать модель и контроллер tasks с полями id, company_id, name, is_done, result. Наполнить через db:seed, делать CRUD не обязательно. В контроллере сделать функцию TaskController::doneTask.
В рамках приемки будем отправлять письма с адреса пользователя и проверять что у задачи поменялся статус, как описано выше.
Модуль должен быть универсальным чтобы быть в состоянии обрабатывать разные типы поручений (изменение статуса, добавление комментария) в отношении разных видов объектов (моделей).
Отзывы
R50 aa6a9bd5f0a13ca00891c064c4da0df8
Заказчик
Все задачи выполнены. Немного тяжело из за языкового барьера.
3 года назад
R50 070952e73a46f95f06338da6b1b55450
Фрилансер
Отличный заказчик!
3 года назад