Суббота
28.06.2025, 11:54
C++ Soft
Приветствую Вас Гость | RSS
Главная Каталог статей Регистрация Вход
Меню сайта

Категории каталога
Windows API [25]
Каталог Windows API функций
Функции конвер. [3]
Функции конвертирования типов данных
Работа с сетью [3]
Недокументированные способы работы с сетью
Другие статьи... [8]
Недокументированные способы программирования

Наш опрос
Оцените мой сайт
Всего ответов: 35

Главная » Статьи » Visual C++ Win32 » Работа с сетью

Отправка электронных писем.
Пример отправки электронного письма с авторизацией на сервере.
На данный момент все почтовые в сервера при отправке электронного письма требуют авторизацию. Это сделано в целях не распространения СПАМа.
  1. С начало создается проект, к которому подключим библиотеку wsock32.lib.
  2. После создания проекта можно приступать за программный код.
Code
#include "stdafx.h"
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

WSADATA ws;
DWORD SendMail (char *chSMTPServer, char *chPOPServer, char *chLogin, char *chPass, char *chFrom, char *chTo, char *chSUBJ, char *chTEXT);
BOOL ConnectWSA_MY (char *chServer, int nPort, sockaddr_in *sockaddr, SOCKET sock);
int main()
{
    // инициализируем сокеты
    if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws)))
    {
        printf("Error in WSAStartup(...)\n");
        return 1;
    }
    SendMail ("smtp.mail.ru", "pop.mail.ru",
              "login_from", "pass", "login_from@mail.ru", "login_to@mail.ru", "Заголовок....", "Сам текст...");
    return 1;
}
DWORD SendMail (char *chSMTPServer, char *chPOPServer, char *chLogin, char *chPass, char *chFrom, char *chTo, char *chSUBJ, char *chTEXT)
{
    struct sockaddr_in addr;
    hostent *d_addr;
    char text [1024];
    // создаем сокет
    SOCKET sSMTP = socket (AF_INET, SOCK_STREAM, 0);
    if (sSMTP == INVALID_SOCKET)
    {
        return -1;
    }

    // получаем адрес сервера
    d_addr = gethostbyname (chSMTPServer);
    if (d_addr == NULL)
    {
        return -2;
    };

    // заполняем параметры адреса
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);
    addr.sin_port = htons (25);

    // устанавливаем соединение
    if (SOCKET_ERROR == (connect (sSMTP, (sockaddr *) &addr, sizeof (addr))))
    {
        return -3;
    }

    SOCKET nPOPServerSocket = socket(PF_INET, SOCK_STREAM, 0);
    struct sockaddr_in smtp_address;
    if (ConnectWSA_MY (chPOPServer, 110, &smtp_address, nPOPServerSocket) < 1)
        return -4;

    char chT [1024], sBuf [1024];

    int iLength = recv(nPOPServerSocket, (LPSTR)sBuf, sizeof(sBuf), 0);

    sprintf (chT, "USER %s\r\n", chLogin);
    send(nPOPServerSocket, (LPSTR)chT, strlen(chT), 0);
    recv(nPOPServerSocket, (LPSTR)sBuf, sizeof(sBuf), 0);

    sprintf (chT, "PASS %s\r\n", chPass);
    send(nPOPServerSocket, (LPSTR)chT, strlen(chT), 0);
    recv(nPOPServerSocket, (LPSTR)sBuf, sizeof(sBuf), 0);

    // ждем ответ от сервера
    recv(sSMTP, text, sizeof(text), 0);

    // приветствуем сервер
    sprintf(text,"HELO %s\r\n", chSMTPServer);
    send(sSMTP, text, strlen(text), 0);

    // ждем подтверждение от сервера
    recv(sSMTP,text,sizeof(text),0);

    // начинаем отправлять конверт состоящий из полей
    // MAIL FROM: и RCPT TO: После каждого поля ждем
    // подтверждение

    // сообщаем отправителя
    sprintf(text, "MAIL FROM: %s\r\n", chFrom);

    send(sSMTP, text, strlen(text), 0);

    // ждем подтверждение от сервера
    recv(sSMTP, text, sizeof(text), 0);

    // сообщаем получателя
    sprintf(text,"RCPT TO: %s\r\n", chTo);
    send(sSMTP, text, strlen(text), 0);

    // ждем подтверждение от сервера
    recv(sSMTP, text, sizeof(text), 0);

    // подаем команду, что готовы начать передачу письма
    strcpy(text,"DATA\r\n");
    send(sSMTP, text, strlen(text),0);

    // ждем подтверждение от сервера
    recv(sSMTP, text, sizeof(text), 0);

    // передаем заголовок

    // от кого письмо
    sprintf(text,"FROM: %s\r\n", chFrom);
    send(sSMTP, text, strlen(text), 0);

    // кому письмо
    sprintf(text, "TO: %s\r\n", chTo);
    send(sSMTP, text, strlen(text), 0);

    // тема письма
    sprintf(text, "SUBJECT: %s\r\n", chSUBJ);
    send(sSMTP, text, strlen(text),0);

    // текст письма
    send(sSMTP, chTEXT, strlen(chTEXT), 0);

    // говорим, что закончили
    strcpy(text, "\r\n.\r\n");
    send(sSMTP, text, strlen(text), 0);
    recv(sSMTP, text, sizeof(text), 0);

    // прощаемся с сервером
    strcpy(text, "QUIT");
    send(sSMTP, text, strlen(text), 0);

    // закрываем сокет
    closesocket(sSMTP);
   
    send(nPOPServerSocket, text, strlen(text), 0);
    closesocket (nPOPServerSocket);
    return 1;
}
BOOL ConnectWSA_MY (char *chServer, int nPort, sockaddr_in *sockaddr, SOCKET sock)
{
    sockaddr->sin_family = AF_INET;
    sockaddr->sin_addr.s_addr = inet_addr(chServer);
    sockaddr->sin_port = htons(nPort);

    struct hostent *host = NULL;
    if (sockaddr->sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(chServer);
        if (host == NULL)
        {
            return -2;
        }
        CopyMemory(&sockaddr->sin_addr, host->h_addr_list[0], host->h_length);
    }

    int nConnect = connect(sock, (PSOCKADDR)sockaddr, sizeof(sockaddr_in));
    return nConnect + 1;
}
Категория: Работа с сетью | Добавил: Admin (25.01.2009)
Просмотров: 3394 | Комментарии: 4 | Рейтинг: 2.7/3 |
Всего комментариев: 2
2 Сергей  
0
Не знаю, у кого получилось таким образом отправить сообщение на почтовый сервер mail.ru, я сколько не пытался ничего не вышло. Получилось только после авторизации через ESMTP:

sendString.Format("EHLO smtp.mail.ru\r\n");
int size = send(smtpSock,sendString.GetBuffer(),sendString.GetLength(),0);
size = recv(smtpSock,buff,10000,0);
sendString.Format("AUTH LOGIN\r\n");
size = send(smtpSock,sendString.GetBuffer(),sendString.GetLength(),0);
size = recv(smtpSock,buff,10000,0);//код ответа должен = 334
sendString.Format("l52VyEmVkc3M=\r\n");//логин в base64
size = send(smtpSock,sendString.GetBuffer(),sendString.GetLength(),0);
size = recv(smtpSock,buff,10000,0);//код ответа должен = 334
sendString.Format("l52VxЕmVPc3M=\r\n");//пароль в base64
size = send(smtpSock,sendString.GetBuffer(),sendString.GetLength(),0);
size = recv(smtpSock,buff,10000,0);
Только после этого идет текст письма со всеми MAIL FROM:, RCPT TO: и т.д.
P.S. код приведен отрывками без обработок кодов ошибок сервера


1 Татьяна Красавина  
0
Главному бухгалтеру
заявление.

Мною, Красавиной Т.Б. ошибочно была переведена сумма в размере 6000 т.р. на р.с. оплаты страховки. Прошу перевести эту сумму на р.с.: 40817810530000208384.

10.06.2010 г. Красавина.

Имя *:
Email *:
Код *:
Форма входа

Поиск

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Copyright MyCorp © 2025
Сайт управляется системой uCoz