summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorclaiff <claiff@mail.ru>2022-10-19 14:18:10 +0300
committerclaiff <claiff@mail.ru>2022-10-19 14:18:10 +0300
commit249042f598b3b359ae136ff24b24b1c2bdd60750 (patch)
treebe6bac18a578ec034269bc8e972ab4686fd3950c
parent13db61022bc624885f6dc5b404f9f5f31a30d098 (diff)
downloadobmc-sila-smtp-249042f598b3b359ae136ff24b24b1c2bdd60750.tar.xz
fix date bug
-rw-r--r--src/message/builder/date.cpp4
-rw-r--r--src/message/sender.cpp194
2 files changed, 100 insertions, 98 deletions
diff --git a/src/message/builder/date.cpp b/src/message/builder/date.cpp
index d92b4db..9fdc524 100644
--- a/src/message/builder/date.cpp
+++ b/src/message/builder/date.cpp
@@ -11,9 +11,9 @@ namespace smtp::message::builder
result = mBase->Get();
}
auto current_date = time(0);
- std::string current_date_as_string = ctime(&current_date);
+ auto current_date_as_string = ctime(&current_date);
- result += "Date: " + current_date_as_string + "\r\n";
+ result += "Date: " + std::string(current_date_as_string) + "\r\n";
return result;
}
}
diff --git a/src/message/sender.cpp b/src/message/sender.cpp
index 7df9819..a561392 100644
--- a/src/message/sender.cpp
+++ b/src/message/sender.cpp
@@ -1,4 +1,5 @@
#include <cstring>
+#include <iostream>
#include "sender.hpp"
#include "builder/date.hpp"
@@ -11,35 +12,36 @@
namespace smtp::message
{
- static std::string mText;
+ static std::string mText;
- //
- // Constructors/Destructors
- //
+ //
+ // Constructors/Destructors
+ //
Sender::Sender( manage::Settings const& settings_storage, manage::Mail& mail_to, thread::Queue& message_queue )
- : mSettingsStorage( settings_storage )
- , mMailTo( mail_to )
+ : mSettingsStorage( settings_storage )
+ , mMailTo( mail_to )
, mMessageQueue( message_queue )
- {
+ {
- }
+ }
- //
- //Public methods
- //
+ //
+ //Public methods
+ //
void Sender::Send()
- {
- static const std::string METHOD_NAME = "Send message";
+ {
+ static const std::string METHOD_NAME = "Send message";
- CURLcode result = CURLE_OK;
- curl_slist* recipients = nullptr;
- WriteThis upload_ctx{};
- auto curl = curl_easy_init();
- //TODO сделать инициализацию через регистратор инициализаторов
+ CURLcode result = CURLE_OK;
+ curl_slist* recipients = nullptr;
+ WriteThis upload_ctx{};
+ auto curl = curl_easy_init();
+ //TODO сделать инициализацию через регистратор инициализаторов
while(1)
{
+ mMailTo.WaitWhileEmptyMails();
auto message = mMessageQueue.WaitAndPop();
if( !InitCurl( curl, upload_ctx, mSettingsStorage.GetUserName() ))
{
@@ -47,7 +49,6 @@ namespace smtp::message
}
//TODO раздать mail_to другим методам
- mMailTo.WaitWhileEmptyMails();
auto mail_to = mMailTo.GetMailToSend();
FillRecipients( curl, recipients );
@@ -65,81 +66,82 @@ namespace smtp::message
//TODO сделать деинициализацию через регистратор деинициализаторов
curl_slist_free_all( recipients );
curl_easy_cleanup( curl );
- }
-
- //
- //Private methods
- //
- bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from )
- {
- if( !curl )
- {
- return false;
- }
-
- if( mSettingsStorage.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_URL, GetHostPortData().c_str());
-
- mSettingsStorage.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());
-
- curl_easy_setopt( curl, CURLOPT_READFUNCTION, ReadCallBack );
- curl_easy_setopt( curl, CURLOPT_READDATA, &upload_ctx );
- curl_easy_setopt( curl, CURLOPT_UPLOAD, 1L );
- curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L );
- return true;
- }
-
- void
- Sender::UpdateMailText( 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::Subject >( subject ))
- .Apply( std::make_shared < builder::Cc >( mail_to ))
- .Apply( std::make_shared < builder::From >( mail_from ))
- .Apply( std::make_shared < builder::MailTo >( mail_to ))
- .Apply( std::make_shared < builder::Date >());
- 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
- {
- auto result = "smtp://" + mSettingsStorage.GetHost();
- if( !mSettingsStorage.GetPort().empty())
- {
- result += ":" + mSettingsStorage.GetPort();
- }
- return result;
- }
-
- //TODO Надо убрать этот ужас. Без статики!!!
- size_t Sender::ReadCallBack( void* ptr, size_t size, size_t nmemb, void* userp )
- {
- auto pooh = reinterpret_cast<WriteThis*>( userp );
- if( size * nmemb < 1 || pooh->counter++ > 0 )
- {
- return 0;
- }
- memcpy( ptr, mText.c_str(), mText.size());
- return mText.size();
- }
+ }
+
+ //
+ //Private methods
+ //
+ bool smtp::message::Sender::InitCurl( CURL* curl, WriteThis const& upload_ctx, std::string const& mail_from )
+ {
+ if( !curl )
+ {
+ return false;
+ }
+
+ if( mSettingsStorage.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_URL, GetHostPortData().c_str());
+
+ mSettingsStorage.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());
+
+ curl_easy_setopt( curl, CURLOPT_READFUNCTION, ReadCallBack );
+ curl_easy_setopt( curl, CURLOPT_READDATA, &upload_ctx );
+ curl_easy_setopt( curl, CURLOPT_UPLOAD, 1L );
+ curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L );
+ return true;
+ }
+
+ void
+ Sender::UpdateMailText( 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::From >( mail_from ))
+ .Apply( std::make_shared < builder::MailTo >( mail_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
+ {
+ auto result = "smtp://" + mSettingsStorage.GetHost();
+ if( !mSettingsStorage.GetPort().empty())
+ {
+ result += ":" + mSettingsStorage.GetPort();
+ }
+ return result;
+ }
+
+ //TODO Надо убрать этот ужас. Без статики!!!
+ size_t Sender::ReadCallBack( void* ptr, size_t size, size_t nmemb, void* userp )
+ {
+ auto pooh = reinterpret_cast<WriteThis*>( userp );
+ if( size * nmemb < 1 || pooh->counter++ > 0 )
+ {
+ return 0;
+ }
+ memcpy( ptr, mText.c_str(), mText.size());
+ return mText.size();
+ }
}