summaryrefslogtreecommitdiff
path: root/src/message/sender.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/message/sender.cpp')
-rw-r--r--src/message/sender.cpp109
1 files changed, 49 insertions, 60 deletions
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;
}