summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorclaiff <claiff@mail.ru>2022-10-19 18:17:14 +0300
committerclaiff <claiff@mail.ru>2022-10-19 18:17:14 +0300
commit235b75103d5fd2e7d0f8027d7b7e3b50a7deed2b (patch)
tree19840073cd01ccee5ed9a3159d8f1db88991f050
parentebd8670701c6adc7bee929bd9911ca335b3223c5 (diff)
downloadobmc-sila-smtp-235b75103d5fd2e7d0f8027d7b7e3b50a7deed2b.tar.xz
refactor
-rw-r--r--CMakeLists.txt2
-rw-r--r--src/management/mail.cpp2
-rw-r--r--src/management/settings.cpp10
-rw-r--r--src/management/settings.hpp3
-rw-r--r--src/message/queue_sender.cpp39
-rw-r--r--src/message/queue_sender.hpp26
-rw-r--r--src/message/sender.cpp109
-rw-r--r--src/message/sender.hpp25
-rw-r--r--src/service/smtp.cpp6
9 files changed, 149 insertions, 73 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b188908..c5f8842 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -108,6 +108,8 @@ set(SRC_FILES
${MESSAGE_DIR}/sender.hpp
${MESSAGE_DIR}/sender.cpp
+ ${MESSAGE_DIR}/queue_sender.hpp
+ ${MESSAGE_DIR}/queue_sender.cpp
${MESSAGE_DIR}/builder/date.hpp
${MESSAGE_DIR}/builder/date.cpp
diff --git a/src/management/mail.cpp b/src/management/mail.cpp
index e3ef9f6..ed539b9 100644
--- a/src/management/mail.cpp
+++ b/src/management/mail.cpp
@@ -14,7 +14,7 @@ namespace smtp::manage
{
}
- Mail::Mail(const Mail &mails)
+ Mail::Mail( Mail const& mails)
{
mMails = mails.mMails;
mFileReader = mails.mFileReader;
diff --git a/src/management/settings.cpp b/src/management/settings.cpp
index 02392e0..8cee4e7 100644
--- a/src/management/settings.cpp
+++ b/src/management/settings.cpp
@@ -9,8 +9,16 @@ namespace smtp::manage
{
}
+ Settings::Settings( smtp::manage::Settings const& settings )
+ : mFileReader( settings.mFileReader )
+ , mSettingsFields( settings.mSettingsFields )
+ {
+ }
+
bool Settings::SetSettings( general::SettingsFields const& settings_fields )
{
+ std::lock_guard<std::mutex> lock{mMutex};
+
auto result = mFileReader.Write( settings_fields );
mSettingsFields = mFileReader.Read();
@@ -19,6 +27,8 @@ namespace smtp::manage
std::string Settings::GetSettings()
{
+ std::lock_guard<std::mutex> lock{mMutex};
+
mSettingsFields = mFileReader.Read();
return converter::StructToString{}.Convert( mSettingsFields );
}
diff --git a/src/management/settings.hpp b/src/management/settings.hpp
index 2dbe1b6..31dbfc6 100644
--- a/src/management/settings.hpp
+++ b/src/management/settings.hpp
@@ -1,6 +1,7 @@
#pragma once
#include <string>
+#include <mutex>
#include "file/settings/settings.hpp"
#include "general/struct.hpp"
@@ -11,6 +12,7 @@ namespace smtp::manage
{
public:
explicit Settings( file::settings::Settings const& file_reader );
+ Settings( smtp::manage::Settings const& settings );
~Settings() = default;
bool SetSettings( general::SettingsFields const& settings_fields );
@@ -26,5 +28,6 @@ namespace smtp::manage
private:
file::settings::Settings mFileReader;
general::SettingsFields mSettingsFields;
+ mutable std::mutex mMutex;
};
}
diff --git a/src/message/queue_sender.cpp b/src/message/queue_sender.cpp
new file mode 100644
index 0000000..8f0172a
--- /dev/null
+++ b/src/message/queue_sender.cpp
@@ -0,0 +1,39 @@
+#include "queue_sender.hpp"
+#include "sender.hpp"
+
+namespace smtp::message
+{
+ QueueSender::QueueSender( manage::Settings const& settings_storage,
+ manage::Mail& mail_to,
+ thread::Queue& message_queue)
+ : mSettingsStorage( settings_storage )
+ , mMailTo( mail_to )
+ , mMessageQueue( message_queue )
+ {
+
+ }
+
+ void QueueSender::SendMessages()
+ {
+ Sender message_sender;
+ while (1)
+ {
+ auto message = mMessageQueue.WaitAndPop();
+ auto mail_from = GetMailfrom();
+ auto mails_to = mMailTo.GetMailToSend();
+ message_sender.Send( mSettingsStorage, mail_from, mails_to, message->subject, message->text );
+ }
+ }
+
+ std::string QueueSender::GetMailfrom() const
+ {
+ return mSettingsStorage.IsNeedAuth() ? mSettingsStorage.GetUserName() :
+ GetDefaultMailfrom();
+ }
+
+ std::string QueueSender::GetDefaultMailfrom() const
+ {
+ return "cp2-5422";
+ }
+
+}
diff --git a/src/message/queue_sender.hpp b/src/message/queue_sender.hpp
new file mode 100644
index 0000000..170ebfc
--- /dev/null
+++ b/src/message/queue_sender.hpp
@@ -0,0 +1,26 @@
+#pragma once
+
+#include "management/settings.hpp"
+#include "management/mail.hpp"
+#include "thread/queue.hpp"
+
+namespace smtp::message
+{
+ class QueueSender
+ {
+ public:
+ QueueSender( manage::Settings const& settings_storage,
+ manage::Mail& mail_to,
+ thread::Queue& message_queue );
+ ~QueueSender() = default;
+
+ void SendMessages();
+ private:
+ std::string GetMailfrom() const;
+ std::string GetDefaultMailfrom() const;
+
+ manage::Settings const& mSettingsStorage;
+ manage::Mail& mMailTo;
+ thread::Queue& mMessageQueue;
+ };
+}
diff --git a/src/message/sender.cpp b/src/message/sender.cpp
index 8b5371a..3431535 100644
--- a/src/message/sender.cpp
+++ b/src/message/sender.cpp
@@ -1,5 +1,4 @@
#include <cstring>
-#include <iostream>
#include "sender.hpp"
#include "builder/date.hpp"
@@ -15,78 +14,65 @@ namespace smtp::message
static std::string mText;
//
- // Constructors/Destructors
- //
- Sender::Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue )
- : mSettingsStorage( settings_storage )
- , mMailTo( mail_to )
- , mMessageQueue( message_queue )
- {
-
- }
-
- //
//Public methods
//
- void Sender::Send()
+ bool Sender::Send( manage::Settings const& settings_storage, std::string const& mail_from,
+ general::MailsSet const& mails_to, std::string const& subject,
+ std::string const& text )
{
static const std::string METHOD_NAME = "Send message";
+ if( mails_to.empty() )
+ {
+ return false;
+ }
+
CURLcode result = CURLE_OK;
curl_slist* recipients = nullptr;
WriteThis upload_ctx{};
auto curl = curl_easy_init();
//TODO сделать инициализацию через регистратор инициализаторов
-
- while(1)
+ if( !InitCurl( curl, upload_ctx, settings_storage, mail_from ))
+ {
+ logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Error to initializate message service" );
+ return false;
+ }
+ FillRecipients( curl, recipients, mails_to);
+ UpdateMailText( mails_to, settings_storage.GetUserName(), subject, text );
+ result = curl_easy_perform( curl );
+ if( result != CURLE_OK )
{
- mMailTo.WaitWhileEmptyMails();
- auto message = mMessageQueue.WaitAndPop();
- if( !InitCurl( curl, upload_ctx, mSettingsStorage.GetUserName() ))
- {
- logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Error to initializate message service" );
- }
- //TODO раздать mail_to другим методам
-
- auto mail_to = mMailTo.GetMailToSend();
- FillRecipients( curl, recipients );
-
- UpdateMailText( mSettingsStorage.GetUserName(), message->subject, message->text );
-
- result = curl_easy_perform( curl );
-
- if( result != CURLE_OK )
- {
- std::string message = "Error to send messge: " + std::string( curl_easy_strerror( result ));
- logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, message );
- }
- upload_ctx.counter = 0;
+ std::string message = "Error to send messge: " + std::string( curl_easy_strerror( result ));
+ logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, message );
+ return false;
}
- //TODO сделать деинициализацию через регистратор деинициализаторов
curl_slist_free_all( recipients );
curl_easy_cleanup( curl );
+ return true;
}
//
//Private methods
//
- bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from )
+ bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx,
+ manage::Settings const& settings_storage,
+ std::string const& mail_from )
{
if( !curl )
{
return false;
}
- if( mSettingsStorage.IsNeedAuth())
+ if( settings_storage.IsNeedAuth())
{
- curl_easy_setopt( curl, CURLOPT_USERNAME, mSettingsStorage.GetUserName().c_str());
- curl_easy_setopt( curl, CURLOPT_PASSWORD, mSettingsStorage.GetPassword().c_str());
+ curl_easy_setopt( curl, CURLOPT_USERNAME, settings_storage.GetUserName().c_str());
+ curl_easy_setopt( curl, CURLOPT_PASSWORD, settings_storage.GetPassword().c_str());
}
- curl_easy_setopt( curl, CURLOPT_URL, GetHostPortData().c_str());
+ curl_easy_setopt( curl, CURLOPT_URL, GetHostPortData( settings_storage ).c_str());
- mSettingsStorage.IsNeedSsl() ? curl_easy_setopt( curl, CURLOPT_USE_SSL, ( long ) CURLUSESSL_ALL ) :
+ settings_storage.IsNeedSsl() ? curl_easy_setopt( curl, CURLOPT_USE_SSL, ( long ) CURLUSESSL_ALL ) :
curl_easy_setopt( curl, CURLOPT_USE_SSL, ( long ) CURLUSESSL_NONE );
curl_easy_setopt( curl, CURLOPT_MAIL_FROM, mail_from.c_str());
@@ -99,36 +85,39 @@ namespace smtp::message
return true;
}
+ void Sender::FillRecipients( CURL* curl, curl_slist* recipients, general::MailsSet const& mails_to )
+ {
+ for( const auto& recipient: mails_to )
+ {
+ recipients = curl_slist_append( recipients, recipient.c_str());
+ }
+
+ curl_easy_setopt( curl, CURLOPT_MAIL_RCPT, recipients );
+ }
+
void
- Sender::UpdateMailText( std::string const& mail_from, std::string const& subject, std::string const& text ) const
+ Sender::UpdateMailText( general::MailsSet const& mails_to,
+ std::string const& mail_from,
+ std::string const& subject,
+ std::string const& text ) const
{
- auto mail_to = mMailTo.GetMailToSend();
auto text_decorator = std::make_shared < builder::Text >( text );
text_decorator->Apply( std::make_shared < builder::Date >())
.Apply( std::make_shared < builder::Subject >( subject ))
- .Apply( std::make_shared < builder::Cc >( mail_to ))
+ .Apply( std::make_shared < builder::Cc >( mails_to ))
.Apply( std::make_shared < builder::From >( mail_from ))
- .Apply( std::make_shared < builder::MailTo >( mail_to ));
+ .Apply( std::make_shared < builder::MailTo >( mails_to ));
mText = text_decorator->Get();
}
- void Sender::FillRecipients( CURL* curl, curl_slist* recipients )
- {
- auto mail_to = mMailTo.GetMailToSend();
- for( const auto& recipient: mail_to )
- {
- recipients = curl_slist_append( recipients, recipient.c_str());
- }
- curl_easy_setopt( curl, CURLOPT_MAIL_RCPT, recipients );
- }
- std::string Sender::GetHostPortData() const
+ std::string Sender::GetHostPortData( manage::Settings const& settings_storage ) const
{
- auto result = "smtp://" + mSettingsStorage.GetHost();
- if( !mSettingsStorage.GetPort().empty())
+ auto result = "smtp://" + settings_storage.GetHost();
+ if( !settings_storage.GetPort().empty())
{
- result += ":" + mSettingsStorage.GetPort();
+ result += ":" + settings_storage.GetPort();
}
return result;
}
diff --git a/src/message/sender.hpp b/src/message/sender.hpp
index 69f9346..10f1e1e 100644
--- a/src/message/sender.hpp
+++ b/src/message/sender.hpp
@@ -19,20 +19,27 @@ namespace smtp::message
class Sender
{
public:
- Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue );
+ Sender() = default;
~Sender() = default;
- void Send();
+ bool Send(manage::Settings const& settings_storage, std::string const& mail_from,
+ general::MailsSet const& mails_to, std::string const& subject,
+ std::string const& text);
private:
- bool InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from );
- void UpdateMailText( std::string const& mail_from, std::string const& subject, std::string const& textt ) const;
- void FillRecipients(CURL* curl, curl_slist* recipients );
- std::string GetHostPortData() const;
+ bool InitCurl( CURL* curl, WriteThis const& upload_ctx,
+ manage::Settings const& settings_storage,
+ std::string const& mail_from );
+ void FillRecipients( CURL* curl, curl_slist* recipients, general::MailsSet const& mails_to );
+ void UpdateMailText( general::MailsSet const& mails_to,
+ std::string const& mail_from,
+ std::string const& subject,
+ std::string const& text ) const;
+ std::string GetHostPortData( manage::Settings const& settings_storage ) const;
static size_t ReadCallBack( void *ptr, size_t size, size_t nmemb, void *userp );
- manage::Settings const& mSettingsStorage;
- manage::Mail& mMailTo;
- thread::Queue& mMessageQueue;
+// manage::Settings const& mSettingsStorage;
+// manage::Mail& mMailTo;
+// thread::Queue& mMessageQueue;
};
}
diff --git a/src/service/smtp.cpp b/src/service/smtp.cpp
index 6c2f1ad..81a3f0d 100644
--- a/src/service/smtp.cpp
+++ b/src/service/smtp.cpp
@@ -1,5 +1,5 @@
#include "smtp.hpp"
-#include "message/sender.hpp"
+#include "message/queue_sender.hpp"
namespace smtp::service
{
@@ -15,8 +15,8 @@ namespace smtp::service
CreateSettingsManagerInterface( connection );
CreateMailManagerInterface( connection );
- message::Sender sender{mSettingsStorage, mMailTo, mMessageQueue};
- std::thread sender_message( &message::Sender::Send, std::move(sender) );
+ message::QueueSender sender{ mSettingsStorage, mMailTo, mMessageQueue };
+ std::thread sender_message( &message::QueueSender::SendMessages, std::move(sender) );
sender_message.detach();
}