Προς το περιεχόμενο

Email με SMTP σε C


nilosgr

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σας γραφω ενα προγραμματακι για να στελνει email με SMTP χρησημοποιώντας sockets (δεν ξερω αν γινεται κι αλλιως :P )

Ενω η συνδεση με το server γινεται κανονικα, κατα το authenticate περνω το εξης error:

"5.7.0 Must issue a STARTTLS command first"

Αυτό γινεται οταν βαζω τα στοιχεια απο το hotmail ή το gmail ή το yahoomail, εάν βαζω απο το otenet mail δουλευει κανονικα. (προφανως επειδη το otenet mail δεν εχει ενεργοποιημενο SSL / TLS)

Μπορει καποιος να με βοηθησει να το κανω να δουλευει και με servers που εχουν ενεργοποιημενο SSL / TLS;

Οι ρυθμησεις για hotmail, gmail, yahoomail, otenet mail.

Ο κώδικας:

>
#include <stdio.h>
#include <tchar.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>

#define HOST		"smtp.live.com"
#define USER		"[email protected]"
#define PASSWORD	"pass"
#define FROM		"[email protected]"
#define TO		"[email protected]"
#define SUBJECT		"junkies"
#define MESSAGE		"take the body"

int _tmain(int argc, _TCHAR* argv[])
{
       int iResult;
       WSADATA wsaData;
       int iProtocolPort;
       char pchMessage[4096]="";
       SOCKET hServer = INVALID_SOCKET;
       LPHOSTENT lpHostEntry;
       LPSERVENT lpServEntry;
       SOCKADDR_IN SockAddr;

       iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
       if (iResult) {
        printf("WSAStartup failed: %d\n", iResult);
       	system("pause");
        return 1;
       }

       if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
               _tprintf(TEXT("Could not find a usable version of Winsock.dll\n"));
               WSACleanup();
        system("pause");
               return 2;
       }
       else
               printf("The Winsock 2.2 dll was found okay\n");

       lpHostEntry=gethostbyname(HOST);
       if(!lpHostEntry) {
        _tprintf(TEXT("gethostbyname failed: %d\n"), WSAGetLastError());
        WSACleanup();
        system("pause");
        return 3;
       }

       hServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
       if (hServer == INVALID_SOCKET) {
        _tprintf(TEXT("socket failed: %d\n"), WSAGetLastError());
        WSACleanup();
       	system("pause");
        return 4;
       }

lpServEntry=getservbyname("mail", NULL);
if(!lpServEntry) {
	_tprintf(TEXT("getservbyname failed: %d\n"), WSAGetLastError());
	iProtocolPort = htons(IPPORT_SMTP);
}
       else {
           iProtocolPort = lpServEntry->s_port;
   	}

       SockAddr.sin_family = AF_INET;
       SockAddr.sin_port = iProtocolPort;
       SockAddr.sin_addr = *((LPIN_ADDR) *lpHostEntry->h_addr_list);

       if (connect(hServer, (PSOCKADDR) &SockAddr, sizeof(SockAddr)) == SOCKET_ERROR) {
	_tprintf(TEXT("connect failed: %d\n"), WSAGetLastError());
	WSACleanup();
	closesocket(hServer);
	system("pause");
	return 5;
}
       iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("connect %s \n", pchMessage);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "ehlo\r\n");
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("ehlo %s %d \n", pchMessage, iResult);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "auth login\r\n");
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("auth %s %d (%d)\n", pchMessage, iResult, 334);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "%s\r\n", USER);
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("user %s %d (%d)\n", pchMessage, iResult, 334);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "%s\r\n", PASSWORD);
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("pass %s %d (%d)\n", pchMessage, iResult, 235);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "mail from:<%s>\r\n", FROM);
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("from %s %d (%d)\n", pchMessage, iResult, 250);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "rcpt to:<%s>\r\n", TO);
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("to %s %d (%d)\n", pchMessage, iResult, 250);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "DATA\r\n");
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("data %s %d (%d)\n", pchMessage, iResult, 250);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "Subject: %s\r\n\r\n%s\r\n.\r\n", SUBJECT, MESSAGE);
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage), 0);
printf("subj/mesg %s %d (%d)\n", pchMessage, iResult, 250);

ZeroMemory(pchMessage, sizeof(pchMessage));
sprintf(pchMessage, "quit\r\n");
send(hServer, pchMessage, strlen(pchMessage), 0);
iResult = recv(hServer, pchMessage, sizeof(pchMessage),0);
printf("quit %s %d (%d)\n", pchMessage, iResult, 250);

closesocket(hServer);
WSACleanup();
system("pause");
return 0;
}

Δημοσ.

Ψαξε msdn μπας και εχει τιποτα για SSL ή πας http://www.openssl.org/ ή δες να το κανεις μεσου http http://msdn.microsof...3(v=vs.85).aspx που εχει SSL

 

Ιδεα δεν εχω για το πως δουλευει το ssl, αλλα για να υπαρχει βιβλιοθηκη δεν θα ειναι και κατι απλο happy.gif

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...