|
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 }
|