annotate 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
rev   line source
ferencd@0 1 #include <vmime/vmime.hpp>
ferencd@0 2 #include <json.h>
ferencd@0 3 #include <templater.h>
ferencd@0 4
ferencd@0 5 #include <iostream>
ferencd@0 6 #include <sstream>
ferencd@0 7 #include <string>
ferencd@0 8 #include <fstream>
ferencd@0 9 #include <streambuf>
ferencd@0 10
ferencd@0 11 void send_message(const std::string& destination, const std::string& subject, const std::string& body)
ferencd@0 12 {
ferencd@0 13 std::stringstream emailBodySS;
ferencd@0 14 emailBodySS << body;
ferencd@0 15
ferencd@0 16 // create the email message as per vmime's instructions
ferencd@0 17 vmime::messageBuilder mb;
ferencd@0 18 mb.setSubject(vmime::text(subject));
ferencd@0 19 mb.setExpeditor(vmime::mailbox("no-reply@cloudy.sh"));
ferencd@0 20 mb.getRecipients().appendAddress(vmime::make_shared<vmime::mailbox>(destination));
ferencd@0 21 mb.getTextPart()->setCharset(vmime::charsets::ISO8859_15) ;
ferencd@0 22 mb.getTextPart()->setText(vmime::make_shared<vmime::stringContentHandler>(emailBodySS.str()));
ferencd@0 23
ferencd@0 24 // Message construction
ferencd@0 25 vmime::shared_ptr<vmime::message> msg = mb.construct();
ferencd@0 26
ferencd@0 27 // Output raw message data to a stringstream
ferencd@0 28 std::stringstream ss;
ferencd@0 29 vmime::utility::outputStreamAdapter out(ss) ;
ferencd@0 30 msg->generate(out);
ferencd@0 31 std::string s = ss.str();
ferencd@0 32
ferencd@0 33 vmime::utility::url url("smtp://localhost");
ferencd@0 34 vmime::shared_ptr<vmime::net::session> sess = vmime::make_shared<vmime::net::session>();
ferencd@0 35 vmime::shared_ptr<vmime::net::transport> tr = sess->getTransport(url) ;
ferencd@0 36 tr->connect();
ferencd@0 37 vmime::utility::inputStreamStringAdapter issa(s) ;
ferencd@0 38
ferencd@0 39 vmime::mailbox from("no-reply@cloudy.sh") ;
ferencd@0 40 vmime::mailboxList to;
ferencd@0 41 to.appendMailbox(vmime::make_shared<vmime::mailbox>(destination) ) ;
ferencd@0 42
ferencd@0 43 // send the email
ferencd@0 44 tr->send( from, to, issa, s.length ( ) ) ;
ferencd@0 45 tr->disconnect () ;
ferencd@0 46
ferencd@0 47 }
ferencd@0 48
ferencd@0 49 int main()
ferencd@0 50 {
ferencd@0 51 using nlohmann::json;
ferencd@0 52
ferencd@0 53 std::ifstream i("dest.json");
ferencd@0 54 json j;
ferencd@0 55 i >> j;
ferencd@0 56
ferencd@0 57 std::cout << "Subject:" << j["mail"]["subject"] << std::endl;
ferencd@0 58 std::cout << "Body" << j["mail"]["body"] << std::endl;
ferencd@0 59
ferencd@0 60
ferencd@0 61 std::ifstream t(j["mail"]["body"]);
ferencd@0 62
ferencd@0 63 if(!t)
ferencd@0 64 {
ferencd@0 65 std::cerr << "Invalid body file" << std::endl;
ferencd@0 66 return 1;
ferencd@0 67 }
ferencd@0 68
ferencd@0 69 std::string str((std::istreambuf_iterator<char>(t)),
ferencd@0 70 std::istreambuf_iterator<char>());
ferencd@0 71
ferencd@0 72 STRING_VAR_TEMPLATE(EmailBody, str);
ferencd@0 73
ferencd@0 74
ferencd@0 75 for(const auto& t : j["mail"]["targets"])
ferencd@0 76 {
ferencd@0 77 std::string to = t["to"];
ferencd@0 78 to.erase(remove( to.begin(), to.end(), '\"' ), to.end());
ferencd@0 79
ferencd@0 80 send_message(t["address"], j["mail"]["subject"], templater<EmailBody>().templatize("target" <is> to).get());
ferencd@0 81 std::cout << "To: " << t["address"] << std::endl << templater<EmailBody>().templatize("target" <is> t["to"]).get() << std::endl
ferencd@0 82 << "----------------------------------"<< std::endl;
ferencd@0 83 }
ferencd@0 84
ferencd@0 85 }