aboutsummaryrefslogtreecommitdiff
path: root/contrib/epee/include/net/smtp.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/epee/include/net/smtp.h')
-rw-r--r--contrib/epee/include/net/smtp.h181
1 files changed, 181 insertions, 0 deletions
diff --git a/contrib/epee/include/net/smtp.h b/contrib/epee/include/net/smtp.h
new file mode 100644
index 000000000..d2e8598fd
--- /dev/null
+++ b/contrib/epee/include/net/smtp.h
@@ -0,0 +1,181 @@
+// Copyright (c) 2006-2013, Andrey N. Sabelnikov, www.sabelnikov.net
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// * Neither the name of the Andrey N. Sabelnikov nor the
+// names of its contributors may be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER BE LIABLE FOR ANY
+// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+
+
+
+
+#pragma once
+#include <iostream>
+#include <istream>
+#include <ostream>
+#include <string>
+#include <boost/asio.hpp>
+#include <boost/bind.hpp>
+#include <boost/lexical_cast.hpp>
+#include <boost/archive/iterators/base64_from_binary.hpp>
+#include <boost/archive/iterators/transform_width.hpp>
+#include <boost/archive/iterators/ostream_iterator.hpp>
+
+
+namespace epee
+{
+namespace net_utils
+{
+ namespace smtp
+ {
+
+ using boost::asio::ip::tcp;
+ using namespace boost::archive::iterators;
+ typedef base64_from_binary<transform_width<const char *,6,8> > base64_text;
+
+ /************************************************************************/
+ /* */
+ /************************************************************************/
+ class smtp_client
+ {
+ public:
+ smtp_client(std::string pServer,unsigned int pPort,std::string pUser,std::string pPassword):
+ mServer(pServer),mPort(pPort),mUserName(pUser),mPassword(pPassword),mSocket(mIOService),mResolver(mIOService)
+ {
+ tcp::resolver::query qry(mServer,boost::lexical_cast<std::string>( mPort ));
+ mResolver.async_resolve(qry,boost::bind(&smtp_client::handleResolve,this,boost::asio::placeholders::error,
+ boost::asio::placeholders::iterator));
+ }
+ bool Send(std::string pFrom,std::string pTo,std::string pSubject,std::string pMessage)
+ {
+ mHasError = true;
+ mFrom=pFrom;
+ mTo=pTo;
+ mSubject=pSubject;
+ mMessage=pMessage;
+ mIOService.run();
+ return !mHasError;
+ }
+ private:
+ std::string encodeBase64(std::string pData)
+ {
+ std::stringstream os;
+ size_t sz=pData.size();
+ std::copy(base64_text(pData.c_str()),base64_text(pData.c_str()+sz),std::ostream_iterator<char>(os));
+ return os.str();
+ }
+ void handleResolve(const boost::system::error_code& err,tcp::resolver::iterator endpoint_iterator)
+ {
+ if(!err)
+ {
+ tcp::endpoint endpoint=*endpoint_iterator;
+ mSocket.async_connect(endpoint,
+ boost::bind(&smtp_client::handleConnect,this,boost::asio::placeholders::error,++endpoint_iterator));
+ }
+ else
+ {
+ mHasError=true;
+ mErrorMsg= err.message();
+ }
+ }
+ void writeLine(std::string pData)
+ {
+ std::ostream req_strm(&mRequest);
+ req_strm << pData << "\r\n";
+ boost::asio::write(mSocket,mRequest);
+ req_strm.clear();
+ }
+ void readLine(std::string& pData)
+ {
+ boost::asio::streambuf response;
+ boost::asio::read_until(mSocket, response, "\r\n");
+ std::istream response_stream(&response);
+ response_stream >> pData;
+ }
+ void handleConnect(const boost::system::error_code& err,tcp::resolver::iterator endpoint_iterator)
+ {
+ if (!err)
+ {
+ std::string read_buff;
+ // The connection was successful. Send the request.
+ std::ostream req_strm(&mRequest);
+ writeLine("EHLO "+mServer);
+ readLine(read_buff);//220
+ writeLine("AUTH LOGIN");
+ readLine(read_buff);//
+ writeLine(encodeBase64(mUserName));
+ readLine(read_buff);
+ writeLine(encodeBase64(mPassword));
+ readLine(read_buff);
+ writeLine( "MAIL FROM:<"+mFrom+">");
+ writeLine( "RCPT TO:<"+mTo+">");
+ writeLine( "DATA");
+ writeLine( "SUBJECT:"+mSubject);
+ writeLine( "From:"+mFrom);
+ writeLine( "To:"+mTo);
+ writeLine( "");
+ writeLine( mMessage );
+ writeLine( "\r\n.\r\n");
+ readLine(read_buff);
+ if(read_buff == "250")
+ mHasError = false;
+ writeLine( "QUIT");
+ }
+ else
+ {
+ mHasError=true;
+ mErrorMsg= err.message();
+ }
+ }
+ std::string mServer;
+ std::string mUserName;
+ std::string mPassword;
+ std::string mFrom;
+ std::string mTo;
+ std::string mSubject;
+ std::string mMessage;
+ unsigned int mPort;
+ boost::asio::io_service mIOService;
+ tcp::resolver mResolver;
+ tcp::socket mSocket;
+ boost::asio::streambuf mRequest;
+ boost::asio::streambuf mResponse;
+ bool mHasError;
+ std::string mErrorMsg;
+ };
+
+
+ bool send_mail(const std::string& server, int port, const std::string& login, const std::string& pass, const std::string& from_email, /*"STIL CRAWLER",*/
+ const std::string& maillist, const std::string& subject, const std::string& body)
+ {
+ STD_TRY_BEGIN();
+ //smtp_client mailc("yoursmtpserver.com",25,"user@yourdomain.com","password");
+ //mailc.Send("from@yourdomain.com","to@somewhere.com","subject","Hello from C++ SMTP Client!");
+ smtp_client mailc(server,port,login,pass);
+ return mailc.Send(from_email,maillist,subject,body);
+ STD_TRY_CATCH("at send_mail", false);
+ }
+
+ }
+}
+}
+
+//#include "smtp.inl" \ No newline at end of file