C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Отсылка писем / E-mail / Сеть

          Отсылка писем

          Здравствуйте, сегодня мы напишем обычную программу для отсылки всего лишь 1 письма. Эта штука вам пригодится в следующих случаях:
- При написании трояна, чтоб он вам присылал IP и всякую инфу о жертве
- Для отсылки всяких логов и отчетов по работе какой-либо вашей программы :-)
- Для массовой рассылки писем нехорошей корреспонденции (на любителя), но не советую.
Вы познакомитесь с SMTP протоколом и поймете его недоработки. Пожалуй начнем, создадим приложение MFC, но только для удобства работы с текстовыми окнами, кнопками, а весь код будет без использования различных классов и ActiveX'ов. Вообще как можно реже используйте фенечки MFC, они сделаны для ламеров, из-за всего этого прога разбухает и к тому же используя классы вы сами лично не поймете как все работает. Классы закрывают нам глаза на мир =). Но, естественно, можете их использовать при острой необходимости. Значит делаем Dialog Based. Окно моей проги выглядит так:

          Присваиваем по очереди переменные типа Value всем текстовым окнам.

CString m_server;
CString m_mailsend;
CString m_mailrecv;
CString m_message;

          Далее добавляем на самый верх cpp файла следующее: #include “winsock2.h“ и в *.h файл: #pragma comment(lib,“wsock32“) Это необходимо для работы с сокетами. Теперь перед нами стоят 5 основных задач:
1) Инициализировать сокет
2) Заполнить структуру sockaddr_in
3) Сформировать тело письма
4) Отослать
5) Проверить почту =)
Итак, по-порядку, создаем кнопку и пишем весь нижеследующий код в нее. 1) Инициализация сокета

UpdateData(true);
///Инициализация сокета
WSADATA wsaData;
if(WSAStartup(MAKEWORD(2,2), &wsaData))
{
MessageBox(“Сокет НЕ инициализировался“, “Беспонт“, MB_ICONINFORMATION);
WSACleanup();
}

          2) Заполнить структуру sockaddr_in Объявляем переменную типа SOCKET

SOCKET SMTPSocket;
SMTPSocket = socket(PF_INET, SOCK_STREAM, 0);

          Забираем имя почтового сервера и узнаем его IP

HOSTENT *host;
host=gethostbyname(m_server);

          Объявляем переменную smtp_address типа “структура“. В ней указываем, что работаем с инетом :). Пишем IP почтового сервера и 25 порт (порт SMTP по умолчанию)

struct sockaddr_in smtp_address;
smtp_address.sin_family = AF_INET;
smtp_address.sin_addr.s_addr = (((in_addr*)host->h_addr)->s_addr);
smtp_address.sin_port = htons(25);

          3) Сформировать тело письма

А теперь подкрались к самому главному. Вот тут я долго парился перебирая какую извилину напрячь в мозгах. Перепахал различные статьи с разных сайтов и в итоге придумал свой универсальный способ отправки, который будет работать и в MFC и в Win32 Application. И не важно откуда берутся имена сервера и емайлы получателей и отправителей. Будь-то в коде или в текстовых окнах. Вообщем, объясняю, как отсылается письмо. Мы отсылаем команду SMTP серверу и получаем ответ, затем еще раз отсылаем и еще раз получаем и так 6 раз. Далее поймете. Значит, я формирую буфер в котором будет находится тело письма, элементы которого разделены NULL'ом для удобства. Может способ вам покажется сложноватым, но зато самым правильным, итак, код с комментариями:

char BufMsg[4096]; //Главный буфер, рамер можете увеличить
char BufRecv[4096]; //Буфер, в который будут помещаться ответы с сервера
memset(BufMsg,0,sizeof(BufMsg));//Обнулить буферы после создания - хороший тон
memset(BufRecv,0,sizeof(BufRecv));
char *pBufMsg=BufMsg;
char *r=BufMsg; // Создаем 2 указателя, далее поймете зачем два.

          Итак, запихиваем =) первую инфу. С сервером надо поздороваться.

strcpy(pBufMsg,“HELO mail.ru “);
BufMsg[strlen(pBufMsg)]=0;
pBufMsg=pBufMsg+lstrlen(pBufMsg)+1;

          Заметьте, после текста мы ставим ноль для разделения и сдвигаем указатель вперед чтобы поставить следующий кусок текста и так будет далее.

//Указываем адрес отправителя
strcpy(pBufMsg,“MAIL FROM:<“);
strcat(pBufMsg,m_mailsend);
strcat(pBufMsg,“> “);

BufMsg[pBufMsg+lstrlen(pBufMsg)-r]=0;
pBufMsg=pBufMsg+lstrlen(pBufMsg)+1;

//Указываем адрес получателя
strcpy(pBufMsg,“RCPT TO:<“);
strcat(pBufMsg,m_mailrecv);
strcat(pBufMsg,“> “);

BufMsg[lstrlen(pBufMsg)+pBufMsg-r]=0;
pBufMsg=pBufMsg+lstrlen(pBufMsg)+1;

//Теперь пойдут данные
strcpy(pBufMsg,“DATA “);

BufMsg[lstrlen(pBufMsg)+pBufMsg-r]=0;
pBufMsg=pBufMsg+lstrlen(pBufMsg)+1;

strcpy(pBufMsg,“Subject: =?Windows-1251?Q?“);
strcat(pBufMsg,m_tema);
strcat(pBufMsg,“?= “);
strcat(pBufMsg,m_message);
strcat(pBufMsg,“ . “);

BufMsg[lstrlen(pBufMsg)+pBufMsg-r]=0;
pBufMsg=pBufMsg+lstrlen(pBufMsg)+1;

//Прощай сервер!
strcpy(pBufMsg,“QUIT “);

          Итак тело письма сформировано, осталось отослать, что мы и делаем:


if(SMTPSocket != INVALID_SOCKET)
{
int nConnect = connect(SMTPSocket, (PSOCKADDR)&smtp_address,sizeof(smtp_address));

if(nConnect)
{
}
else
{
int i=0;
while(i<6)
{
if(send(SMTPSocket,r,lstrlen(r),NULL))
{
recv(SMTPSocket,BufRecv,100,NULL);
r=r+lstrlen(r)+1;
i++;
}
}
}
}

          Сначала проверяем удачно ли создан сокет. Коннектимся к серверу. Если все удачно, то отсылаем 6 кусочков тела письма с паузой на получения ответа от сервера и сдвига указателя, чтоб отсылать новую инфу а не ту же самую :-) И затем, не забываем закрыть за собой двери и подмести =)

closesocket(SMTPSocket);
WSACleanup();