11

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:

  1. I learned about initializing winsock. SMTP port (25). creating and connecting to sockets successfully. What should I do now?!!! (I'm stuck here)
  2. I don't want a ready-for-work code. I wanna learn. So, any books, documentations, tutorials or articles recommendations are needed.
  3. I know that C itself knows nothing about networking, does that mean I have to download some libraries? (I am using VS2010, Windows 7)

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?

cha0site
  • 10,517
  • 3
  • 33
  • 51
joker
  • 3,416
  • 2
  • 34
  • 37
  • I'd recommend reading Stevens' excellent "TCP/IP Illustrated" book, and also his "Advanced Programming in the Unix Environment". Yes, I know it says Unix, but it's really an excellent book and `winsock` is basically an implementation of the BSD socket API. – cha0site Feb 02 '12 at 11:03

4 Answers4

5

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: mail@domain.ext
RCPT TO: mail@otherdomain.ext
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: mail@domain.ext" SEPARATOR);
sendData( socket, "RCPT TO: mail@otherdomain.ext" 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
Vyktor
  • 20,559
  • 6
  • 64
  • 96
  • I did run over something like this, but couldn't understand what to do with that? I mean where to put this text? and why? what does "HELO" mean ( i think saying hello to the server )? – joker Feb 02 '12 at 11:13
  • @joker put it in telnet: http://en.wikipedia.org/wiki/Telnet there's even a program for that in windows named the same. – Flavius Feb 02 '12 at 11:23
  • @joker: 'In the HELO command the host sending the command identifies itself; the command may be interpreted as saying "Hello, I am "' – cha0site Feb 02 '12 at 11:24
  • 3
    Don't forget to READ AND PROCESS the server's responses to each command! That is very important. – Remy Lebeau Feb 02 '12 at 20:49
  • @Vyktor: thanks a lot for your help and concern your answer with the one above yours, I can now make the program. I can now understand the idea of talking to the server. the problem I'm facing now is how to deal with SSL and TLS ( I'm googling that ) – joker Feb 03 '12 at 06:37
  • I will document what I have understood so far so anyone searches for the same topic can find the answer easily. I don't know where to post the previous sentence so as anyone sees this topic, can see the link to the document. – joker Feb 03 '12 at 06:39
4

You should read how to use smtp over telnet. After that you can easily implement it..

duedl0r
  • 9,289
  • 3
  • 30
  • 45
  • I have read the page u linked to. I learned a few things, but it seems to be outdated. I had to search for the "connect menu" and port to open yahoo mail server ( since 25 is entered, the connection fails ) your help is much appreciated – joker Feb 02 '12 at 12:41
0
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)

ddd
  • 1
0

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.

Community
  • 1
  • 1
Remy Lebeau
  • 555,201
  • 31
  • 458
  • 770