I am experimenting with sending email directly from an .exe created by Visual Studio 2010, using C++. I've taken some code originally posted by Andreas Masur (with minor modifications) as a starting point to start learning about this.

When I call the function SendEmail("mail.mydomain.com","targetaddress@mydomain.com","sentfromaddress@mydomain.com","email"), it makes it all the way through the function,and fills m_ErrorLogListBox with: "Sent email as email message to targetaddress@mydomain.com." (In other words, it seems to go through without problems, connecting as needed). When I check my email, however, nothing arrives. My domain host says that I need a user name and password in order to send email (which is reassuring). Unfortunately, I don't know how to modify the code to include these things.

Can anyone give me some pointers on where to go from here? (Specifically, how do I include passwords and so forth...)

Code:
void CTestEmailProgramDlg::Check(int iStatus, char *szFunction)
{
	if((iStatus != SOCKET_ERROR) && (iStatus))
		return;
 
	string text_string(szFunction);
	string error_string("Error during call to " + text_string + ": " + DataManip::itos(iStatus) + " - " + DataManip::itos(GetLastError()));
	m_ErrorLogListBox.AddString(error_string.c_str());
}

bool CTestEmailProgramDlg::SendEmail(char* smtpserver, char* toaddress, char* fromaddress, char* message)
{
	int         iProtocolPort        = 0;
	char        szSmtpServerName[64] = "";
	char        szToAddr[64]         = "";
	char        szFromAddr[64]       = "";
	char        szBuffer[4096]       = "";
	char        szLine[255]          = "";
	char        szMsgLine[255]       = "";
	SOCKET      hServer;
	WSADATA     WSData;
	LPHOSTENT   lpHostEntry;
	LPSERVENT   lpServEntry;
	SOCKADDR_IN SockAddr;

	// Load command-line args
	lstrcpy(szSmtpServerName, smtpserver);
	lstrcpy(szToAddr, toaddress);
	lstrcpy(szFromAddr, fromaddress);

	// Create input stream for reading email message file
	ifstream MsgFile(message);

	// Attempt to intialize WinSock (1.1 or later)
	if(WSAStartup(MAKEWORD(VERSION_MAJOR, VERSION_MINOR), &WSData))
	{
		string error_string = "Cannot find Winsock v" + DataManip::itos(VERSION_MAJOR) + "." + DataManip::itos(VERSION_MINOR) + " or later!\n";
		m_ErrorLogListBox.AddString(error_string.c_str());

		return false;
	}

	// Lookup email server's IP address.
	lpHostEntry = gethostbyname(szSmtpServerName);
	if(!lpHostEntry)
	{
		string servername(szSmtpServerName);
		string error_string = "Cannot find SMTP mail server " + servername + "\n";
		m_ErrorLogListBox.AddString(error_string.c_str());

		return false;
	}

	// Create a TCP/IP socket, no specific protocol
	hServer = socket(PF_INET, SOCK_STREAM, 0);
	if(hServer == INVALID_SOCKET)
	{
		string error_string = "Cannot open mail server socket\n";
		m_ErrorLogListBox.AddString(error_string.c_str());
  
		return false;
	}

	// Get the mail service port
	lpServEntry = getservbyname("mail", 0);

	// Use the SMTP default port if no other port is specified
	if(!lpServEntry)
		iProtocolPort = htons(IPPORT_SMTP);
	else
		iProtocolPort = lpServEntry->s_port;

	// Setup a Socket Address structure
	SockAddr.sin_family = AF_INET;
	SockAddr.sin_port   = iProtocolPort;
	SockAddr.sin_addr   = *((LPIN_ADDR)*lpHostEntry->h_addr_list);

	// Connect the Socket
	if(connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)))
	{
		string error_string = "Error connecting to Server socket\n";
		m_ErrorLogListBox.AddString(error_string.c_str());

		return false;
	}

	// Receive initial response from SMTP server
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() Reply");

	// Send HELO server.com
	sprintf(szMsgLine, "HELO %s%s", szSmtpServerName, CRLF);
	Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() HELO");
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() HELO");

	// Send MAIL FROM: <sender@mydomain.com>
	sprintf(szMsgLine, "MAIL FROM:<%s>%s", szFromAddr, CRLF);
	Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() MAIL FROM");
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() MAIL FROM");

	// Send RCPT TO: <receiver@domain.com>
	sprintf(szMsgLine, "RCPT TO:<%s>%s", szToAddr, CRLF);
	Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() RCPT TO");
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() RCPT TO");

	// Send DATA
	sprintf(szMsgLine, "DATA%s", CRLF);
	Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() DATA");
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() DATA");

	// Send all lines of message body (using supplied text file)
	MsgFile.getline(szLine, sizeof(szLine));             // Get first line

	do         // for each line of message text...
	{
		sprintf(szMsgLine, "%s%s", szLine, CRLF);
		Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() message-line");
		MsgFile.getline(szLine, sizeof(szLine)); // get next line.
	} while(MsgFile.good());

	// Send blank line and a period
	sprintf(szMsgLine, "%s.%s", CRLF, CRLF);
	Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() end-message");
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() end-message");

	// Send QUIT
	sprintf(szMsgLine, "QUIT%s", CRLF);
	Check(send(hServer, szMsgLine, strlen(szMsgLine), 0), "send() QUIT");
	Check(recv(hServer, szBuffer, sizeof(szBuffer), 0), "recv() QUIT");

	// Report message has been sent
	string text_message(message);
	string to_address_string(szToAddr);
	string error_string = "Sent " + text_message + " as email message to " + szToAddr;
	m_ErrorLogListBox.AddString(error_string.c_str());

	// Close server socket and prepare to exit.
	closesocket(hServer);

	WSACleanup();

	return true;
}