Skip to content
This repository has been archived by the owner on Oct 26, 2021. It is now read-only.
/ smtp_mail Public archive

Реализация почтового сервера (MTA) на спецификации протокола SMTP.

Notifications You must be signed in to change notification settings

sergkukuev/smtp_mail

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Почтовый сервер (SMTP)

Реализация почтового сервера (SMTP-клиент и SMTP-сервер) для курса НИРС "Проектирование вычислительных сетей" 2 курса магистратуры МГТУ им. Баумана.

Стек технологий

  • яп: Си стандарта С99;
  • сборка: GNU make.

Поставленные задачи

  • Сервер должен подерживать команды HELO и EHLO, MAIL, RCPT, DATA, RSET, QUIT, VERIFY протокола SMTP;
  • Серверу следует реализовать только указанные команды. VERIFY должен при этом выдавать всегда ошибку;
  • Отправитель должен поддерживать набор команд, достаточный для отправки почты как минимум одной крупной почтовой публичной службе с веб-интерфейсом;
  • В состав сервера и клиента должен входить Makefile, имеющий цели для следующих задач: сборки системы (default), выполнения тестирования (проверка утечек памяти, стиля, модульное тестирование, тестирование протокола) (test_units, test_memory, test_system, test_style, tests), создание pdf с РПЗ (report);
  • Для разбора параметров командной строки рекомендуется (но не обязательно) использовать autoopts. Файл конфигурации программы не обязателен, но возможен (используйте libconfig). Минимальный список поддерживаемых параметров командной строки / файла конфигурации — ниже.
    • Для программы получения почты: порт, корневой каталог для почты (например, /var/mail, или /home/student/test_mail), корневой каталог для очередей сообщений, пользователь и группа для понижения привелегий, имя файла журнала (лог), сеть (сети), для который разрешен релей почты. сетевой адрес привязки, максимальное число рабочих потоков / процессов (см. задание).
    • Для программы передачи почты: корневой каталог для очередей сообщений, имя файла журнала (лог), общее время на попытки отправить письмо, минимальное время между попытками повтора, максимальное число рабочих потоков / процессов (см. задание).
  • Система должна реализовать журналирование. Допустимо выводить сообщения в stdout, ошибки --- в stderr. Журналирование следует делать как указанно в варианте, для связи (если она требуется) нужно использовать Posix MQ или SysV MQ (последнее добавлено по просьбе маководов, где как минимум год назад не было Posix MQ); Из-за проблемы well-known ports программа должна реализовать понижение привилегий (если указаны соответствующие параметры запуска).
  • В исходных текстах должна быть предусмотрена обработка всех возможных ошибок и корректное освобождение занятых ресурсов в случае ошибок;
  • Программа должна работать с IPv4 и IPv6;
  • Программа должна отслеживать таймауты для разрыва соединения с клиентом;
  • В силу непереносимости вызова sendfile() в этом сезоне его использовать запрещено;
  • Процессы создаются только через fork(). Никакого clone(), он непереносим (а его разрешение дало странный результат в прошлом сезоне);
  • Увеличение размера буфера через realloc() / strndup() вообще плохо, а с малым шагом — особенно;
  • При системном тестировании из скрипта нужно повторять connect() до успеха, а не спать.

Реализация

  • Конкретный формат очереди(ей) сообщений, куда инфомрация записывается SMTP-сервером и откуда считывается SMTP-клиентом должен совпадать;
  • Создание сервера, обеспечивающего локальную доставку и добавление удаленной доставки:
    • Используется вызов select и рабочие процессы;
    • Журналирование в отдельном процессе;
    • Проверять обратную зону днс.
  • Создание клиента, обеспечивающего удаленную доставку и поддерживающего очереди сообщений:
    • Обработка нескольких исходящих соеденений в одном потоке выполнения;
    • На один удаленный MX надо создавать не более одного сокета;
    • Используется вызов pselect и рабочие потоки;
    • Журналирование в отдельном процессе;
    • Пытаться отправлять все сообщения для одного MX за одну сессию.

About

Реализация почтового сервера (MTA) на спецификации протокола SMTP.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published