#include "SendEmailThread.h" #include #include #include "../shared/DatabaseForThread.h" #include "../shared/DatabaseWithRetry.h" #include "../shared/SimpleLogFile.h" #define FROM "" //#define TO "" char* host = NULL; void setEmailThreadSMTPHost(std::string h) { std::string smtp_host = "smtp://" + h; free(host); host = strdup(smtp_host.c_str()); } static size_t payload_source(void *ptr, size_t size, size_t nmemb, void *userp) { struct upload_status *upload_ctx = (struct upload_status *) userp; const char *data; if ((size == 0) || (nmemb == 0) || ((size * nmemb) < 1)) { return 0; } data = upload_ctx->payload_text[upload_ctx->lines_read]; if (data) { size_t len = strlen(data); memcpy(ptr, data, len); upload_ctx->lines_read++; return len; } return 0; } static char *makeHeader(std::string header, std::string content) { std::string joined = header + ": " + content + "\r\n"; return strdup(joined.c_str()); } void SendEmailThread::handleRequestInThread(Request *original) { DatabaseWithRetry *writeDatabase = DatabaseForThread(DatabaseWithRetry::MASTER); SendAlertRequest *request = dynamic_cast (original); writeDatabase->tryQueryUntilSuccess("UPDATE email_sms_strategies SET last = NOW() WHERE user_id=" + itoa(request->userId) + " AND strategy_id=" + itoa(request->strategyId)); std::string result = ""; switch (original->callbackId) { case mtSendEmail: { request->email.insert(0, 1, '<'); request->email.push_back('>'); upload_ctx.lines_read = 0; upload_ctx.payload_text[0] = makeHeader("To", request->email); upload_ctx.payload_text[1] = strdup("From: Trade-Ideas \r\n"); upload_ctx.payload_text[2] = makeHeader("Subject", request->subject); upload_ctx.payload_text[3] = strdup("\r\n"); upload_ctx.payload_text[4] = strdup(request->message.c_str()); upload_ctx.payload_text[5] = strdup("\r\n"); upload_ctx.payload_text[6] = NULL; CURL *curl; CURLcode res = CURLE_OK; struct curl_slist *recipients = NULL; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, host); curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); curl_easy_setopt(curl, CURLOPT_MAIL_FROM, FROM); recipients = curl_slist_append(recipients, request->email.c_str()); curl_easy_setopt(curl, CURLOPT_MAIL_RCPT, recipients); curl_easy_setopt(curl, CURLOPT_READFUNCTION, payload_source); curl_easy_setopt(curl, CURLOPT_READDATA, &upload_ctx); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); /* Send the message */ res = curl_easy_perform(curl); /* Check for errors */ if (res != CURLE_OK) { TclList msg; msg << FLF << "curl_easy_perform() failed" << curl_easy_strerror(res); sendToLogFile(msg); result = "!"; } /* Free the list of recipients */ curl_slist_free_all(recipients); curl_easy_cleanup(curl); } for (int i = 0; i < 5; i++) { free(upload_ctx.payload_text[i]); } break; } case mtSendPhone: { writeDatabase->tryQueryUntilSuccess(request->message); break; } case mtMonitorAlive: { writeDatabase->tryQueryUntilSuccess("UPDATE monitor_alive SET last_update = NOW() WHERE name = 'EmailSms'"); return; } } writeDatabase->tryQueryUntilSuccess("INSERT INTO email_sms_log" "(timestamp, user_id, sent_to) " "VALUES(NOW(), " + itoa(request->userId) + ", '" + result + request->email + "')"); }