{"id":21649470,"url":"https://github.com/alexsander-pavlov/emailloaderwebsocket","last_synced_at":"2026-04-13T14:32:09.623Z","repository":{"id":263969812,"uuid":"887716572","full_name":"Alexsander-Pavlov/EmailLoaderWebSocket","owner":"Alexsander-Pavlov","description":"Load your messages from email easy and quick.","archived":false,"fork":false,"pushed_at":"2024-11-13T06:50:53.000Z","size":137,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-21T09:33:06.407Z","etag":null,"topics":["asynchronous","bs4","channels","codec","django","docker","docker-compose","imap4-ssl","jquery","loader","parse","poetry","postgresql","pytest","redis","websocket"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Alexsander-Pavlov.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-13T06:49:06.000Z","updated_at":"2024-11-18T05:43:11.000Z","dependencies_parsed_at":"2024-11-21T09:43:11.487Z","dependency_job_id":null,"html_url":"https://github.com/Alexsander-Pavlov/EmailLoaderWebSocket","commit_stats":null,"previous_names":["alexsander-pavlov/emailloaderwebsocket"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FEmailLoaderWebSocket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FEmailLoaderWebSocket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FEmailLoaderWebSocket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FEmailLoaderWebSocket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Alexsander-Pavlov","download_url":"https://codeload.github.com/Alexsander-Pavlov/EmailLoaderWebSocket/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235540595,"owners_count":19006563,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynchronous","bs4","channels","codec","django","docker","docker-compose","imap4-ssl","jquery","loader","parse","poetry","postgresql","pytest","redis","websocket"],"created_at":"2024-11-25T07:31:10.062Z","updated_at":"2026-04-13T14:32:09.569Z","avatar_url":"https://github.com/Alexsander-Pavlov.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Title\nЭтот проект был написанн для динамической выгрузки Email сообщений из различных почтовых ящиков.\nРеализация на основе WebSocket\n\n# To Do\n## Для выполенения данной задачи были реализованны классы:\n1. AbstractConnection - Абстрактный класс определяющий каркас.\n2. BaseConnection - Общий класс выполняющий базовые потребности, неоходим для паттерна \"стратегия\".\n\n3. GmailConnection - Специализированный класс для подключения Gmail почты.\n4. YandexConnection - Специализированный класс для подключения Yandex почты.\n5. MailConnection - Специализированный класс для подключения Mail почты.\n\nДанные классы так же могут проверять подключение на уровне валидации, тем самым\nпроверяется достоверность почты.\nДля данной проверки нужно указать дополнительный аргумент form который является окружением формы.\n\n```Python\nGmailConnection.connection(\n                    login=address,\n                    password=password,\n                    form=form,\n                )\n```\n\nДля подкючения и получения списка всех писем из ящика:\n```Python\nserver = GmailConnection\nconnection = server(email.address,\n                    email.password,\n                    limit=email.last_index,\n                    )\n```\nВ данном случае важно указать limit, так как это последнее зафиксированное Email сообщение\nкоторое обработала программа.\n\nРеализованны каркасные методы (магические).\n```Python\nlen(connection) # Длина списка писем\nconnection[index] # Получить любое письмо по индексу\nconnection.reverse() # Список в обратном порядке\nfor item in connection: # Итеррация по списку\nwith connection as list_: # Менеджер открывает список писем\n```\n\nДля дальнейшей обработки списка нужен парсер.\nРеализован класс:\n1. Parser.\n2. TextParser.\n3. FileParser.\n\nКласс Parser автоматически вмещает в себе остальные классы для обработки.\nДля работы Parser, ему необходим только экземпляр Соединения IMAP4_SSL, а так же uid (ID сообщения)\n```Python\nparser = Parser(connection.server, uid)\nmessage = parser.parse()\n```\nЭто все что необходимо для выполнения работы Parser.\nParser отдает dict со всеми данными что получилось изьять из сообщения.\n\n# WebSocket\n## Для реализации WebSocket нужно:\n1. Инициализировать экземпляр WebSocket на языке JavaSctipt\n```JavaScript\nconst socket = new WebSocket(\n        'ws://'\n        + window.location.host\n        + '/email/download/'\n        + pk\n        + '/'\n    );\n```\n2. Определить действия для каждого события\n```JavaScript\nsocket.onmessage = function(e) {\n    const data = JSON.parse(e.data);\n};\nsocket.onopen = function(e) {\n    // some move\n};\nsocket.onclose = function(e) {\n    this.close()\n    console.log('Socket closed unexpectedly');\n};\n```\n3. Написать потребителя AsyncWebsocketConsumer\n4. Указать Routing\n5. Изменить точку входа на asgi с помощью ProtocolTypeRouter с указанием websocket\n```Python\napplication = ProtocolTypeRouter(dict(\n    http=django_asgi_app,\n    websocket=AuthMiddlewareStack(\n        URLRouter(\n            mailscaner.routing.websocket_urlpatterns\n        )\n    ),\n))\n```\n# Dependencies\n## Зависимости необходимые проекту:\n1. Django\n2. daphne\n3. channels\n4. channels-redis\n5. redis\n6. psycopg2-binary\n7. python-dotenv\n8. pillow\n9. bs4\n\nВсе зависимости прописаны в pyproject.toml\n\n# Install\n## Для успешной установки следующие инструкции:\nВ проекте присутствует Docker. Если у вас нет Docker вы можете установить его через официальный сайт.\n1. Настройте \".env.sample\" и переменуйте файл в \".env\"\n```shell\nTEST_EMAIL_HOST_GMAIL=email # Тестовая почта\nTEST_EMAIL_PASSWORD_GMAIL=password # Пароль от почты\n\nPOSTGRES_PASSWORD=password # Пароль от базы данных на уровне настройки\nDB_PASSWORD=password # Пароль от базы данных на уровне использования\n```\nДанные строки нужно заполнить\n2. Сделайте билд образов.\n```bash\ndocker compose build\n```\n3. Запустите контейнеры\n```bash\ndocker compose up\n```\n\n# Using\nДля перехода на сайт перейдите по адресу:\nhttp://localhost:8000/\n- Вы попадете на страницу аутентификации.\n- В первую очередь вам нужно зарегистрироваться (Registration).\n- Вводите данные в форму и регистрируете пользователя.\n- Затем аутентифицируетесь.\n- Вы видите 3 объекта Gmail, Yandex, Mail.ru, но для начало вам нужно зарегистрировать почту.\n- Нажимаете Add Email.\n- Вводите Email и Password, система автоматически определит что Email из разшенных и проверит достоверность введенных данных.\n!!! Внимание! Обычные пароли от почты не подходят, вам нужно зайти на ваш почтовый ящик и разрешить IMAP соединения,\nа так же сгенерировать пароль для приложения. Этот пароль вам пригодится для регистрации почты. !!!\n- После регистрации почты переходите на соотвествующий пункт, например Gmail и у вас будет список Эмеилов этой категории.\n- Нажимаете UploadData.\n- Вы попадаете на страницу загрузки - начинается загрузка сообщений.\n- Вы можете вернуться обратно и нажать Show list, где уже будут загруженные сообщения.\n!!! Внимание! При выходе из страницы загрузки - загрузка прекращается, но сохраняется последняя точка. !!!\n- По нажатию на любое из сообщений откроется его полный вид со всеми данными.\n- По наличию вложенных файлов на данной странице возможно их просмотреть.\n\n# Tests\n## В данном проекте всего 2 теста.\n- Для проведения теста удостоверьтесь что вы указали соотвествующие поля в \".env\"\n- Для теста вам нужно зайти в docker контейнер приложения.\n```bash\ndocker ps\n```\n- Найдите контейнер с названием config\n- Выделите его id (Хватит первых 2-3 символов)\n- Запустите контейнер в интерактивном режиме\n```bash\ndocker exec -it id_number bash\n```\n- Вы попадете в внутрь контейнера в оболочке bash (Если ошибка можете попробовать \"bin/bash\")\n- Введите команду.\n```bash\npython manage.py test\n```\n- У вас будут проведенны тесты.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexsander-pavlov%2Femailloaderwebsocket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexsander-pavlov%2Femailloaderwebsocket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexsander-pavlov%2Femailloaderwebsocket/lists"}