How can the user send email to me from my app ?
-
@Ahti If you want that the user logs in from your app then the user must enter his EMail account data (server address/port, user name, password). That's why I suggested to not to do it this way but just start users EMail client (Outlook, Thunderbird, what ever). This is much easier and the user can use his/her EMail client.
@mrjj already explained what needs to be done, so it is really not an easy task and overkill in my opinion. -
Again, maybe I am completely out of line here since I am just a Qt beginner myself, but ur talking about browsers, right?
So you have some webserver that serves ur app, right?If ur server is not able to handle SMTP (mail) then I think we're done talking.
Look at ur server! Not the app itself...
-
@peteritv said in How can the user send email to me from my app ?:
Again, maybe I am completely out of line here since I am just a Qt beginner myself, but ur talking about browsers, right?
So you have some webserver that serves ur app, right?If ur server is not able to handle SMTP (mail) then I think we're done talking.
Look at ur server! Not the app itself...
I do not believe that sending an e-mail from ur app to you has anything to do with mail suppliers or clients.
When I put a simple <a with a href to my e-mail account, anyone, no matter what, can send me an e-mail.You can even put it in ur apps global stylesheet I guess...
-
user should login to his mail account from my desktop app and then should sent mail from my desktop app.
As jsulm mentioned, this is not a trivial task, the easiest solution is QDesktopServices::openUrl("mailto:youremail@address.com") as VRonin mentioned.
If you insist on implement smtp functions in your app, the most mature library of c++ I could think of is poco(c is libcurl).Following are the example of using gmail by poco
#include <Poco/Net/MailMessage.h> #include <Poco/Net/MailRecipient.h> #include <Poco/Net/SMTPClientSession.h> #include <Poco/Net/NetException.h> #include <Poco/Net/SecureSMTPClientSession.h> #include <Poco/Net/InvalidCertificateHandler.h> #include <Poco/Net/AcceptCertificateHandler.h> #include <Poco/Net/SSLManager.h> #include <Poco/Net/SecureStreamSocket.h> #include <Poco/Net/MailRecipient.h> #include <Poco/UnicodeConverter.h> #include <iomanip> #include <iostream> #include <string> int main() { using namespace Poco::Net; std::string const host("smtp.gmail.com"); int const port = 465; std::string const sUserName("userEmail@gmail.com"); std::string const sPassword("whatever"); std::string const to("MyEmail@gmail.com"); std::string const from("myUser"); std::string const subject("new feature suggestion"); std::string const content("more animations"); Poco::Net::MailMessage message; try{ Poco::SharedPtr<InvalidCertificateHandler> pCert = new AcceptCertificateHandler(false); Context::Ptr pContext = new Poco::Net::Context(Context::CLIENT_USE, "", "", "", Context::VERIFY_NONE); SSLManager::instance().initializeClient(0, pCert, pContext); SecureStreamSocket pSSLSocket(pContext); pSSLSocket.connect(SocketAddress(host, port)); SecureSMTPClientSession secure(pSSLSocket); secure.login(); bool const tlsStarted = secure.startTLS(pContext); std::cout<<"tls can start : "<<std::boolalpha<<tlsStarted<<std::endl; secure.login(SMTPClientSession::AUTH_LOGIN, sUserName, sPassword); message.setSender(from); message.addRecipient(MailRecipient(MailRecipient::PRIMARY_RECIPIENT, to)); message.setSubject(subject); message.setContentType("text/plain; charset=UTF-8"); message.setContent(content, MailMessage::ENCODING_8BIT); std::cout<<"send message"<<std::endl; secure.sendMessage(message); std::cout<<"close sender"<<std::endl; secure.close(); }catch(SMTPException &e){ std::cerr << e.code() << std::endl; std::cerr << e.message() << std::endl; std::cerr << e.what() << std::endl; std::cerr << e.displayText().c_str() << std::endl; }catch (NetException &e){ std::cerr << e.code() << std::endl; std::cerr << e.message() << std::endl; std::cerr << e.what() << std::endl; std::cerr << e.displayText().c_str() << std::endl; }catch(std::exception const &ex){ std::cerr<<ex.what()<<std::endl; } }
Not every email server works with this example(I guess in most cases what you need to do is adjust the host and port), if you want to support different servers(gmail, hotmail etc), you will need to try them out one by one.
If you do not want to force the users enter their user name and password all of the times, you can save their input by QSettings(better ask the user they want to store their passwords and user name before they do that, and allowed them to remove it later).
However, I will prefer this simple SMTP class which only depends on Qt5, because dependency problems of c++ could be quite nasty to solve.
-
To be honest if I would be a user of such an application I would NEVER enter my login data for my EMail account! I only trust my EMail client. An application asking me for my EMail login data would be uninstalled immediately.
-
ok guys i used the desktopservice::openurl...mailto.. but its opening outlook what if user doesn't have outlook ? why can't i simply open the browser and let him login to his email server and when he/she is logged in i should go directly to compose email and then in 'to' section there should be my emailaddress . how to do that ?
-
@Ahti desktopservice::openurl will open the EMail client the user configured. In your case it looks like this is Outlook, for other users it can be something else (on my Linux machine it would open Thunderbird), no issue here.
Regarding your last question: not all users use web access to their EMail accounts and I don't think there is a standard way to pass all the data for the EMail to such web based EMail clients. -
@Ahti do you have your own public server? If so, then perhaps the most easy way would be to code a simple http API that your app (with somekind of authentication obviously) can do a simple http POST to, and that thing then sends the e-mail to you.