Sending Email

Posts 1–13 of 13 · Page 1 of 1
Sending Email
I am using the smtp.gmail.com server to send my self an email, but it's not working idk why. Here is my code:

Code:
#include <iostream>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")

int main()
{
	// Initialise Winsock
	WSADATA WsaDat;
	if(WSAStartup(MAKEWORD(2,2),&WsaDat)!=0)
	{
		std::cout<<"Winsock error - Winsock initialization failed\r\n";
		WSACleanup();
		system("PAUSE");
		return 0;
	}
	
	// Create our socket
	SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
	if(Socket==INVALID_SOCKET)
	{
		std::cout<<"Winsock error - Socket creation Failed!\r\n";
		WSACleanup();
		system("PAUSE");
		return 0;
	}

	// Resolve IP address for hostname
	struct hostent *host;
	if((host=gethostbyname("smtp.gmail.com"))==NULL)
	{
		std::cout<<"Failed to resolve hostname.\r\n";
		WSACleanup();
		system("PAUSE");
		return 0;
	}

	// Setup our socket address structure
	SOCKADDR_IN SockAddr;
	SockAddr.sin_port=htons(587);
	SockAddr.sin_family=AF_INET;
	SockAddr.sin_addr.s_addr=*((unsigned long*)host->h_addr);

	// Attempt to connect to server
	if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr))!=0)
	{
		std::cout<<"Failed to establish connection with server\r\n";
		WSACleanup();
		system("PAUSE");
		return 0;
	}

	// Display message from server
	char buffer[1000];
	memset(buffer,0,999);
	int inDataLength=recv(Socket,buffer,1000,0);
	std::cout<<buffer;


	sprintf(buffer, "HELO smtp.gmail.com\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "STARTTLS\r\n");
    send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "MAIL FROM:<****@gmail.com>\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "RCPT TO:<*****@gmail.com>\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "DATA\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "Subject:FIRST EMAIL WITH C++!\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "From: ****@gmail.com\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "To: *****@gmail.com\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "HELLO GOD\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "\r\n. \r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	sprintf(buffer, "QUIT\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	// Shutdown our socket
	shutdown(Socket,SD_SEND);

	// Close our socket entirely
	closesocket(Socket);

	// Cleanup Winsock
	WSACleanup();
	system("PAUSE");
	return 0;
}
@.::SCHiM::.
@Void
@Hell_Demon
@Fovea
Instead of using pragmas why don't you just set up the linker?
Quote Originally Posted by Auxilium View Post
Instead of using pragmas why don't you just set up the linker?
Well, I don't have that many lib files to link to so I just used a pragma.
any ideas why it isn't working?
Come on guys I know somebody knows what's going on. Can somebody please tell me what's wrong with my code?
A part of learning is solving your own problems. I had problems with my game engine that took hours to fix, and In the end I know a lot more, how to do it correctly, and don't need others to help me.
Quote Originally Posted by Auxilium View Post
A part of learning is solving your own problems. I had problems with my game engine that took hours to fix, and In the end I know a lot more, how to do it correctly, and don't need others to help me.
Could not agree with this more. I find I learn a shitload more when my app doesn't work the first time I write it than when everything clicks together nicely (unless it's easy code and I made a stupid mistake lol), stops you leeching.
It's true what vvoid says, you should really learn to debug/fix your own code. And glancing at your code I find nothing out of the ordinary except for the fact that you're not cleaning your buffer. If you don't there may be leftovers from a previous command or from data previously received. If all works as expected and it doesn't work see if your code follows the standards for SMTP (eg. number of commands, how to end a line of data, etc, etc)
Well, I know that the problem isn't with my program code itself it is with the smtp server. When I use the starttls command it says Ready to Start TLS, but then doesn't take any commands after. Trust me, yestarday i went from 8 pm till 1 50 am trying to figure it out. I read RFC 821 and RFC 2821, and still no progress.
Quote Originally Posted by 258456 View Post
Well, I know that the problem isn't with my program code itself it is with the smtp server. When I use the starttls command it says Ready to Start TLS, but then doesn't take any commands after. Trust me, yestarday i went from 8 pm till 1 50 am trying to figure it out. I read RFC 821 and RFC 2821, and still no progress.
That is because after you issue the starttls command the server expects you too preform the tlshandshake

The needed cryptographic functions can be found in wincrypt.h
I am sorry schim, but i read it but I don't understand what commands to send to the server to do this tlshandshake.

Can somebody please help. I understand your guys' point of figuring it out yourself, and normally i do do that, but i don't plan on expanding in this area of programming, I just want to send an email. THAT'S ALL I WANT TO DO. So if somebody can help me please do because i have spent more hours on this than i should have. It shouldn't be this complicated to send an email.

Here is my list of commands i am sending.

Code:
ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "HELO smtp.gmail.com\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "Starttls\r\n");
    send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "MAIL FROM:<***@gmail.com>\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "RCPT TO:<*****@gmail.com>\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "DATA\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "Subject:FIRST EMAIL WITH C++!\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "From: ****@gmail.com\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "To: *****@gmail.com\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "HELLO GOD\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "\r\n. \r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;

	ZeroMemory(&buffer, sizeof(buffer));
	sprintf(buffer, "QUIT\r\n");
	send(Socket, buffer, strlen(buffer), 0);
	recv(Socket, buffer, sizeof(buffer), 0);
	std::cout<<buffer;
After the STARTTLS command I am sure that i need to send something else after it before i say MAIL FROM:<>. I don't know what to do after STARTTLS.
so no one is going to help?
I will just go ask this question on another forum, you guys obviously don't know the answer because it has been days. I am not upset at you guys I am just saying that nobody here knows the answer so I am requesting this thread to be closed. Thank you.
Posts 1–13 of 13 · Page 1 of 1

Post a Reply

Similar Threads

Tags for this Thread

None

Talk with us