Сделать модуль обработки входящей почты для сайта на Laravel
10 000 руб. за проект
Есть сайт на Laravel. Нужно в нем сделать универсальный модуль/компонент/функцию/задачу (не знаю как правильно назвать) который будет ежеминутно обрабатывать все письма поступающие на заданный почтовый ящик, анализировать эти письма и на базе полученной информации выполнять те или иные действия (функции). Почтовый ящик расположен на другом сервере.
Модуль должен:
В системе есть пользователь testuser
Каждую минуту проверяем ящик на наличие новых писем. К ящику подключаемся по pop3 или imap, логин/пароль указаны в конфигурационном файле. Если новые письма есть то поочередно их обрабатываем.
Обработка письма:
Пример обрабатываемого письма:
От: 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.
В рамках приемки будем отправлять письма с адреса пользователя и проверять что у задачи поменялся статус, как описано выше.
Модуль должен быть универсальным чтобы быть в состоянии обрабатывать разные типы поручений (изменение статуса, добавление комментария) в отношении разных видов объектов (моделей).
Модуль должен:
- Подключаться к заданному в настройках почтовому ящику
- Обрабатывать входящие письма
- Удалять письма после их обработки
- адреса источника письма
- темы письма
- содержимого письма
В системе есть пользователь 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, логин/пароль указаны в конфигурационном файле. Если новые письма есть то поочередно их обрабатываем.
Обработка письма:
- Проверяем адрес отправителя, ищем его в users.mail, если он там есть - берем у этого пользователя user.company_id и идем дальше
- Ищем тип объекта, к которому привязано письмо, для этого парсим Заголовок письма, ищем там [taskID: или например [postID: и т.д. то есть письма могут поступать в отношении разных моделей (tasks, posts, ...), если что-нибудь нашли то идем дальше.
- Ищем объект по его id который взяли из Заголовка, сверяем что у этого объекта task.company_id == user.company_id. Если соответствует - идем дальше.
- Ищем тип операции, который от нас требуется. Для этого в теле письма ищем что то вроде [taskID:347, если нашли то парсим далее тип операции, в нашем случае это status:done, операция смены статуса объекта. Могут быть и другие операции, например добавление комментария [taskID:347 comment]. Если все успешно (найдена операция в теле письма) то идем дальше
- Парсим тело письма вытягивая текст, который находится между "____" и "____" (или между "____" и концом письма), обрабатываем его убрав лишнее, сохраняем в $mail_text.
- Выполняем функцию, соответствующую заданному в письме типу операции, в нашем случае что то вроде 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.
В рамках приемки будем отправлять письма с адреса пользователя и проверять что у задачи поменялся статус, как описано выше.
Модуль должен быть универсальным чтобы быть в состоянии обрабатывать разные типы поручений (изменение статуса, добавление комментария) в отношении разных видов объектов (моделей).
Отзывы
В заказе есть исполнитель
При переводе заказа из архивного в актуальный, текущий исполнитель будет снят с задачи.
Выберите тип сделки
С безопасной сделкой вы всегда сможете вернуть средства, если что-то пойдет не так. С простой сделкой вы самостоятельно договариваетесь с исполнителем об оплате и берете на себя решение конфликтов.