{"id":21649471,"url":"https://github.com/alexsander-pavlov/mailinglistsender","last_synced_at":"2026-04-14T04:02:51.994Z","repository":{"id":263969814,"uuid":"888602981","full_name":"Alexsander-Pavlov/MailingListSender","owner":"Alexsander-Pavlov","description":"Mailing list, send mail your client perfect and easy.","archived":false,"fork":false,"pushed_at":"2024-11-14T17:25:26.000Z","size":1088,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-11-21T09:33:06.475Z","etag":null,"topics":["cache","cache-control","celery","celerybeat","django","docker","docker-compose","mailer","postgresql","rabbitmq","redis"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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-14T17:22:24.000Z","updated_at":"2024-11-18T05:44:47.000Z","dependencies_parsed_at":"2024-11-21T09:43:16.960Z","dependency_job_id":null,"html_url":"https://github.com/Alexsander-Pavlov/MailingListSender","commit_stats":null,"previous_names":["alexsander-pavlov/mailinglistsender"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FMailingListSender","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FMailingListSender/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FMailingListSender/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Alexsander-Pavlov%2FMailingListSender/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Alexsander-Pavlov","download_url":"https://codeload.github.com/Alexsander-Pavlov/MailingListSender/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":235540628,"owners_count":19006570,"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":["cache","cache-control","celery","celerybeat","django","docker","docker-compose","mailer","postgresql","rabbitmq","redis"],"created_at":"2024-11-25T07:31:10.172Z","updated_at":"2026-04-14T04:02:51.933Z","avatar_url":"https://github.com/Alexsander-Pavlov.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Title\nДанный проект выполняет функцию по рассылке сообщений клиентам.\n## View\n### Scheduler\nРеализована своё ядро по обработке данных\nдля задач по рассписанию.\n1. create_task_interval\n2. update_task_interval\n3. delete_task_interval\n\ncreate_task_interval\n```python\n# Создание задачи по рассписанию\n# Описанный ниже  пример в окружении метода\n# form_valid\nform = form.save()\nperiodicity = form.cleaned_data['periodicity']\nstart_time = form.cleaned_data['date_first_send']\nkwargs = {'template_render': 'mail_form/mail_send_form.html'}\ncreate_task_interval(object_=form, # Сущность типа \u003cItem\u003e Model.\n                     task='mail_center.tasks.send', # Ссылка на задачу.\n                     interval=periodicity, # Интервал.\n                     start_time=start_time, # Время начала.\n                     **kwargs, # Доп. Данные. Обычно ссылка на HTML.\n                     )\n```\n\nupdate_task_interval\n```python\n# Обновление задачи по рассписанию\n# Описанный ниже  пример в окружении метода\n# form_valid\nform = form.save()\nperiodicity = form.cleaned_data['periodicity']\nstart_time = form.cleaned_data['date_first_send']\nkwargs = {'template_render': 'mail_form/mail_send_form.html'}\nupdate_task_interval(object_=form, # Сущность типа \u003cItem\u003e Model.\n                     interval=periodicity, # Интервал.\n                     start_time=start_time, # Время начала.\n                     changed_data=form.changed_data, # Измененые данные.\n                     **kwargs, # Доп. Данные. Обычно ссылка на HTML.\n                     )\n```\n\ndelete_task_interval\n```python\n# Удаление задачи по рассписанию\n# Описанный ниже пример в окружении метода\n# form_valid\ndelete_task_interval(object_=self.object)\n```\n\n### Cache\nРеализован ручной Кэш, для этого описанны специализированные\nфункции.\n1. get_or_set_cache\n2. delete_cache\n\nget_or_set_cache\n```python\nfrom .models import SendingMessage\n\n# Получение всего QuerySet\nqueryset = get_or_set_cache(SendingMessage, is_queryset_all=True) # -\u003e QuerySet\n# Получение определенной сущности\nslug = 'some_slug_id_item'\nself.object = get_or_set_cache(model=queryset, slug=slug) # -\u003e \u003cItem\u003e\n# Получение сущности по полю name\nname = 'some_name_item'\nself.object = get_or_set_cache(\n    model=queryset,\n    type_field='name',\n    slug=slug,\n    ) # -\u003e \u003cItem\u003e\n```\n\ndelete_cache\n```python\n# Удаление из Кэша всего QuerySet\ndelete_cache(SendingMessage, is_queryset_all=True)\n# Удаление из Кэша опеределенной сущности\nqueryset = QuerySet(\u003cItem:1\u003e, \u003cItem:2\u003e)\nslug = 'some_slug_id_item'\ndelete_cache(\n    model=queryset,\n    slug=slug,\n    )\n```\n\n### Backend Authentication\nРеализован класс для Backend аутентификации по Email\n1. EmailAuthBackend\n\n```python\n# settings.py\nAUTHENTICATION_BACKENDS = [\n    'users.authentication.EmailAuthBackend',\n]\n```\n\n## RabbitMQ, Celery\nИспользуется Брокер сообщений RabbitMQ и Worker Celery\n### Docker RabbitMQ\n```yaml\nrabbitmq:\n    hostname: rabbitmq\n    image: rabbitmq:4.0.3-management\n    env_file:\n      - .env\n    ports:\n      - 5672:5672\n      - 15672:15672\n    volumes:\n      - rabbitmq-data:/var/lib/rabbitmq\n\nvolumes:\n  rabbitmq-data:\n```\n\n### Настройка RabbitMQ\n```python\n# .env\nRABBITMQ_DEFAULT_USER=guest # Логин RabbitMQ\nRABBITMQ_DEFAULT_PASS=guest # Пароль RabbitMQ\n```\n\n### Docker Celery Worker\n```yaml\ncelery_worker:\n    build: \n      context: .\n      dockerfile: ./docker/django/Dockerfile\n    command: /start-celeryworker\n    volumes:\n      - .:/app\n    env_file:\n      - .env\n```\n\n### Настройка Celery\n```python\nfrom celery import Celery\n\n\nos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')\napp = Celery('mail_center')\napp.config_from_object('django.conf:settings', namespace='CELERY')\napp.autodiscover_tasks()\n```\n\n### Использование\nПосле настройки RabbitMQ и Celery\nВам необходимо запустить проект (инструкции ниже)\nа затем перейти по адрессу:\nhttp://localhost:15672/\nЭто будет страница RabbitMQ для просмотра всех каналов, очередей,\nобмеников, пользователей, и.т.д.\nВам нужно будет ввести логин и пароль для аутентификации который вы указали в .env\n\n## Redis\nRedis NoSQL база данных которая может играть роль как\nброкера сообщений так и базой данных для Cache.\n### Docker Redis\n```yaml\n  redis:\n    image: redis:7.2.5-alpine\n    expose:\n      - 6379\n```\n\n### Настройка\nПредварительная настройка не требуется для\nстандартного объема задач.\n\n\n## Flower\nFlower это мощное приложение для отслеживания всех\nзадач на стороне Worker.\n### Docker Flower\n```yaml\ndashboard:\n    build: \n      context: .\n      dockerfile: ./docker/django/Dockerfile\n    command: /start-flower\n    volumes:\n      - .:/app\n    ports:\n      - 5555:5555\n    env_file:\n      - .env\n```\n\n### Настройка\nПредварительная настройка не требуется, все настройки подтягиваются\nавтоматически из RabbitMQ.\n\n### Использование\nДля использования Flower вам нужно перейти по адрессу:\nhttp://localhost:5555/\nУ вас откроется страница Flower с полной информацией о Worker и Tasks.\n\n## Dependencies\n### Зависимости необхомые проекту:\n1. django\n2. psycopg2-binary\n3. pillow\n4. pytils\n5. redis\n6. hiredis\n7. celery\n8. django-celery-beat\n9. python-crontab\n10. flower\n11. gunicorn\n12. django-phonenumbers\n13. django-phonenumber-field\n14. django-countries\n\n## Install\nДля успешной установки следующие инструкции:\n1. Настройте .env.sample, а затем переменуйте его в .env\n```python\n# .env.sample\nPOSTGRES_PASSWORD=password # Пароль для Базы Данных (настройка)\nDB_PASSWORD=password # Пароль для Базы Данных (использование)\nRABBITMQ_DEFAULT_USER=user # Логин RabbitMQ\nRABBITMQ_DEFAULT_PASS=password # Пароль RabbitMQ\n# Email настройки можете не указывать если \"DEBAG=True\" в settings.py\nHOST_USER=user@yandex.ru # Хост почты для рассылки (Если установлен режим DEBAG=False)\nPASS_USER=password # Пароль от почты для рассыки (Если установлен режим DEBAG=False)\n```\n\n2. Docker\nВ проекте присутствует Docker. Если у вас нет Docker вы можете установить его через официальный сайт.\nОф. сайт: [link](https://www.docker.com)\n\nНеоходимо сделать билд образов и контейнеров\n```bash\ndocker compose build\n```\n\nЗатем запустить образы\n```bash\ndocker compose up\n```\n\n## Using\nИнструкции использования:\n- После запуска в Docker проекта вы можете открывать \nего в вашем Web Браузере http://localhost/\n- Вы попадаете на главную страницу с описанием о сайте и краткой\nинформацией о сайте. Вам доступны только вкладки\n\"Главная страница\", \"Центр рассылок\", \"Блог\", \"Войти\".\n- Вы можете перейти во вкладку \"Блог\" и увидеть все статьи которые есть.\n- Нажмите на кнопку \"Войти\" и попадаете на форму аутентификации.\n- Нажмите на кнопку \"Регистрация\".\n- Введите все обязательные поля. Если все данные верные вам будет отправлено на\nпочту сообщение о подтверждении регистрации.\n!!!ВАЖНО!!!\nЕсли стоит DEBAG=True уведомление о регистрации прийдет в консоль\nот Worker, оно не чем не отличается от обычного за исключением того что оно не отправится\nна реальный Эмеил. \n!!!ВАЖНО!!!\n- Перейдите по полученной ссылке из Эмеила и вы верифицируете вашу почту.\n- Затем вы можете снова нажать на кнопку Войти и ввести данные в форму аутентификации.\n- Вы попадаете на \"Центр рассылок\", пока что рассылок у вас нет.\n- Для создания сообщения для рассылки перейдите на вкладку \"Центр сообщений\".\n- В центре сообщений нажмите на кнопку \"Создать сообщение\".\n- Введите заголовок и содержимое сообщения и нажмите на кнопку \"Создать\".\n- В списке сообщений вы увидете только что созданное вами сообщение,\nвы можете Редактировать (изменять) его или Деактивировать - Активировать.\nПри изменения статуса по центру будет изменяться напись.\n- Теперь нужно добавить клиентов для рассылки. Перейдите на вкладку \"Центр клиентов\".\n- Ваш список клиентов будет пуст, нажмите \"Добавить клиента\".\n- Введите данные клиента и нажмите кнопку \"Создать\".\n- В списке клиентов вы увидете только что созданного клиента. Вы можете Изменить его данные или\nДеактивировать - Активировать его. Исходя из статуса будет меняться надпись на карточке клиента.\n- Теперь можно создать рассылку, перейдите на вкладку \"Центр рассылок\".\n- В Центре рассылок у вас не будет не каких рассылок, нажмите \"Добавить рассылку\".\n- Вас перекинет в \"Центр сообщений\" для выбора сообщения для рассылки.\n- Нажмите на зеленую кнопку \"Начать рассылку\" которая расположена на карточке сообщения.\n- Вы попадаете в форму создания рассылки.\nУ вас отображается \"Выбранное сообщение\" с контекстом сообщения,\n\"Настройки сообщения\" с выбором времени начала рассылки и интервала,\nа так же \"Выбор клиентов\" там где отображается список активных клиентов.\n- Выберете клиентов и настройки для рассылки и нажмите кнопку \"Принять\".\n- Начинается рассылка клиентам.\n!!! ВАЖНО !!!\nЕсли DEBAG=True все сообщения из рассылки будут приходить только в консоль\nот Worker, если вы хотите создать реальную рассылку, вам нужно установить DEBAG=False,\nзаполнить соотвествующие Эмеил поля, если вы их не заполняли и тогда рассыка пойдет на\nреальные Эмеилы.\n!!! ВАЖНО !!!\n- После создания рассылки вы попадаете на страницу текущей созданной рассылки\nсо всеми данными о ней. Так же имеется шкала которая визуализирует сколько\nвремени осталось до следующей итерации отправки сообщения.\nВы можете \"Изменить\" рассылку,\n\"Заморозить\", в этом случае статус рассылки изменится на \"Заморожена\" и рассылка остановится,\n\"Завершить\" - завершает рассылку без возможности ее возобновить, статус будет \"Завершена\".\n- !!! АДМИНИСТРАТОР !!!\n- Если зайти с правами доспута Администратора появляются дополнительные возможности.\n- Открывается новая вкладка \"Для администратора\" с возмоностями\n\"Добавить пользователя\", \"Список пользователей\", \"Панель администратора\".\n- Так же у администратора есть возможность изменять данные любого пользователя,\nа так же удалять рассылки.\n- В панели администратора есть возможность совершить любые действия.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexsander-pavlov%2Fmailinglistsender","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falexsander-pavlov%2Fmailinglistsender","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falexsander-pavlov%2Fmailinglistsender/lists"}