Reputation: 3752
I have just started learning about socket programming and learned about winsock and achieved some progress. my question is basically: I want to send emails, what should I do?
points to be mentioned:
Here are the links to pages I have read so far:
basic winsock guide: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx
I have read the first 14 pages from beej guide (can't post the link, new users can only post a maximum of two hyperlinks)
I have learned about the types ( WSADATA
, addrinfo structure
, sockaddr
, SOCKET
) and functions ( WSAStartup()
, WSACleanup()
, getaddrinfo()
, Shutdown()
, WSAGetLastError()
, socket()
, ... )
and I have just started reading this article about SMTP
http://www.faqs.org/rfcs/rfc821.html
here's what I have written till now:
#include <stdio.h>
#include <WinSock2.h>
#include <WS2tcpip.h>
#pragma comment(lib, "Ws2_32.lib") // Applications that use Winsock must be linked with the Ws2_32.lib library file.
#define HTTP_PORT "80"
#define SMTP_PORT "25"
#define HOSTNAME_PORT "101"
/*
All ports and web services names ( which are string aliases of the ports
can be found here:
%WINDIR%\system32\drivers\etc\services
*/
int main(void)
{
WSADATA wsdata;
int iresult, retval; //iresult : instant result
SOCKET connect_socket;
struct addrinfo *result, *ptr, hints;
iresult = WSAStartup(MAKEWORD(2, 2), &wsdata);
if(iresult != 0) printf("Initiation of Winsock succeeded.\n");
else
{
printf("WinSock initialization failed..\n");
WSACleanup();
return 0;
}
if(LOBYTE(wsdata.wVersion) == 2 && HIBYTE(wsdata.wVersion) == 2) printf("winsock.dll is found.\n");
else
{
printf("Can not find the required winsock.dll file.\n");
WSACleanup();
return 0;
}
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC; // IPv4 or IPv6
hints.ai_protocol = IPPROTO_TCP; // TCP connection ( full duplex )
hints.ai_socktype = SOCK_STREAM; // Provides sequenced, reliable, two-way, connection-based byte streams
connect_socket = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol);
if(connect_socket == INVALID_SOCKET)
{
printf("Socket Creation failed..\n");
WSACleanup();
return 0;
}
else printf("Socket Creation Succeeded ..\n");
WSACleanup();
return 1;
}
am I off course?
Upvotes: 11
Views: 18518
Reputation: 1
bytes_to_receive = sizeof(packet)
received_bytes = 0; do { received_bytes += recv(buffer + received_bytes, bytes_to_receive - received_bytes) } while (received_bytes != bytes_to_receive)
Upvotes: 0
Reputation: 597036
RFC 5321 is the official specification for the basic SMTP protocol.
RFC 2822 is the official specification for the basic email format.
Be aware that there are MANY additional RFCs that extend the basic rules. For instance, RFC 1651 extends SMTP so additional features can then be implemented, such as secure authentication via the AUTH extension. And MIME (RFCs 2045, 2046, 2047, 2048, and 2049) is commonly used in modern email systems for allowing attachments, HTML/RTF, etc.
Go to IETF's website to see all available RFC specs used by most Interpet protocols.
Upvotes: 0
Reputation: 21007
You should take a look at some examples on smtp via telnet :)
Basically you need to input in plaintext something like this:
HELO local.domain.name
MAIL FROM: [email protected]
RCPT TO: [email protected]
DATA
...
EDIT according to this example, your code should be:
// Not sure about this one, maybe just "\n"
#define SEPARATOR "\n\r"
int sendData( Socket *socket, const char *data) {
int iResult;
iResult = send(socket, data, (int) strlen(data), 0);
if(iResult == SOCKET_ERROR){
// Do error handling as you like
}
return iResult;
}
sendData( socket, "HELO local.doman.name" SEPARATOR);
sendData( socket, "MAIL FROM: [email protected]" SEPARATOR);
sendData( socket, "RCPT TO: [email protected]" SEPARATOR);
sendData( socket, "DATA" SEPARATOR);
sendData( socket, "This is subject of my mail" SEPARATOR SEPARATOR);
sendData( socket, "And this is text" SEPARATOR);
sendData( socket, "." SEPARATOR); // Send mail
Upvotes: 5