Отправка писем с помощью C - PullRequest
       61

Отправка писем с помощью C

10 голосов
/ 02 февраля 2012

Я только начал изучать программирование сокетов, узнал о winsock и достиг некоторого прогресса. мой вопрос в основном: я хочу отправлять электронные письма, что мне делать?

баллов:

  1. Я узнал об инициализации winsock. Порт SMTP (25). создание и подключение к сокетам успешно. Что мне теперь делать?!!! (Я застрял здесь)
  2. Я не хочу готовый к работе код. Я хочу учиться. Таким образом, любые книги, документация, учебники или рекомендации статей необходимы.
  3. Я знаю, что сам C ничего не знает о сети, значит ли это, что мне нужно скачать некоторые библиотеки? (Я использую VS2010, Windows 7)

Вот ссылки на страницы, которые я прочитал:

Базовая направляющая WinSock: http://msdn.microsoft.com/en-us/library/windows/desktop/ms737629(v=vs.85).aspx

Я прочитал первые 14 страниц из руководства beej (не может опубликовать ссылку, новые пользователи могут разместить не более двух гиперссылок)

Я узнал о типах (WSADATA, addrinfo structure, sockaddr, SOCKET) и функциях (WSAStartup(), WSACleanup(), getaddrinfo(), Shutdown(), WSAGetLastError(), socket(), ...)

и я только начал читать эту статью о SMTP http://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;
}

я с курса?

Ответы [ 5 ]

4 голосов
/ 02 февраля 2012

Вы должны прочитать, как использовать SMTP над telnet .После этого вы можете легко реализовать это ..

4 голосов
/ 02 февраля 2012

Вы должны взглянуть на некоторые примеры по SMTP через telnet :)

В основном вам нужно ввести в текстовом виде что-то вроде этого:

HELO local.domain.name 
MAIL FROM: mail@domain.ext
RCPT TO: mail@otherdomain.ext
DATA
...

РЕДАКТИРОВАТЬ согласно этому примеру , ваш код должен быть:

// 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: mail@domain.ext" SEPARATOR);
sendData( socket, "RCPT TO: mail@otherdomain.ext" 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
2 голосов
/ 02 февраля 2012

Я бы порекомендовал вам эту статью:

SMTP-клиент - CodeProject

Вы также можете скомпилировать его под Linux и Windows.

0 голосов
/ 24 марта 2015
bytes_to_receive = sizeof(packet)

receive_bytes = 0; делать { полученный_байт + = recv (буфер + полученный_байт, bytes_to_receive - полученный_байт) } while (receive_bytes! = bytes_to_receive)

0 голосов
/ 03 февраля 2012

RFC 5321 является официальной спецификацией для базового протокола SMTP.

RFC 2822 является официальной спецификацией для базового формата электронной почты.

Имейте в виду, что существует множество дополнительных RFC, которые расширяют основные правила.Например, RFC 1651 расширяет SMTP, поэтому могут быть реализованы дополнительные функции, такие как безопасная аутентификация через расширение AUTH .И MIME (RFC 2045 , 2046 , 2047 , 2048 и 2049 ) обычно используются в современныхсистемы электронной почты для разрешения вложений, HTML / RTF и т. д.

Перейдите на веб-сайт IETF , чтобы увидеть все доступные спецификации RFC, используемые большинством протоколов Interpet.

...