tag:blogger.com,1999:blog-7412059039196297644.post7893331441774873227..comments2023-05-03T00:30:03.873-07:00Comments on Coding ways: Send Email in C++ ( SMTP Client in C++ )Anonymoushttp://www.blogger.com/profile/01943168256481763086noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-7412059039196297644.post-7423374498263767772018-09-17T01:19:24.877-07:002018-09-17T01:19:24.877-07:00Hi . How should i do to include this file in my mf...Hi . How should i do to include this file in my mfc project? Anonymoushttps://www.blogger.com/profile/08136565613680815667noreply@blogger.comtag:blogger.com,1999:blog-7412059039196297644.post-79881279086708837902018-02-26T01:45:30.865-08:002018-02-26T01:45:30.865-08:00The message string has to be in MIME (https://en.w...The message string has to be in MIME (https://en.wikipedia.org/wiki/MIME)<br />The Sunday Programmerhttps://www.blogger.com/profile/02800560004676121313noreply@blogger.comtag:blogger.com,1999:blog-7412059039196297644.post-4768070068955163452017-07-13T21:54:03.070-07:002017-07-13T21:54:03.070-07:00I am able to successfully send mail with your code...I am able to successfully send mail with your code but i want to send the attachment file with mail too.Can you please help me .<br /><br />Thanks in Advance<br />SunilSunilChttps://www.blogger.com/profile/00218189055865532177noreply@blogger.comtag:blogger.com,1999:blog-7412059039196297644.post-88445415244063632092013-08-14T11:29:20.703-07:002013-08-14T11:29:20.703-07:00Hi, Thanks.
you are right. I corrected that class....Hi, Thanks.<br />you are right. I corrected that class. Now it can sends multiple emails.<br />actually I moved sending email outside of handleConnect in new method ( Send ).<br />in this way with a single connection/authentication, you can send multiple emails.<br />-----------------<br />#include <br />#include <br />#include <br />#include <br />#include <br />#include <br />#include <br />#include <br />#include <br />#include <br />using boost::asio::ip::tcp;<br />using namespace boost::archive::iterators;<br />typedef base64_from_binary > base64_text;<br />class SMTPClient {<br />private :<br /> <br />public:<br /> enum AUTH_STATUS{AUTH_NONE,AUTHENTICATING,AUTHENTICATED,AUTHENTICATIONFAILED} mauth_status;<br /> SMTPClient(std::string pServer, unsigned int pPort, std::string pUser, std::string pPassword) :<br /> mServer(pServer), mPort(pPort), mUserName(pUser), mPassword(pPassword), mSocket(mIOService), mResolver(<br /> mIOService) {<br /> mauth_status = AUTH_NONE;<br /> <br /> }<br /> void Authenticate()<br /> {<br /> mauth_status = AUTHENTICATING;<br /> tcp::resolver::query qry(mServer, boost::lexical_cast(mPort));<br /> mResolver.async_resolve(qry, boost::bind(&SMTPClient::handleResolve, this, boost::asio::placeholders::error,<br /> boost::asio::placeholders::iterator));<br /> mIOService.run();<br /> }<br /> void Quit()<br /> {<br /> writeLine("QUIT");<br /> mIOService.stop();<br /> }<br /> bool Send(std::string pFrom, std::string pTo, std::string pSubject, std::string pMessage) {<br /> if(mauth_status != AUTHENTICATED || mHasError)<br /> {<br /> std::cout << "not authenticated ('" << mErrorMsg << "'). returning...";<br /> return false; // has error<br /> }<br /> std::cout << "SENDING ....";<br /> writeLine("MAIL FROM: \"ProWeb Alert\"<" + pFrom+">");<br /> writeLine("RCPT TO:" + pTo);<br /> writeLine("DATA");<br /> writeLine("FROM:<" + pFrom+">");<br /> writeLine("SUBJECT:" + pSubject);<br /> writeLine("");<br /> writeLine(pMessage);<br /> writeLine("");<br /> writeLine(".");<br /> return true;//TODO: smtp server response must be checked.<br /> }<br /> <br /><br /><br />private:<br /> std::string encodeBase64(std::string pData) {<br /> std::stringstream os;<br /> size_t sz=pData.size();<br /> std::copy(base64_text(pData.c_str()),base64_text(pData.c_str()+sz),ostream_iterator(os));<br /> return os.str();<br /> }<br /> void handleResolve(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) {<br /> if (!err) {<br /> std::cout << " resolving done\n";<br /> tcp::endpoint endpoint = *endpoint_iterator;<br /> mSocket.async_connect(endpoint, boost::bind(&SMTPClient::handleConnect, this,<br /> boost::asio::placeholders::error, ++endpoint_iterator));<br /> } else {<br /> std::cout << " can't resolve\n";<br /> mHasError = true;<br /> mErrorMsg = err.message();<br /> }<br /> }<br /> void writeLine(std::string pData) {<br /> std::ostream req_strm(&mRequest);<br /> req_strm << pData << "\r\n";<br /> //std::cout << pData << "\r\n";<br /> boost::asio::write(mSocket, mRequest);<br /> req_strm.clear();<br /> }<br /> void handleConnect(const boost::system::error_code& err, tcp::resolver::iterator endpoint_iterator) {<br /> if (!err) {<br /> std::cout << " connected \n";<br /> // The connection was successful. Send the request.<br /> mHasError=false;<br /> std::ostream req_strm(&mRequest);<br /> writeLine("EHLO " + mServer);<br /> writeLine("AUTH LOGIN");<br /> writeLine(encodeBase64(mUserName));<br /> writeLine(encodeBase64(mPassword));<br /> mauth_status = AUTHENTICATED;<br /> } else {<br /> std::cout << " can not connect\n";<br /> mauth_status = AUTHENTICATIONFAILED;<br /> mHasError = true;<br /> mErrorMsg = err.message();<br /> }<br /> }<br /><br /> std::string mServer;<br /> std::string mUserName;<br /> std::string mPassword;<br /> unsigned int mPort;<br /> boost::asio::io_service mIOService;<br /> tcp::resolver mResolver;<br /> tcp::socket mSocket;<br /> boost::asio::streambuf mRequest;<br /> boost::asio::streambuf mResponse;<br /> bool mHasError;<br /> std::string mErrorMsg;<br /> std::ostringstream mResponseData;<br /> std::ostringstream mResponseHeader;<br /><br />};<br />Anonymoushttps://www.blogger.com/profile/01943168256481763086noreply@blogger.comtag:blogger.com,1999:blog-7412059039196297644.post-62731236419126768762013-08-14T08:55:05.295-07:002013-08-14T08:55:05.295-07:00This works great, I've adapted it to our softw...This works great, I've adapted it to our software and modified the sent data to support MIME and Attachements. <br />The problem I have though, is that I can't seem to be able to run the mIOService twice? I've called a mIOService.reset() yet the second run still does not invoke the handlers. <br />Any ideas?Anonymoushttps://www.blogger.com/profile/01025242423078017615noreply@blogger.comtag:blogger.com,1999:blog-7412059039196297644.post-7038674279100748982013-07-06T09:17:10.116-07:002013-07-06T09:17:10.116-07:00Looks good.
I couldn't get the code to work ...Looks good. <br /><br />I couldn't get the code to work with gmail or hotmail smtp servers though. Maybe thats because they us SSL? I also tried sending with non ssl smtp server like Lavabit.com. No luck. Have you tried with any of these? In case you did, what smtp settings did you use?<br /><br />(I think I'll have a go with curl instead)<br /><br />Cheers<br /><br />Patrik Kaharihttps://www.blogger.com/profile/15049621234293674537noreply@blogger.com