Has anyone had any success with libcurl and POP3 with APOP authentication?
I had success with the clear authentication but not with APOP since the library
sends the USER command almost immediately after making a connection.
How do I make libcurl send APOP command and stop it sending USER command?
libcurl currently doesn't support APOP. You need to dive in and make it so!
Related
I want to send email over SMTP using c++ code, how should I handle it in generic way that a random user don't have to handle SMTP server specification? (Windows)
Without specification means user should not have to write IP address of SMTP server etc.
Install an smtp relay server on the same host where the code runs and set the SMTP server in the code to 'localhost'.
Jasper's answer is correct. You need to install an SMTP server on the host that your C++ program is running on. One option is qmail. See www.lifewithqmail.org for more info, including a step-by-step guide on how to install it.
Most linux SMTP servers (including qmail) will create a smylink /usr/sbin/sendmail which you can use to send an outgoing message. In general, the syntax is:
/usr/sbin/sendmail recipient#domain.tld < /path/to/file/containing/the/message
See the help file for more info, including flags that you can use to specify the envelope sender, etc.
You can send a message from your C++ program by doing a system call to /usr/sbin/sendmail similar to the above.
You could use Simple MAPI, but you need an email program supporting the MAPI-interface like Outlook.
I have seen many tutorials (http://curl.haxx.se/libcurl/c/smtp-multi.html, VMIME website, etc) that explain how to send mail through some server like GMail or whatever. That is, they require a username/password to log in to some server, and then they forward the email through the server to the destination.
What I am looking for and cannot find is an explanation of how to send email that is not routed through a server though. How do you send email without a mail server? I am looking for a [Linux] library that can let my program be the mail server itself, both to send mail and receive it. If this is not possible with curl or vmime then I will be glad to switch to another library. I really do not want to have to roll my own SMTP server, but I've spent a day on google to no avail, and read the VMIME book but I can't find anything helpful and it's a little abstruse to my mind.
Edit:
So basically I'm looking for a SMTP server library (that can also send emails to other servers) for C or C++. Does such a thing exist? I see them for .NET and Java and Python but no C or C++ yet. Still googling...
Sadly, I don't know of any that are still active. VMIME has some support but the API for SMTP/SMTPS is kinda awkward looking. I have looked at libcurl for the sending portion too. It looks a bit easier to manage than VMIME's SMTP/SMTPS API. I am currently using VMIME to generate the messages and am sending using the MSMTP utility. The combination of VMIME and MSMTP works great but would prefer to keep it all in one utility program...
I don't have too much experience programming in C++, but I need to build a basic application for sending state emails from a computer using windows or linux, and I've found that POCO C++ suppoorts both platforms, but I have a proxy http provider behind to filter unauthorized connections, so, how could I do it?.
You can't send SMTP e-mail through a HTTP proxy.
But you can make a HTTP connection to a website you control. And you can write a web-to-email script and put that on your website. E.g. your script can take a status message as a POST parameter and then send it out as e-mail.
Spammers often try to hack web-to-email scripts to send spam, so please make sure your script has a hard-coded destination e-mail address. That way the spammer can only send mail to you, not everyone else on the Internet. Whatever you do, don't pass the destination e-mail address as a parameter.
regarding web to email scripts - make sure you strip newlines from anything that ends up in email headers! (to prevent spammers from injecting headers)
The Scenario:
I'm implementing an FTP get functionality in my application, that uses Qt 4.7.x
Qt documentation states that the QFtp class is deprecated, to use QNetworkAccessManager instead, and so I'm doing ;) I tested the code I wrote with some FTP server out there and it seems to work fine.
The Problem:
When I connect to my local, homebrewed (and quite simple), ftp server using my ftp get class I get the following error: Request: 500 No Help Available.
I traced the ftp communication using tcpdump and actually I see that the QNetworkAccessManager/QNetworkRequest sends an HELP verb to the server, once it gets the 230 User Logged In
Unfortunately my server do not support that. Now is there a way to configure the Qt not to send the HELP verb? Reading the Qt Doc online for the involved classes did not helped.
There is probably no way to avoid this, unless you want to reimplement the FTP backend. By browsing the source code for the FTP backend, you can find out that the purpose for sending the HELP command is to find out if the server supports the "SIZE" and "MDTM" commands.
Probably the easiest solution would be to implement a minimal handler for HELP commands in your FTP server that responds with an appropriate 200/211/214 response.
EDIT: See http://qt.gitorious.org/qt/qt/blobs/4.8/src/network/access/qnetworkaccessftpbackend.cpp#line350 for what the backend expects from the response. It's not complicated.
It is not configurable.
You can see the source code of what's happening here: http://qt.gitorious.org/qt/qt/blobs/4.7/src/network/access/qnetworkaccessftpbackend.cpp#line300
If you can build your own version of Qt, then it can easily be suppressed. But it might be easier for you to upgrade your FTP server to support the HELP command.
I hate CURL it is too bulky with too many dependencies when all I need to do is quickly open a URL. I don't even need to retrieve the contents of the web page, I just need to make the GET HTTP request to the server.
What's the most minimal way I can do this and don't say CURL !##$
There are lots of choices! Try libwww -- but be warned, most people strongly prefer libcurl. It's much easier to use.
There's a very light way and I've done this myself when implementing a high-scale back end service for a large media provider in the UK.
This method is extremely operating-system specific.
open a TCP socket to the HTTP server
send a "GET /path/to/url HTTP/1.1\r\nHost: www.host.com\r\n\r\n" (the Host header is required for HTTP/1.1 and most virtual servers, don't forget the two blank lines, and a newline requires a carriage return as well for HTTP headers)
wait for the response
close the socket
If you are going to close the socket at the end of the connection you may also want to send a Connection: close\r\n as part of your headers to inform the web server that you will terminate the connection after retrieving the web page.
You may run into trouble if you're fetching an encoded or generated web page in which case you'll have to add logic to interpret the fetched data.
On Windows (Windows XP, Windows 2000 Professional with SP3 and above) you could use WinHttpReadData API. There's also an example at the bottom of that page.
More info on Windows HTTP Services on MSDN
I have used Winsock when I need as few dependencies as possible and it has worked well. You need to write more code than using a separate library or the Microsoft WinHTTP library.
The functions you need are WSAStartup, socket, connect, send, recv, closesocket and WSACleanup.
See sample code for the send function.
system("wget -q -O file.htm http://url.com");