Giter Site home page Giter Site logo

imnetcat / cout Goto Github PK

View Code? Open in Web Editor NEW
3.0 3.0 0.0 4.23 MB

Cout lib is a header-only library for SMTP client + example of SMTP client used this lib included

License: MIT License

C++ 99.60% C 0.40%
c-plus-plus cpp cpp17 desktop-windows email esmtp framework mailer openssl single-file smtp smtp-client smtp-mailer

cout's Introduction

Hi there, I'm Danil - aka imnetcat 👋

I'm a student, developer, and open source contributor !

cout's People

Contributors

imnetcat avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

cout's Issues

Добавить ESMPTSA

Добавить полноценный ESMPTSA как единый интерфейс для всех SMTP классов

Return code

удалить RETCODE алиас, заменить его где-надо, использовать throw

compiler - linker flags?

Здравствуйте.

Видимо, я первый, кто начал активно пользоваться Вашим проектом, поэтому у меня есть несколько вопросов.

я не очень опытный в C++, и, возможно, я задаю глупый вопорос.

Нельзя ли куда нибудь в документацию добавить пример команды сборки проекта для какого нибудь компилятора? С указанием нужных библиотек.

Вопрос вызван вот чем. При попытке собрать простой пример с отправкой письма компиляция проходит без проблем, а при линковке возникают многочисленные ошибки вида " undefined reference to 'Protocol::SMTP::MAIL::AddRecipient()'" и т.п. - все на Protocol::SMTP::MAIL

Собираю под Windows 10 x64, пользуюсь компилятором gcc из пакета msys2, команда сборки выглядит так:

g++.exe -std=c++17 -lssl-1_1-x64 -lcrypto-1_1-x64 -LC:/Programs/msys64/mingw64/bin/ -g test_mail.cpp -o test_mail.exe

Посмотрите, возможно, я просто что то не так делаю прии сборке.

Собирал код из ветки master.

Прикреплаю файлы с примером программы (там только пароль заменен на звездочки) и файл с ошибками при сборке.
Файлу с примером программы пришлось приписать расширение .txt - иначе не прикрепляется.

test_mail.cpp.txt
errors.txt

При попытке собрать main.cpp ошибки такие же.

Буду благодарен за любую помощь.

С понедельника пытаюсь научиться отправлять письма из своей программы :-)

Спасибо заранее.

Связаться со мной можно по mail [email protected]

ESMTPSA

Невозможно создать расширенный SMPT с аутентификацией и шифрованием из-за конфликта имён в классах ESMTPA и ESMTPS
Необходимо использовать виртуальные методы

Строковые буферы

Перенести буферы SendBuf & RecvBuf из сокетов в SMTP
Сделать обёртку над буферами

Буферизация

Буферизацию вынести в отдельный класс как обёртку над сокетами

Make

Нужно было бы зависимости (OpenSSL) с помощью CMake оформить

Сделать класс Core

Упаковать конфиги, обработку ошибок, логирование и утилиты в класс Core, сделать доступ ко всем перечисленым классам через Core

Константность методов

В большинстве классов не указана константность их методов это может привести к ошибкам в будующем. Стоит указать константность

using namespace std

Нужно вынести все
using namespace std;
из заголовочных файлов в cpp файлы, для предотвращения конфликтов имён

Монолитность обработки ошибок

Необходимо создать концепцию обработки ошибок при которой ошибки можно было бы разбить на отдельные структуры и использовать абстрактные классы для обработки ошибок, что бы можно было бы переопределять обработчик и легко добавлять и изменять ошибки

Interface

Собрать Mail & Client & Server в единый интерфейс

noexcept

Добавить модификаторы noexcept там где они нужны

Идентификация сервера

Вынести поддерживаемые серверы как пользовательский конфиг, выделить структуру сервера

SMTP

Нужно исправить SMTP в соответствии с спецификацией RFC 5321, RFC 7504

Следование стандарту языка с++17

Необходимо заменить все устаревшие функции, пришедшие из С, на аналогичные им функции из библиотек С++
В частности это касается функций sprintf/sprintf_s, fopen_s, strcat и т.д.
Вместо С-ориентированой работы с файлами через fopen/fclose стоит использовать потоки, вместо выделения памяти вручную стоит использовать конструкторы&деструкторы, вместо "char *" нужно использовать "string", а вместо копирования, и дописывание в конец строки с помощью С-шных функций необходимо использовать потоки stringstream и строки

обёртка namespace

Что бы избежать конфликта имён нужно всё обернуть в свой namespace emeil-client

Декомпозиция всего решения

Что бы исправить многие проблемы и добавить новый функционал сперва необходимо декомпозировать всё решение целиков, так как оно написано одним монолитным кодом

Декомпозировать SMTP

Нужно выделить аутентификацию и шифрование из класса SMTP в отдельные классы

Добавить юнит-тесты

Нужно добавить тесты, с помощью моего небольшого фреймворка для юнит-тестирования
Но что бы это сделать сначала нужно декомпозировать решение #7

Обработка ошибок return VS throw

Ошибки обрабатываются с помощью return'ов, что не желательно для с++17, не является эффективным методом обработки ошибок, мешает работе программы в случае не критических ошибок, делает сложным создание и обработку предупреждений (не критических ошибок)
Необходимо использовать throw и расставить try&catch блоки в необходимых местах

Логирование

Вывод логов и обработку их в целом стоит распределить по уровням, в конфиг вынести некий макрос в котором определять текущий уровень логирования и в соответствии с макросом обрабатывать логи скрывая те что ниже уровня и показывая те что выше
Определить три уровня логирования
Minimal-level - минимальный уровень логирования на случай если Debug-level слишком много логов выводит
Debug-level - предназначен для отладки
Full-level - наиболее подробный рассказ о том что происходит в программе на тот случай если не хватает Debug-level

Поддержка Linux

Для поддержки Linux-based систем нужно выделить класс сокетов и с помощью условных директив препроцессора добавить пережать под UNIX сокеты при компиляции под линукс

fatal error: email-client/email.h: No such file or directory

Здравствуйте.

Спасибо за ваш проект. Очень удобно, что он не тащит за собой монстров типа boost.

Есть небольшая проблема, в how to start указано подключение заголовочного файла, которого нет в проекте.

Спасибо, если сможете это поправить.

Системы проверки кода

Нужно интегрировать репозиторий с Travis и Coveriti, но поскольку они работают на Linux-based виртуальных машинах и только с компилятором gcc, сначала необходимо выполнить #36

Структуры в global-scope

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

Учесть запросы сервера

В случае если известно что серверу необходима авторизация, но логин\пароль не установлены - выбрасывать ошибку до попытки соеденится с сервером

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.