smtp
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
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:]
|
|
|
smtp - 2005-07-04 09:30:22
|
|
|
Kill_em_all
Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
|
Ау люди, что сет. кодеры вымерли что-ли?
|
|
|
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
|
|
|
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") и дальше не читать, а потом строку пропарсить. Вот это дело творчества, и у каждого уважающего себя человека должно быть свое решение для этого.
|
|
|
smtp - 2005-07-04 16:08:06
|
|
|
jEnizix
Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
|
А может не \xD\xA а \xD\xA\x0
|
|
|
smtp - 2005-07-04 17:02:34
|
|
|
jEnizix
Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
|
Вот мой рабочий пример: http://jenizix.net.ru/smtp.cpp
|
|
|
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;quot;<BR>&amp;quot; - так в линуксе писать надо, а под виндой &amp;quot;<BR>&amp;quot;, а лучше и там и там писать &amp;quot;xDxA&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" в конце не надо: компилятор сам подставит.
|
|
|
smtp - 2005-07-05 09:16:26
|
|
|
Kill_em_all
Сообщений: 395
Оценки: 0
Присоединился: 2005-03-25 22:40:01
|
Заработала! Так что же получается ошибка в управляющих последовательностях и в имени сервака?
Всем большое спасибо! Вторую неделю бился над отправкой почты, а ошибки были в этом!
|
|
|
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]
|
|
|
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
|
|
|
smtp - 2005-09-30 22:03:03
|
|
|
Castbreeder
Сообщений: 11
Оценки: 0
Присоединился: 2005-09-30 21:17:25
|
Он правильно \r\n ставит. Работать по другому не будет. Пиши gethostbyname("smtp.mail.ru");
|
|
|
smtp - 2005-09-30 22:15:19
|
|
|
jEnizix
Сообщений: 1797
Оценки: 0
Присоединился: 2004-12-30 11:03:50
|
Зачем ты старые темы поднимаеш??? Ей уже 3 меяца почти!! Уже все решили!!!
|
|
|
smtp - 2005-10-01 09:35:04
|
|
|
Castbreeder
Сообщений: 11
Оценки: 0
Присоединился: 2005-09-30 21:17:25
|
Sorry. Просто я здесь впервые
|
|
|
|
|