सी

2012-02-02 7 views
9

का उपयोग कर ईमेल भेजना मैंने अभी सॉकेट प्रोग्रामिंग के बारे में सीखना शुरू कर दिया है और जीत के बारे में सीखा है और कुछ प्रगति हासिल की है। मेरा सवाल मूल रूप से है: मैं ईमेल भेजना चाहता हूं, मुझे क्या करना चाहिए?सी

अंक उल्लेख किया जाना:

  1. मैं विनसॉक आरंभ के बारे में सीखा। एसएमटीपी पोर्ट (25)। सॉकेट को सफलतापूर्वक बनाना और कनेक्ट करना। अब मुझे क्या करना चाहिए?!!! (मैं यहां फंस गया हूं)
  2. मैं एक काम के लिए तैयार कोड नहीं चाहता। मैं सीखना चाहता हूँ। इसलिए, किसी भी किताबें, दस्तावेज, ट्यूटोरियल या लेख सिफारिशों की आवश्यकता है।
  3. मुझे पता है कि सी स्वयं नेटवर्किंग के बारे में कुछ नहीं जानता है, इसका मतलब है कि मुझे कुछ पुस्तकालयों को डाउनलोड करना है? (मैं VS2010 उपयोग कर रहा हूँ, विंडोज 7)

यहाँ मैं अब तक पढ़ा है पृष्ठों के लिंक हैं:

बुनियादी विनसॉक गाइड: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx

मैं बीज गाइड से पहले 14 पृष्ठों पढ़ा है (लिंक पोस्ट नहीं कर सकते, नए उपयोगकर्ताओं को केवल दो हाइपरलिंक की एक अधिकतम पोस्ट कर सकते हैं)

मैं प्रकार (WSADATA, addrinfo structure, sockaddr, SOCKET) और कार्य (WSAStartup(),के बारे में सीखा है, getaddrinfo(), Shutdown(), WSAGetLastError(), socket(), ...)

और मैं सिर्फ इस लेख के बारे SMTPhttp://www.faqs.org/rfcs/rfc821.html

यहाँ

पढ़ने शुरू कर दिया है मैं अब तक क्या लिखा है:

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

बजे मैं अनिच्छित कार्य होना?

+0

मैं था पढ़ने स्टीवंस के उत्कृष्ट "टीसीपी/आईपी इलस्ट्रेटेड" पुस्तक की सलाह देते हैं, और यह भी उसकी "उन्नत यूनिक्स पर्यावरण में प्रोग्रामिंग "। हां, मुझे पता है कि यह यूनिक्स कहता है, लेकिन यह वास्तव में एक उत्कृष्ट पुस्तक है और 'विंसॉक' मूल रूप से बीएसडी सॉकेट एपीआई का कार्यान्वयन है। – cha0site

उत्तर

3

आप some examples on smtp via telnet :)

पर एक नज़र रखना चाहिए मूल रूप से आप इस तरह प्लेन कुछ में डालने होंगे:

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

संपादितthis example के अनुसार, अपने कोड होना चाहिए:

// 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

मैंने इस तरह कुछ खत्म किया, लेकिन समझ में नहीं आया कि इसके साथ क्या करना है? मेरा मतलब है कि यह पाठ कहां रखना है? और क्यों? "हेलो" का क्या अर्थ है (मुझे लगता है कि सर्वर पर हैलो कह रहा है)? – joker

+0

@joker इसे टेलनेट में डालता है: http://en.wikipedia.org/wiki/Telnet इसके लिए एक प्रोग्राम भी है जिसका नाम विंडोज़ में है। – Flavius

+0

@joker: 'HELO कमांड में कमांड भेजने वाला होस्ट स्वयं को पहचानता है; कमांड को "हैलो, मैं " – cha0site

4

आपको telnet पर smtp का उपयोग करने के तरीके को पढ़ना चाहिए। उसके बाद आप आसानी से इसे लागू कर सकते हैं ..

+0

धन्यवाद, अभी इसे पढ़ना शुरू कर दिया। मुझे आशा है कि – joker

+0

में मदद मिलेगी मैंने आपके द्वारा लिंक किए गए पृष्ठ को पढ़ लिया है। मैंने कुछ चीजें सीखी, लेकिन ऐसा लगता है कि पुराना लगता है। मुझे याहू मेल सर्वर खोलने के लिए "कनेक्ट मेन्यू" और पोर्ट खोजना था (25 दर्ज होने के बाद, कनेक्शन विफल हो जाता है) आपकी मदद की बहुत सराहना की जाती है – joker

2

मैं आप इस लेख की सिफारिश करेंगे:

SMTP Client - CodeProject

आप लिनक्स और विंडोज भी के तहत यह संकलन कर सकते हैं।

+0

+1 आप अपना स्वयं का एसएमटीपी क्लाइंट लिख सकते हैं, लेकिन यह उपयोग करना निश्चित रूप से आसान है Interwebs पर पाया जा सकता है कि कई में से एक। – JeremyP

+0

इसके अलावा आप sendmail जैसे ओपन सोर्स मेल क्लाइंट के स्रोत कोड देख सकते हैं। – rkosegi

+0

+1, जानकारी के एक मूल्यवान भाग के लिए :-) –

0

RFC 5321 मूल SMTP प्रोटोकॉल के लिए आधिकारिक विनिर्देशन है।

RFC 2822 मूल ईमेल प्रारूप के लिए आधिकारिक विनिर्देश है।

ध्यान रखें कि कई अतिरिक्त आरएफसी हैं जो बुनियादी नियमों का विस्तार करते हैं। उदाहरण के लिए, RFC 1651 एसएमटीपी बढ़ाता है इसलिए अतिरिक्त सुविधाओं को लागू किया जा सकता है, जैसे AUTH extension के माध्यम से सुरक्षित प्रमाणीकरण। और माइम (RFC के 2045, 2046, 2047, 2048, और 2049) सामान्यतः आधुनिक ईमेल सिस्टम में अनुमति देता है संलग्नक, HTML/आरटीएफ के लिए, आदि

जाओ IETF's website लिए किया जाता है सबसे दर्शाने प्रोटोकॉल द्वारा इस्तेमाल किया सभी उपलब्ध आरएफसी चश्मा देखने के लिए ।

0
bytes_to_receive = sizeof(packet) 

प्राप्त_bytes = 0; करना { received_bytes + = recv (बफर + received_bytes, bytes_to_receive - received_bytes) } जबकि (received_bytes = bytes_to_receive!)

+0

क्या आप अपने उत्तर को आपके द्वारा प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़ सकते हैं? – abarisone