Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sending emails using C

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?

like image 408
joker Avatar asked Feb 02 '12 10:02

joker


People also ask

Can we send email using C++?

Send Outlook Emails using C++Create an object of SmtpClient. Set host, username, password, and port number. Set security options. Send email using SmtpClient->Send() method.

What is SMTP in C#?

The standard approach to send an email using C# is SMTP (Simple Mail Transfer Protocol). It is a network protocol used to send emails over the internet.

Can PowerShell send emails?

To send email messages through an SMTP server, you can use the Send-MailMessage PowerShell cmdlet. You can use this built-in cmdlet to send emails in PowerShell version 2.0 and newer (previously you can use the . Net System. Net.Mail class to send emails).


1 Answers

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
like image 195
Vyktor Avatar answered Sep 21 '22 09:09

Vyktor