Mercurial > thymian
view mailer/main.cpp @ 0:a4671277546c tip
created the repository for the thymian project
| author | ferencd |
|---|---|
| date | Tue, 17 Aug 2021 11:19:54 +0200 |
| parents | |
| children |
line wrap: on
line source
#include <vmime/vmime.hpp> #include <json.h> #include <templater.h> #include <iostream> #include <sstream> #include <string> #include <fstream> #include <streambuf> void send_message(const std::string& destination, const std::string& subject, const std::string& body) { std::stringstream emailBodySS; emailBodySS << body; // create the email message as per vmime's instructions vmime::messageBuilder mb; mb.setSubject(vmime::text(subject)); mb.setExpeditor(vmime::mailbox("no-reply@cloudy.sh")); mb.getRecipients().appendAddress(vmime::make_shared<vmime::mailbox>(destination)); mb.getTextPart()->setCharset(vmime::charsets::ISO8859_15) ; mb.getTextPart()->setText(vmime::make_shared<vmime::stringContentHandler>(emailBodySS.str())); // Message construction vmime::shared_ptr<vmime::message> msg = mb.construct(); // Output raw message data to a stringstream std::stringstream ss; vmime::utility::outputStreamAdapter out(ss) ; msg->generate(out); std::string s = ss.str(); vmime::utility::url url("smtp://localhost"); vmime::shared_ptr<vmime::net::session> sess = vmime::make_shared<vmime::net::session>(); vmime::shared_ptr<vmime::net::transport> tr = sess->getTransport(url) ; tr->connect(); vmime::utility::inputStreamStringAdapter issa(s) ; vmime::mailbox from("no-reply@cloudy.sh") ; vmime::mailboxList to; to.appendMailbox(vmime::make_shared<vmime::mailbox>(destination) ) ; // send the email tr->send( from, to, issa, s.length ( ) ) ; tr->disconnect () ; } int main() { using nlohmann::json; std::ifstream i("dest.json"); json j; i >> j; std::cout << "Subject:" << j["mail"]["subject"] << std::endl; std::cout << "Body" << j["mail"]["body"] << std::endl; std::ifstream t(j["mail"]["body"]); if(!t) { std::cerr << "Invalid body file" << std::endl; return 1; } std::string str((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>()); STRING_VAR_TEMPLATE(EmailBody, str); for(const auto& t : j["mail"]["targets"]) { std::string to = t["to"]; to.erase(remove( to.begin(), to.end(), '\"' ), to.end()); send_message(t["address"], j["mail"]["subject"], templater<EmailBody>().templatize("target" <is> to).get()); std::cout << "To: " << t["address"] << std::endl << templater<EmailBody>().templatize("target" <is> t["to"]).get() << std::endl << "----------------------------------"<< std::endl; } }
