Envoyer des emails en utilisant C
J'ai juste commencé à apprendre à propos programmation socket et appris à propos de winsock et réalisé certains progrès. ma question est en gros: je veux envoyer des e-mails, que dois-je faire?
points à mentionner:
- J'ai appris à propos de l'initialisation de winsock. Port SMTP (25). la création et la connexion des sockets avec succès. Que dois-je faire maintenant?!!! (Je suis coincé ici)
- Je ne veux pas d'un prêt au travail code. Je veux apprendre. Donc, tous les livres, de la documentation, des tutoriels ou des articles, des recommandations sont nécessaires.
- Je sais que C lui-même ne sait rien sur la mise en réseau, est-ce que je dois télécharger un certain nombre de bibliothèques? (Je suis à l'aide de VS2010, Windows 7)
Voici les liens vers les pages que j'ai lu jusqu'à présent:
de base winsock guide: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs. 85).aspx
J'ai lu les 14 pages de beej guide (ne peux pas poster le lien, les nouveaux utilisateurs ne pouvez envoyer un maximum de deux hyperliens)
J'ai appris sur les types ( WSADATA
addrinfo structure
sockaddr
SOCKET
) et de fonctions ( WSAStartup()
WSACleanup()
getaddrinfo()
Shutdown()
WSAGetLastError()
socket()
... )
et je viens de commencer la lecture de cet article sur SMTP
http://www.faqs.org/rfcs/rfc821.html
voici ce que j'ai écrit jusqu'à maintenant:
#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;
}
suis-je bien entendu?
source d'informationauteur joker
Vous devez vous connecter pour publier un commentaire.
Vous devriez jeter un oeil à quelques exemples sur smtp via telnet 🙂
Fondamentalement, vous avez besoin pour la saisie de texte en clair, quelque chose comme ceci:
MODIFIER selon cet exemplevotre code doit être:
Vous devriez lire comment utiliser smtp sur telnet. Après cela, vous pouvez facilement mettre en œuvre..
Je vous recommande cet article :
Client SMTP - CodeProject
Vous pouvez le compiler sous linux et Windows aussi.
RFC 5321 est la spécification officielle pour la base du protocole SMTP.
RFC 2822 est la spécification officielle pour le format d'e-mail.
Être conscient qu'il ya BEAUCOUP d'autres Rfc qui étendent les règles de base. Par exemple, RFC 1651 s'étend SMTP donc des fonctionnalités supplémentaires peuvent alors être mises en œuvre, telles que la sécurisation de l'authentification via le AUTH extension. Et MIME (Rfc Deux mille quarante cinqDeux mille quarante sixDeux mille quarante septDeux mille quarante huitet Deux mille quarante neuf) est couramment utilisé dans les modernes systèmes de courrier électronique pour les pièces jointes permettant, HTML/RTF, etc.
Aller à Le site web de l'IETF pour voir les spécifications RFC utilisé par la plupart des Interpet protocoles.
received_bytes = 0;
do {
received_bytes += recv(tampon + received_bytes, bytes_to_receive - received_bytes)
} while (received_bytes != bytes_to_receive)