update email content type, using new email system for register and errors

This commit is contained in:
Dario 2020-01-03 17:19:58 +01:00
parent feb3067f3a
commit 27bf842e6c
18 changed files with 251 additions and 60 deletions

View File

@ -250,11 +250,20 @@ int HandleElopageRequestTask::run()
*
*/
static const int valid_product_ids[] = { 36001, 43741, 43870, 43944, 43960, 49106 };
bool valid_product_id = false;
for (int i = 0; i < sizeof(valid_product_ids) / sizeof(int); i++) {
if (valid_product_ids[i] == product_id) {
valid_product_id = true;
break;
}
}
// only for product 36001 and 43741 create user accounts and send emails
if (product_id == 36001 || product_id == 43741 || product_id == 43870 || product_id == 43944 || product_id == 43960 || product_id == 49106) {
if (valid_product_id) {
mEmail = mRequestData.get("payer[email]", "");
mFirstName = mRequestData.get("payer[first_name]", "");
mLastName = mRequestData.get("payer[last_name]", "");
auto newUser = controller::User::create(mEmail, mFirstName, mLastName);
/* printf("LastName: %s\n", mLastName.data());
for (int i = 0; i < mLastName.size(); i++) {
@ -284,8 +293,8 @@ int HandleElopageRequestTask::run()
// prepare email in advance
// create connection to email server
UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
prepareEmail->scheduleTask(prepareEmail);
// UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
// prepareEmail->scheduleTask(prepareEmail);
// write user entry into db
writeUserIntoDB();
@ -338,7 +347,7 @@ int HandleElopageRequestTask::run()
if (noEMail != 1) {
// send email to user
auto message = new Poco::Net::MailMessage;
/*auto message = new Poco::Net::MailMessage;
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, mEmail));
message->setSubject("Gradido: E-Mail Verification");
@ -354,10 +363,12 @@ int HandleElopageRequestTask::run()
ss << "Dario, Gradido Server Admin" << std::endl;
message->addContent(new Poco::Net::StringPartSource(ss.str()));
UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
sendEmail->setParentTaskPtrInArray(prepareEmail, 0);
sendEmail->setParentTaskPtrInArray(saveEmailVerificationCode, 1);
*/
//UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
//Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
UniLib::controller::TaskPtr sendEmail(new SendEmailTask(new model::Email(emailVerification, newUser, model::EMAIL_USER_VERIFICATION_CODE), ServerConfig::g_CPUScheduler, 1));
//sendEmail->setParentTaskPtrInArray(prepareEmail, 0);
sendEmail->setParentTaskPtrInArray(saveEmailVerificationCode, 0);
sendEmail->scheduleTask(sendEmail);
}
}

View File

@ -4,8 +4,14 @@
#include "../Crypto/Obfus_array.h"
#include "../Crypto/DRRandom.h"
#include "../SingletonManager/LanguageManager.h"
#include "Poco/Net/SecureSMTPClientSession.h"
#include "Poco/Net/SSLException.h"
EmailManager::EmailManager()
: mInitalized(false), mDisableEmail(false)
: Thread("emails", false), mInitalized(false), mDisableEmail(false)
{
@ -38,6 +44,7 @@ bool EmailManager::init(const Poco::Util::LayeredConfiguration& cfg)
printf("email account not set in config: %s\n", ex.displayText().data());
return false;
}
Thread::init("emails");
mInitalized = true;
DISASM_FALSERET;
@ -57,5 +64,71 @@ void EmailManager::exit()
int EmailManager::ThreadFunction()
{
// prepare connection to email server
if (ServerConfig::g_disableEmail) return 0;
if (mPendingEmails.empty()) return 0;
auto lm = LanguageManager::getInstance();
Poco::Net::SecureSMTPClientSession mailClientSession(mEmailAccount.url, mEmailAccount.port);
mailClientSession.login();
try {
mailClientSession.startTLS(ServerConfig::g_SSL_CLient_Context);
mailClientSession.login(Poco::Net::SMTPClientSession::AUTH_LOGIN, mEmailAccount.username, mEmailAccount.password);
}
catch (Poco::Net::SSLException& ex) {
printf("[PrepareEmailTask] ssl certificate error: %s\nPlease make sure you have cacert.pem (CA/root certificates) next to binary from https://curl.haxx.se/docs/caextract.html\n", ex.displayText().data());
return -1;
}
model::Email* email = nullptr;
Poco::AutoPtr<LanguageCatalog> catalogs[2];
// if email list empty, wait 500ms x time before exit thread and closing connection
int timeoutWaits = 20;
while (mPendingEmails.pop(email) || timeoutWaits > 0) {
if (email) {
Poco::Net::MailMessage mailMessage;
mailMessage.setSender(mEmailAccount.sender);
Languages lang_code = ServerConfig::g_default_locale;
if (email->getUser()) {
Poco::AutoPtr<model::table::User> userModel = email->getUser()->getModel();
if (!userModel.isNull()) {
userModel->lock("EmailManager::ThreadFunction");
lang_code = LanguageManager::languageFromString(userModel->getLanguageKey());
userModel->unlock();
if (lang_code > LANG_COUNT) lang_code = ServerConfig::g_default_locale;
}
}
if (catalogs[lang_code].isNull()) {
catalogs[lang_code] = lm->getFreeCatalog(lang_code);
}
if (email->draft(&mailMessage, catalogs[lang_code])) {
mailClientSession.sendMessage(mailMessage);
}
else {
// error drafting email, shouldn't happend
printf("[EmailManager::ThreadFunction] Error drafting email\n");
}
delete email;
email = nullptr;
}
if (mPendingEmails.empty()) {
Poco::Thread::sleep(500);
timeoutWaits--;
}
}
mailClientSession.close();
return 0;
}

View File

@ -29,7 +29,7 @@ public:
inline const std::string& getAdminReceiver() { return mEmailAccount.admin_receiver; }
inline void addEmail(model::Email* email) { mPendingEmails.push(email); }
inline void addEmail(model::Email* email) { mPendingEmails.push(email); condSignal();}
protected:
EmailManager();

View File

@ -6,6 +6,10 @@
#include "../lib/ErrorList.h"
#include "../model/Email.h"
#include "EmailManager.h"
ErrorManager* ErrorManager::getInstance()
{
@ -71,11 +75,11 @@ int ErrorManager::getErrors(ErrorList* send)
void ErrorManager::sendErrorsAsEmail()
{
auto message = new Poco::Net::MailMessage();
/*auto message = new Poco::Net::MailMessage();
message->setSender("gradido_loginServer@gradido.net");
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
message->setSubject("Error from Gradido Login Server");
*/
std::string content;
mWorkingMutex.lock();
for (auto it1 = mErrorsMap.begin(); it1 != mErrorsMap.end(); it1++) {
@ -95,8 +99,12 @@ void ErrorManager::sendErrorsAsEmail()
mErrorsMap.clear();
mWorkingMutex.unlock();
message->addContent(new Poco::Net::StringPartSource(content));
UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
auto email = new model::Email(content, model::EMAIL_ERROR);
EmailManager::getInstance()->addEmail(email);
//message->addContent(new Poco::Net::StringPartSource(content));
//UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
//sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
}

View File

@ -35,6 +35,14 @@ namespace controller {
return Poco::AutoPtr<EmailVerificationCode>(result);
}
Poco::AutoPtr<EmailVerificationCode> EmailVerificationCode::create()
{
auto code = createEmailVerificationCode();
auto db = new model::table::EmailOptIn(code);
auto result = new EmailVerificationCode(db);
return Poco::AutoPtr<EmailVerificationCode>(result);
}
Poco::UInt64 EmailVerificationCode::createEmailVerificationCode()
{
Poco::UInt64 resultCode;

View File

@ -13,6 +13,7 @@ namespace controller {
~EmailVerificationCode();
static Poco::AutoPtr<EmailVerificationCode> create(int user_id);
static Poco::AutoPtr<EmailVerificationCode> create();
inline Poco::AutoPtr<model::table::EmailOptIn> getModel() { return _getModel<model::table::EmailOptIn>(); }
std::string getLink();

View File

@ -19,8 +19,8 @@ namespace controller {
void release();
protected:
template<class T>
Poco::AutoPtr<T> _getModel();
template<class T> Poco::AutoPtr<T> _getModel();
template<class T> const T* _getModel() const;
// for poco auto ptr
int mReferenceCount;
@ -34,12 +34,26 @@ namespace controller {
template<class T>
Poco::AutoPtr<T> TableControllerBase::_getModel() {
// TODO: Maybe update name for error search
lock("TableControllerBase::getModel");
lock("TableControllerBase::_getModel");
T* result = static_cast<T*>(mDBModel.get());
unlock();
return Poco::AutoPtr<T>(result, true);
}
template<class T>
const T* TableControllerBase::_getModel() const {
//lock("TableControllerBase::_getModel const");
if (mDBModel.isNull()) {
//unlock();
return nullptr;
}
const T* result = static_cast<const T*>(mDBModel.get());
//unlock();
return result;
}
}
#endif //GRADIDO_LOGIN_SERVER_MODEL_TABLE_CONTROLLER_BASE_INCLUDE

View File

@ -20,6 +20,7 @@ namespace controller {
int load(const unsigned char* pubkey_array);
inline Poco::AutoPtr<model::table::User> getModel() { return _getModel<model::table::User>(); }
inline const model::table::User* getModel() const { return _getModel<model::table::User>(); }
protected:
User(model::table::User* dbModel);

View File

@ -2,7 +2,10 @@
#include "../ServerConfig.h"
#include "Poco/Net/MailMessage.h"
//#include "Poco/Net/MailMessage.h"
#include "Poco/Net/MediaType.h"
#include "../SingletonManager/EmailManager.h"
SendErrorMessage::~SendErrorMessage()
{
@ -125,11 +128,12 @@ std::string ErrorList::getErrorsHtml()
void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/)
{
auto message = new Poco::Net::MailMessage();
auto em = EmailManager::getInstance();
/*auto message = new Poco::Net::MailMessage();
message->setSender("gradido_loginServer@gradido.net");
message->addRecipient(Poco::Net::MailRecipient(Poco::Net::MailRecipient::PRIMARY_RECIPIENT, "***REMOVED***"));
message->setSubject("Error from Gradido Login Server");
*/
std::string content;
while (mErrorStack.size() > 0) {
auto error = mErrorStack.top();
@ -137,12 +141,18 @@ void ErrorList::sendErrorsAsEmail(std::string rawHtml/* = ""*/)
content += error->getString();
delete error;
}
auto email = new model::Email(content, model::EMAIL_ERROR);
message->addContent(new Poco::Net::StringPartSource(content));
//message->addContent(new Poco::Net::StringPartSource(content));
if (rawHtml != "") {
message->addContent(new Poco::Net::StringPartSource(rawHtml));
Poco::Net::MediaType mt("text", "html");
mt.setParameter("charset", "utf-8");
email->addContent(new Poco::Net::StringPartSource(rawHtml, mt.toString()));
}
UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
em->addEmail(email);
//UniLib::controller::TaskPtr sendErrorMessageTask(new SendErrorMessage(message, ServerConfig::g_CPUScheduler));
//sendErrorMessageTask->scheduleTask(sendErrorMessageTask);
}

View File

@ -1,6 +1,8 @@
#include "Email.h"
#include "../SingletonManager/EmailManager.h"
#include "Poco/Net/MediaType.h"
namespace model {
const static char EmailText_emailVerification[] = {u8"\
@ -46,6 +48,14 @@ Gradido Login Server\
{
}
Email::~Email()
{
while (mAdditionalStringPartSrcs.size() > 0) {
delete mAdditionalStringPartSrcs.front();
mAdditionalStringPartSrcs.pop();
}
}
bool Email::draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog)
{
@ -58,18 +68,21 @@ Gradido Login Server\
static const char* functionName = "Email::draft";
std::string content;
Poco::Net::MediaType mt("text", "plain");
mt.setParameter("charset", "utf-8");
switch (mType) {
case EMAIL_DEFAULT:
mailMessage->addRecipient(adminRecipient);
mailMessage->setSubject(langCatalog->gettext_str("Default Email Subject"));
mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content")));
return true;
mailMessage->addContent(new Poco::Net::StringPartSource(langCatalog->gettext_str("Empty Email Content"), mt.toString()));
break;
case EMAIL_ERROR:
mailMessage->addRecipient(adminRecipient);
mailMessage->setSubject(langCatalog->gettext_str("Error from Gradido Login Server"));
mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml));
return true;
mailMessage->addContent(new Poco::Net::StringPartSource(mErrorHtml, mt.toString()));
break;
case EMAIL_USER_VERIFICATION_CODE:
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
@ -89,9 +102,9 @@ Gradido Login Server\
userTableModel->getFirstName(),
userTableModel->getLastName(),
mEmailVerificationCode->getLink()
))
), mt.toString())
);
return true;
break;
case EMAIL_USER_RESET_PASSWORD:
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
addError(new Error(functionName, "no receiver email set for user reset password email"));
@ -110,9 +123,9 @@ Gradido Login Server\
userTableModel->getFirstName(),
userTableModel->getLastName(),
mEmailVerificationCode->getLink()
))
), mt.toString())
);
return true;
break;
case EMAIL_ADMIN_RESET_PASSWORD_REQUEST_WITHOUT_MEMORIZED_PASSPHRASE:
if (userTableModel.isNull() || mUser->getModel()->getEmail() == "") {
addError(new Error(functionName, "no user email set for admin reset password email"));
@ -125,13 +138,18 @@ Gradido Login Server\
new Poco::Net::StringPartSource(replaceEmail(
EmailText_adminEmailResetPassword,
userTableModel->getEmail()
))
), mt.toString())
);
return true;
break;
default: return false;
}
return false;
while (mAdditionalStringPartSrcs.size() > 0) {
mailMessage->addContent(mAdditionalStringPartSrcs.front());
mAdditionalStringPartSrcs.pop();
}
return true;
}
std::string Email::replaceUserNamesAndLink(const char* src, const std::string& first_name, const std::string& last_name, const std::string& link)
@ -142,7 +160,7 @@ Gradido Login Server\
int findPos = result.find("[first_name]", findCursor);
if (findPos != result.npos) {
findCursor = findPos + 13;
findCursor = findPos + first_name.size();
result.replace(findPos, 12, first_name);
}
else {
@ -151,7 +169,7 @@ Gradido Login Server\
findPos = result.find("[last_name]", findCursor);
if (findPos != result.npos) {
findCursor = findPos + 12;
findCursor = findPos + last_name.size();
result.replace(findPos, 11, last_name);
}
else {
@ -160,7 +178,7 @@ Gradido Login Server\
findPos = result.find("[link]", findCursor);
if (findPos != result.npos) {
findCursor = findPos + 7;
findCursor = findPos + link.size();
result.replace(findPos, 6, link);
}
else {

View File

@ -37,10 +37,13 @@ namespace model {
Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
//! \param errors copy errors into own memory
Email(const std::string& errorHtml, EmailType type);
~Email();
inline EmailType getType() { return mType; }
inline controller::User* getUser() { if (!mUser.isNull()) return mUser.get(); return nullptr; }
bool draft(Net::MailMessage* mailMessage, LanguageCatalog* langCatalog);
inline void addContent(Poco::Net::StringPartSource* str_content) { mAdditionalStringPartSrcs.push(str_content); }
protected:
std::string replaceUserNamesAndLink(const char* src, const std::string& first_name, const std::string& last_name, const std::string& link);
@ -50,6 +53,8 @@ namespace model {
AutoPtr<controller::User> mUser;
std::string mErrorHtml;
EmailType mType;
std::queue<Poco::Net::StringPartSource*> mAdditionalStringPartSrcs;
};
}

View File

@ -16,6 +16,8 @@
#include "../lib/JsonRequest.h"
#include "../controller/User.h"
#include "sodium.h"
@ -169,6 +171,7 @@ bool Session::createUser(const std::string& first_name, const std::string& last_
}*/
// check if user with that email already exist
auto dbConnection = ConnectionManager::getInstance()->getConnection(CONNECTION_MYSQL_LOGIN_SERVER);
Poco::Data::Statement select(dbConnection);
select << "SELECT email from users where email = ?;", useRef(email);
@ -183,11 +186,12 @@ bool Session::createUser(const std::string& first_name, const std::string& last_
}
mSessionUser = new User(email.data(), first_name.data(), last_name.data());
mNewUser = controller::User::create(email, first_name, last_name);
updateTimeout();
// Prepare E-Mail
UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
prepareEmail->scheduleTask(prepareEmail);
//UniLib::controller::TaskPtr prepareEmail(new PrepareEmailTask(ServerConfig::g_CPUScheduler));
//prepareEmail->scheduleTask(prepareEmail);
// create user crypto key
UniLib::controller::TaskPtr cryptoKeyTask(new UserCreateCryptoKey(mSessionUser, password, ServerConfig::g_CryptoCPUScheduler));
@ -201,6 +205,8 @@ bool Session::createUser(const std::string& first_name, const std::string& last_
writeUserIntoDB->scheduleTask(writeUserIntoDB);
createEmailVerificationCode();
auto emailVerificationCodeObject = controller::EmailVerificationCode::create();
emailVerificationCodeObject->getModel()->setCode(mEmailVerificationCode);
UniLib::controller::TaskPtr writeEmailVerification(new WriteEmailVerification(mSessionUser, mEmailVerificationCode, ServerConfig::g_CPUScheduler, 1));
writeEmailVerification->setParentTaskPtrInArray(writeUserIntoDB, 0);
@ -216,7 +222,7 @@ bool Session::createUser(const std::string& first_name, const std::string& last_
*/
// depends on writeUser because need user_id, write email verification into db
auto message = new Poco::Net::MailMessage;
/*auto message = new Poco::Net::MailMessage;
Poco::Net::MediaType mt("text", "plain");
mt.setParameter("charset", "utf-8");
message->setContentType(mt);
@ -235,14 +241,15 @@ bool Session::createUser(const std::string& first_name, const std::string& last_
message->addContent(new Poco::Net::StringPartSource(ss.str()));
UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
sendEmail->setParentTaskPtrInArray(prepareEmail, 0);
sendEmail->setParentTaskPtrInArray(writeEmailVerification, 1);
*/
//UniLib::controller::TaskPtr sendEmail(new SendEmailTask(message, ServerConfig::g_CPUScheduler, 1));
//Email(AutoPtr<controller::EmailVerificationCode> emailVerification, AutoPtr<controller::User> user, EmailType type);
UniLib::controller::TaskPtr sendEmail(new SendEmailTask(new model::Email(emailVerificationCodeObject, mNewUser, model::EMAIL_USER_VERIFICATION_CODE), ServerConfig::g_CPUScheduler, 1));
//sendEmail->setParentTaskPtrInArray(prepareEmail, 0);
sendEmail->setParentTaskPtrInArray(writeEmailVerification, 0);
sendEmail->setFinishCommand(new SessionStateUpdateCommand(SESSION_STATE_EMAIL_VERIFICATION_SEND, this));
sendEmail->scheduleTask(sendEmail);
// write user into db
// generate and write email verification into db
// send email

View File

@ -12,6 +12,12 @@ namespace model {
}
EmailOptIn::EmailOptIn(const Poco::UInt64& code)
: mUserId(0), mEmailVerificationCode(code)
{
}
EmailOptIn::EmailOptIn()
: mUserId(0), mEmailVerificationCode(0)
{

View File

@ -12,6 +12,7 @@ namespace model {
{
public:
EmailOptIn(const Poco::UInt64& code, int user_id);
EmailOptIn(const Poco::UInt64& code);
EmailOptIn();
~EmailOptIn();

View File

@ -2,21 +2,33 @@
#include "PrepareEmailTask.h"
#include "../lib/Profiler.h"
#include "../SingletonManager/ErrorManager.h"
#include "../SingletonManager/EmailManager.h"
#include "../ServerConfig.h"
#include "Poco/Net/MediaType.h"
SendEmailTask::SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/)
: UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount+1), mMailMessage(mailMessage)
: UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount+1), mMailMessage(mailMessage), mEmail(nullptr)
{
}
SendEmailTask::SendEmailTask(model::Email*email, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount/* = 0*/)
: UniLib::controller::CPUTask(cpuScheduler, additionalTaskDependenceCount), mMailMessage(nullptr), mEmail(email)
{
}
SendEmailTask::~SendEmailTask()
{
if (mMailMessage) {
delete mMailMessage;
mMailMessage = nullptr;
}
if (mEmail) {
delete mEmail;
mEmail = nullptr;
}
}
int SendEmailTask::run()
@ -27,17 +39,25 @@ int SendEmailTask::run()
auto er = ErrorManager::getInstance();
auto parent = getParent(0);
if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) {
er->addError(new Error("SendEmailTask", "first parent isn't PrepareEmailTask"));
er->sendErrorsAsEmail();
return -1;
if (mMailMessage) {
if (strcmp(parent->getResourceType(), "PrepareEmailTask") != 0) {
er->addError(new Error("SendEmailTask", "first parent isn't PrepareEmailTask"));
er->sendErrorsAsEmail();
return -1;
}
PrepareEmailTask* prepare = (PrepareEmailTask*)&(*parent);
mMailMessage->setSender(ServerConfig::g_EmailAccount.sender);
if (prepare->send(mMailMessage)) {
er->sendErrorsAsEmail();
return -1;
}
}
PrepareEmailTask* prepare = (PrepareEmailTask*)&(*parent);
mMailMessage->setSender(ServerConfig::g_EmailAccount.sender);
if (prepare->send(mMailMessage)) {
er->sendErrorsAsEmail();
return -1;
else if (mEmail) {
auto em = EmailManager::getInstance();
em->addEmail(mEmail);
mEmail = nullptr;
}
//printf("[SendEmailTask] time: %s\n", timeUsed.string().data());
return 0;

View File

@ -4,6 +4,8 @@
#include "CPUTask.h"
#include "Poco/Net/MailMessage.h"
#include "../model/Email.h"
/*
* @author: Dario Rekowski
*
@ -17,6 +19,7 @@ class SendEmailTask : public UniLib::controller::CPUTask
public:
SendEmailTask(Poco::Net::MailMessage* mailMessage, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0);
SendEmailTask(model::Email* email, UniLib::controller::CPUSheduler* cpuScheduler, size_t additionalTaskDependenceCount = 0);
virtual ~SendEmailTask();
virtual int run();
@ -26,7 +29,7 @@ protected:
private:
Poco::Net::MailMessage* mMailMessage;
model::Email* mEmail;
};

View File

@ -165,6 +165,8 @@ int SigningTransaction::run() {
return -9;
}
//sendErrorsAsEmail("<html><head><title>Hallo</title></head><body><font color='red'>Rote Test </font></body>");
Poco::JSON::Object object = *parsedJson.extract<Poco::JSON::Object::Ptr>();
auto state = object.get("state");
std::string stateString = state.convert<std::string>();

View File

@ -67,7 +67,10 @@ namespace UniLib {
//int status = SDL_CondWait(t->condition, t->mutex);
try {
condition.wait(mutex);
if (exitCalled) return;
if (exitCalled) {
threadUnlock();
return;
}
int ret = ThreadFunction();
threadUnlock();
if (ret)