Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

smtp

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Веб-программинг] >> smtp
Имя
Сообщение << Старые топики   Новые топики >>
smtp - 2005-07-03 21:51:29   
Kill_em_all

Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
Помогите разобраться с отправкой почты по SMTP
Мудохаюсь туеву хучу времени, а все не врубаюсь

Вот исходник проги для отправки одного запроса на серв SMTP:

// flood.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream.h>
#include <winsock2.h>

int _tmain(int argc, _TCHAR* argv[])
{
WSAData wsd;
WSAStartup(MAKEWORD(2,2), &wsd);

SOCKET smtp;
struct sockaddr_in serv;
struct hostent *host=NULL;
char mess[256];

strcpy(mess, "HELO axel.ru\r\n");

smtp=socket(PF_INET, SOCK_STREAM, 0);
serv.sin_family=AF_INET;
serv.sin_port=htons(25);
serv.sin_addr.s_addr=inet_addr("mail.ru");

if (serv.sin_addr.s_addr==INADDR_NONE)
{
host=gethostbyname("mail.ru");
CopyMemory(&serv.sin_addr, host->h_addr_list[0], host->h_length);
}

connect(smtp, (PSOCKADDR)&serv, sizeof(serv));
send(smtp, mess, 1024, 0);
char buf[1024];
int ret;

ret=recv(smtp, buf, sizeof(buf), 0);
buf[ret+1]=''\0'';
cout<<buf;

closesocket(smtp);


return 0;
}

Мож кто разберется что не так или свой рабочий исходник выложит[:pray:]
Post #: 1
smtp - 2005-07-04 09:30:22   
Kill_em_all

Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
Ау люди, что сет. кодеры вымерли что-ли?
Post #: 2
smtp - 2005-07-04 14:28:37   
jEnizix

Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
http://www.sources.ru/cpp/cpp_mail_utilits.shtml
Post #: 3
smtp - 2005-07-04 16:03:04   
MrBlack

Сообщений: 268
Оценки: 0
Присоединился: 2004-05-24 00:02:27
Тебе прога нужна или разобраться в кодинге?
Чтобы изучить протокол, читай RFC788.
А в твоем исходнике я уже две ошибки нашел. Во-первых, "\r\n" - так в линуксе писать надо, а под виндой "\n", а лучше и там и там писать "\xD\xA". Во-вторых, по адресу mail.ru нет smtp-сервера. Надо получить mx-запись. Не знаю, как это сделать, но лучше и не делать, а отправлять почту как все приличные люди через relay, данный тебе провом.
И наконец, когда получаешь строку ответа геморрой с тем, чтобы получить строку (до "\xD\xA") и дальше не читать, а потом строку пропарсить. Вот это дело творчества, и у каждого уважающего себя человека должно быть свое решение для этого.
Post #: 4
smtp - 2005-07-04 16:08:06   
jEnizix

Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
А может не \xD\xA а \xD\xA\x0
Post #: 5
smtp - 2005-07-04 17:02:34   
jEnizix

Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
Вот мой рабочий пример: http://jenizix.net.ru/smtp.cpp
Post #: 6
smtp - 2005-07-05 03:57:50   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

—————-<BR>Цитата: Дата:04.07.2005 16:03:04, Автор:MrBlack ::
Во-первых, &amp;amp;quot;<BR>&amp;amp;quot; - так в линуксе писать надо, а под виндой &amp;amp;quot;<BR>&amp;amp;quot;, а лучше и там и там писать &amp;amp;quot;xDxA&amp;amp;quot;.<BR>
—————-


В виндовс нужно писать "\n" вместо "\r\n" если пишешь в файл открытый в текстовом режиме. А в сокет надо писать "\r\n" раз в rfc так написано. Или можно попробовать с fdopen поиграть, но зачем? В MacOS вместо "\r\n" пользуется "\n\r", по моему в данной ситуации проще написать ручками и не убивать портабельность программы.
А-а-а, так ещё и через winsock … ну о портабельности можно не беспокоится:) Я могу скинуть сорцы, только там smtp процентов 30 по объёму, остальное разборки с аргументами и аутентификация через sasl. И ввод-вывод через fprintf, fscanf делается (вот кстати и весь парсинг) – этим я боюсь ваша реализация libc и socket.h может подавиться.

И ещё, интересно, а зачем менять "\r\n" на "\x0d\x0a"? Сомнения в авторитете стандарта ASCII эаели?
Jenizix:
"\0" в конце не надо: компилятор сам подставит.
Post #: 7
smtp - 2005-07-05 09:16:26   
Kill_em_all

Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
Заработала! Так что же получается ошибка в управляющих последовательностях
и в имени сервака?

Всем большое спасибо! Вторую неделю бился над отправкой
почты, а ошибки были в этом!
Post #: 8
smtp - 2005-07-05 12:23:12   
Kill_em_all

Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
2MrBlack>>Кстати ты не прав насчет \r\n - все отлично работает
2Jenizix>>rgo прав - нет необходимости добавлять \x0

Но все равно спасибо, будете в Ставрополе - с меня пиво![sm=sm203.gif]
Post #: 9
smtp - 2005-09-30 22:00:34   
Castbreeder

Сообщений: 11
Оценки: 0
Присоединился: 2005-09-30 21:17:25
Кривой, но письмо отсылает

#ifndef _SMTPC
#define _SMTPC

#include <winsock2.h>
#include <windоws.h>
#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

#pragma comment(lib,"WS2_32.lib")
#pragma warning(disable:4996)
#pragma warning(disable:4267)

class SMTP{
public:
SMTP(char *);
~SMTP();
bool Connect();
bool Send(char *,char *,char *);
void Get(char *);
struct Exception{
Exception(char *s){p = s;}
char *p;};
private:
bool correct(char *);
WSADATA ws;
sockaddr_in san;

SOCKET s;
in_addr in;
char * d;
char buf[100];
};

SMTP::SMTP(char *name){
WSAStartup(MAKEWORD(2,2),&ws);
hostent * h = gethostbyname(name);
if(!h)
throw Exception("Cannot resolve");
memcpy(&in.s_addr,h->h_addr_list[0],h->h_length);
san.sin_family = AF_INET;
san.sin_port = htons(25);
san.sin_addr.s_addr = in.s_addr;
s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s == -1)
throw Exception("Cannot create socket");
}

SMTP::~SMTP(){
WSACleanup();
shutdown(s,2);
closesocket(s);
}

void SMTP::Get(char *buf){
int r;
while(!(r = recv(s,buf,100,0)))
Sleep(100);
buf[r] = '\0';
}

bool SMTP::correct(char *s){
return (strstr(s,"OK")!= 0 || strstr(s,"250")!= 0 || strstr(s,"Acc")!= 0 );
}

bool SMTP::Send(char * from,char * to,char *message){
if(connect(s,(sockaddr*)&san,sizeof(san))!= 0)
throw Exception("Cannot connect");
Get(buf);
strcpy(buf,"HELO SNRR\r\n");
send(s,buf,strlen(buf),0);
Sleep(100);
sprintf(buf,"MAIL FROM:<%s>\r\n",from);
send(s,buf,strlen(buf),0);
Sleep(100);
sprintf(buf,"RCPT TO:<%s>\r\n",to);
send(s,buf,strlen(buf),0);
Sleep(100);
strcpy(buf,"DATA\r\n");
send(s,buf,strlen(buf),0);
Sleep(100);
Get(buf);
send(s,message,strlen(message),0);
Sleep(100);
send(s,"\r\n.\r\n",strlen("\r\n.\r\n"),0);
Sleep(100);
Get(buf);
send(s,"QUIT\r\n",strlen("QUIT\r\n"),0);
return true;
}

#endif
Post #: 10
smtp - 2005-09-30 22:03:03   
Castbreeder

Сообщений: 11
Оценки: 0
Присоединился: 2005-09-30 21:17:25
Он правильно \r\n ставит. Работать по другому не будет. Пиши gethostbyname("smtp.mail.ru");
Post #: 11
smtp - 2005-09-30 22:15:19   
jEnizix

Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
Зачем ты старые темы поднимаеш??? Ей уже 3 меяца почти!! Уже все решили!!!
Post #: 12
smtp - 2005-10-01 09:35:04   
Castbreeder

Сообщений: 11
Оценки: 0
Присоединился: 2005-09-30 21:17:25
Sorry. Просто я здесь впервые
Post #: 13
Страниц:  [1]
Все форумы >> [Веб-программинг] >> smtp







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.