10
votes

Envoi de courriels en utilisant c

Je viens de commencer à apprendre à propos de la programmation de socket et appris sur Winsock et a réalisé des progrès. Ma question est fondamentalement: je veux envoyer des courriels, que dois-je faire?

points à mentionner: p>

  1. J'ai appris à l'initialisation de Winsock. Port SMTP (25). créer et se connecter aux sockets avec succès. Qu'est-ce que je devrais faire maintenant?!!! (Je suis coincé ici) Li>
  2. Je ne veux pas de code prêt-à-jour. Je veux apprendre. Donc, tous les livres, documentaires, tutoriels ou recommandations d'articles sont nécessaires. LI>
  3. Je sais que c elle-même ne connaît rien sur la mise en réseau, cela signifie-t-il que je dois télécharger certaines bibliothèques? (J'utilise VS2010, Windows 7) LI> ol>

    Voici les liens vers des pages que j'ai lues jusqu'à présent: p>

    Guide Winsock de base: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629 (v = vs.85) .aspx p>

    J'ai lu les 14 premières pages du Guide Beej (ne peut pas publier le lien, de nouveaux utilisateurs ne peuvent que publier un maximum de deux hyperliens) P>

    i ont appris sur les types ( wsadata ​​code>, Structure addrinfo code>, sockaddr code>, socket code>) et fonctions ( wsastartup () code>, wsacleanup () code>, gettaddrinfo () code>, fermeture () code>, wsagetlasterror () code> , socket () code>, ...) p>

    et je viens de commencer à lire cet article sur smtp code> http://www.faqs.org/rfcs/rfc821.html p>

    Voici ce que j'ai écrit jusqu'à présent : P>

    #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;
    }
    


1 commentaires

Je vous recommanderais de lire l'excellent livre "TCP / IP illustré" de Stevens, ainsi que sa "programmation avancée dans l'environnement UNIX". Oui, je sais que cela dit Unix, mais c'est vraiment un excellent livre et winsock est essentiellement une implémentation de l'API de socket BSD.


5 Réponses :


5
votes

Vous devez consulter Quelques exemples sur SMTP via Telnet :)

Fondamentalement, vous devez entrer dans un autre élément comme celui-ci: xxx

modifier selon Cet exemple , votre code doit être: xxx


6 commentaires

J'ai passé quelque chose comme ça, mais je ne pouvais pas comprendre quoi faire avec ça? Je veux dire où mettre ce texte? et pourquoi? Que signifie "Helo" (je pense dire bonjour au serveur)?


@joker le mettre dans telnet: en.wikipedia.org/wiki/telnet Il y a même un programme pour cela dans Windows nommé identique.


@joker: 'Dans la commande Helo, l'hôte Envoi de la commande s'identifie; La commande peut être interprétée comme indiquant "Bonjour, je suis " '


N'oubliez pas de lire et de traiter les réponses du serveur à chaque commande! C'est très important.


@Vyktor: Merci beaucoup pour votre aide et préoccupez votre réponse avec celle ci-dessus, je peux maintenant faire le programme. Je peux maintenant comprendre l'idée de parler au serveur. Le problème que je suis confronté est de savoir comment traiter avec SSL et TLS (je vais googler cela)


Je vais documenter ce que j'ai compris jusqu'à présent afin que toute recherche du même sujet puisse trouver la réponse facilement. Je ne sais pas où poster la phrase précédente afin que quiconque voit ce sujet, peut voir le lien vers le document.




2
votes

Je vous recommanderais cet article:

Client SMTP - CodeProject

Vous pouvez également le compiler sous Linux et Windows.


2 commentaires

+1 Vous pouvez écrire votre propre client SMTP, mais il est certainement plus facile d'utiliser l'un des nombreux pouvant être trouvés sur les interwebs.


Vous pouvez également vérifier le code source des clients de messagerie open source tels que Sendmail.



0
votes

RFC 5321 est la spécification officielle du protocole SMTP de base.

RFC 2822 est la spécification officielle du format de courrier électronique de base.

Sachez qu'il existe de nombreux RFC supplémentaires qui étendent les règles de base. Par exemple, RFC 1651 prolonge SMTP de sorte que des fonctionnalités supplémentaires peuvent ensuite être implémentées, telles que l'authentification sécurisée via la extension d'authentification . Et mime (rfcs 2045 , 2046 , 2047 , 2048 et 2049 ) est couramment utilisé dans les systèmes de messagerie modernes pour permettre des pièces jointes, HTML / RTF, etc.

aller à site Web de l'IETF pour voir toutes les spécifications RFC disponibles utilisées par la plupart des protocoles d'InterPet.


0 commentaires

0
votes
bytes_to_receive = sizeof(packet)
received_bytes = 0;
do {
    received_bytes += recv(buffer + received_bytes, bytes_to_receive - received_bytes)
} while (received_bytes != bytes_to_receive)

1 commentaires

Pourriez-vous élaborer davantage votre réponse en ajoutant un peu plus de description sur la solution que vous fournissez?