2012-02-02 23 views
9

Acabo de comenzar a aprender acerca de la programación de socket y aprendí acerca de winsock y logré cierto progreso. mi pregunta es básicamente: quiero enviar correos electrónicos, ¿qué debo hacer?Enviando correos electrónicos usando C

puntos que han de mencionarse:

  1. he aprendido sobre la inicialización de Winsock. Puerto SMTP (25). creando y conectando a sockets con éxito. ¡¡¡¿Qué debería hacer ahora?!!! (Estoy atascado aquí)
  2. No quiero un código listo para trabajar. Yo quiero aprender. Por lo tanto, se necesitan recomendaciones sobre libros, documentaciones, tutoriales o artículos.
  3. Sé que C no sabe nada sobre la creación de redes, ¿eso significa que tengo que descargar algunas bibliotecas? (Estoy usando VS2010, Windows 7)

Aquí están los enlaces a páginas que he leído hasta ahora:

guía Winsock básica: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx

He leído las primeras 14 páginas de guía beej (no se puede enviar el enlace, los nuevos usuarios sólo pueden enviar un máximo de dos hipervínculos)

que han aprendido acerca de los tipos (WSADATA, addrinfo structure, sockaddr, SOCKET) y funciones (WSAStartup(), WSACleanup(), getaddrinfo(), Shutdown(), WSAGetLastError(), socket(), ...)

y acabo de comenzar a leer este artículo sobre SMTPhttp://www.faqs.org/rfcs/rfc821.html

aquí es lo que he escrito hasta ahora:

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

am ¿por supuesto?

+0

te recomiendo leer el excelente libro de Stevens "TCP/IP Illustrated", y también su "avanzada Programación en el entorno Unix ". Sí, sé que dice Unix, pero en realidad es un libro excelente y 'winsock' es básicamente una implementación de la API de socket BSD. – cha0site

Respuesta

3

Usted debe echar un vistazo a some examples on smtp via telnet :)

Básicamente tiene que introducir en el texto en claro algo como esto:

HELO local.domain.name 
MAIL FROM: [email protected] 
RCPT TO: [email protected] 
DATA 
... 

EDITAR acuerdo con this example, el código debe ser:

// Not sure about this one, maybe just "\n" 
#define SEPARATOR "\n\r" 

int sendData(Socket *socket, const char *data) { 
    int iResult; 
    iResult = send(socket, data, (int) strlen(data), 0); 
    if(iResult == SOCKET_ERROR){ 
     // Do error handling as you like 
    } 
    return iResult; 
} 

sendData(socket, "HELO local.doman.name" SEPARATOR); 
sendData(socket, "MAIL FROM: [email protected]" SEPARATOR); 
sendData(socket, "RCPT TO: [email protected]" SEPARATOR); 
sendData(socket, "DATA" SEPARATOR); 
sendData(socket, "This is subject of my mail" SEPARATOR SEPARATOR); 
sendData(socket, "And this is text" SEPARATOR); 
sendData(socket, "." SEPARATOR); // Send mail 
+0

Atropellé algo así, ¿pero no pude entender qué hacer con eso? Me refiero a dónde poner este texto? ¿y por qué? ¿Qué significa "HELO" (creo que decir hola al servidor)? – joker

+0

@joker ponlo en telnet: http://en.wikipedia.org/wiki/Telnet incluso hay un programa para eso en windows llamado igual. – Flavius

+0

@joker: 'En el comando HELO, el host que envía el comando identifica ; el comando se puede interpretar como diciendo "Hola, soy " ' – cha0site

4

Debería leer cómo usar smtp en telnet. Después de que se puede implementar fácilmente ..

+0

gracias, comenzó a leerlo ahora mismo. Espero que ayude – joker

+0

He leído la página a la que está vinculado. Aprendí algunas cosas, pero parece estar desactualizado. Tuve que buscar el "menú de conexión" y el puerto para abrir el servidor de correo yahoo (ya que se ingresó 25, la conexión falla) tu ayuda es muy apreciada – joker

2

Te recomendaría este artículo:

SMTP Client - CodeProject

Se puede compilar en Linux y Windows también.

+0

+1 puedes escribir tu propio cliente SMTP, pero definitivamente es más fácil de usar uno de los muchos que se pueden encontrar en Interwebs. – JeremyP

+0

También puede verificar el código fuente de clientes de correo de código abierto como sendmail. – rkosegi

+0

+1, por una parte valiosa de la información :-) –

0

RFC 5321 es la especificación oficial para el protocolo SMTP básico.

RFC 2822 es la especificación oficial para el formato de correo electrónico básico.

Tenga en cuenta que hay MUCHAS RFC adicionales que extienden las reglas básicas. Por ejemplo, RFC 1651 extiende SMTP para que luego se puedan implementar características adicionales, como la autenticación segura a través del AUTH extension. Y MIME (RFC 2045, 2046, 2047, 2048 y 2049) se utiliza comúnmente en los sistemas de correo electrónico modernos para permitir archivos adjuntos, HTML/RTF, etc.

Ir a IETF's website para ver todas las características disponibles RFC utilizados por la mayoría de los protocolos Interpet .

0
bytes_to_receive = sizeof(packet) 

received_bytes = 0; do { received_bytes + = recv (tampón + received_bytes, bytes_to_receive - received_bytes) } while (received_bytes = bytes_to_receive!)

+0

¿Podría elaborar más su respuesta agregando un poco más de descripción acerca de la solución que proporciona? – abarisone

Cuestiones relacionadas