Поиск по сайту
Форумы 
Реклама
|
| Просмотров - 10342
| Скомпилировать код отправки письма на С++ в Dev C++ | Добавить этот топик в закладки » | | RSS-лента ответов » |
|
|
azamprod

Gold Member | # | Сообщение добавлено 05.07.2010 11:38:37 Код взял отсюда http://tinyurl.com/396cpjz
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
hostent *d_addr;
char text[1024];
int main()
{
// инициализируем сокеты
if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws)))
{
printf("Error in WSAStartup(...)\n");
return 1; }
// создаем сокет
s = socket (AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
printf("Error in socket(...)\n");
return 1; }
// получаем адрес сервера
d_addr = gethostbyname ("smtp.mail.ru");
if (d_addr==NULL)
{
printf("Error in gethostbyname(...)\n");
return 1; };
// заполняем параметры адреса
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 (s, (sockaddr *) &addr,
sizeof (addr))))
{
printf("Error in connect(...)\n");
return 1; }
// ждем ответ от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
// приветствуем сервер
strcpy(text,"HELO smtp.mail.ru\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
// ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
// начинаем отправлять конверт состоящий из полей
// MAIL FROM: и RCPT TO: После каждого поля ждем
// подтверждение
// сообщаем отправителя
strcpy(text,"MAIL FROM: [email]sender@mail.ru[/email] ");
send(s,text,strlen(text),0);
printf("send - %s", text);
// ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
// сообщаем получателя
strcpy(text,"RCPT TO: [email]receiver@mtu-net.ru[/email] ");
send(s,text,strlen(text),0);
printf("send - %s", text);
// ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
// подаем команду, что готовы начать передачу письма
strcpy(text,"DATA\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
// ждем подтверждение от сервера
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
// передаем заголовок
// от кого письмо
strcpy(text,"FROM: [email]sender@mail.ru[/email] ");
send(s,text,strlen(text),0);
printf("send - %s", text);
// кому письмо
strcpy(text,"TO: [email]receiver@mtu-net.ru[/email] ");
send(s,text,strlen(text),0);
printf("send - %s", text);
// тема письма
strcpy(text,"SUBJECT: test\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
// текст письма
strcpy(text,"Hi!\nIt is a message for you\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
// говорим, что закончили
strcpy(text,"\r\n.\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
recv(s,text,sizeof(text),0);
printf("recv - %s", text);
// прощаемся с сервером
strcpy(text,"QUIT");
send(s,text,strlen(text),0);
printf("send - %s", text);
// закрываем сокет
closesocket(s);
return 0;
}
Компилировал в Dev C++ выдает ошибки
[Linker error] undefined reference to `WSAStartup@8'
[Linker error] undefined reference to `socket@12'
[Linker error] undefined reference to `gethostbyname@4'
[Linker error] undefined reference to `htons@4'
[Linker error] undefined reference to `connect@12'
[Linker error] undefined reference to `recv@16'
[Linker error] undefined reference to `send@16'
[Linker error] undefined reference to `closesocket@4'
Помогите как правильно компилировать этот код в Dev C++
Приписывал #pragma comment(lib, "ws_32.lib") не компилирует | | Сказать спасибо Ответить Цитировать |
| _ruzmaz_
Gold Member | # | Сообщение добавлено 05.07.2010 22:24:05 меню Project -> пункт Project Options -> вкладка Parameters -> кнопка Add Library or Object
и добавляешь libwsock32.a
чтобы использовать winsock 2 (libws2_32.a) лучше включать winsock2.h
pragma comment вряд ли будет работать, если конечно не используешь мелкомягкий компилер | | Сказать спасибо Ответить Цитировать |
| azamprod

Gold Member | # | Сообщение добавлено 09.07.2010 15:13:23 Отредактировано 09.07.2010 15:19:28 by azamprod Скомпилировалось, запустил,

но на ящик письмо не приходит.
В чем может быть проблема?
| | Сказать спасибо Ответить Цитировать |
| _ruzmaz_
Gold Member | # | Сообщение добавлено 10.07.2010 16:21:09 azamprod
Скомпилировалось
слинковалось)
Добавлено 10.07.2010 16:21:25 (через 16 секунд )
переделал немного
http://slil.ru/29450030
Добавлено 10.07.2010 16:25:05 (через 4 минуты 41 секунда )
В приведенном в первом посте коде:
- передача команд не соответствеут протоколу
http://www.codenet.ru/webmast/smtp.php
http://ru.wikipedia.org/wiki/SMTP
(после каждой строки идет \r\n, адреса заключаются в < >, перед текстом письма два \r\n)
- в конце полученных через recv данных нужен 0 (если результат != SOCKET_ERROR) для нормального вывода через printf
Добавлено 10.07.2010 16:26:54 (через 2 минуты 49 секунд )
- выполняется отправка письма на mail.ru, поэтому получатель думаю должен быть на mail.ru хотя бы, а не на mtu-net.ru
- smtp.mail.ru стоит заменить на mxs.mail.ru, так как прием почты на mail.ru вроде идет через него
http://www.sql.ru/forum/actualthread.aspx?tid=251663
Добавлено 10.07.2010 16:31:14 (через 4 минуты 20 секунд )
если использовать smtp.mail.ru, то у меня так
recv - 220 mail.ru ESMTP Sat, 10 Jul 2010 16:30:31 +0400
send - HELO smtp.mail.ru
recv - 250 mx74.mail.ru Hello smtp.mail.ru [194.186.188.38]
send - MAIL FROM:<xxx@rambler.ru>
recv - 250 OK
send - RCPT TO:<ruzmaz@mail.ru>
recv - 550 not local sender over smtp
send - DATA
recv - 503 valid RCPT command must precede DATA
send - from: <xxx@rambler.ru>
send - to: <ruzmaz@mail.ru>
send - subject: Test
send -
send - It is a message for you
send - .
recv - 500 unrecognized command
send - QUIT
Добавлено 10.07.2010 16:38:29 (через 7 минут 15 секунд )
а если через mxs.mail.ru, то выглядит более оптимистично имхо)
recv - 220 Mail.Ru ESMTP
send - HELO mxs.mail.ru
recv - 250 mx63.mail.ru ready to serve
send - MAIL FROM:<xxx@rambler.ru>
recv - 250 OK
send - RCPT TO:<ruzmaz@mail.ru>
recv - 550 Access from ip address 194.186.188.38 blocked. Visit http://win.mail.
ru/cgi-bin/support_bl?ip=194.186.188.38
send - DATA
recv - 421 Command out of sequence; try again later
send - from: <xxx@rambler.ru>
send - to: <ruzmaz@mail.ru>
send - subject: Test
send -
send - It is a message for you
send - .
recv - 500 Unknown command
send - QUIT
| | Сказать спасибо Ответить Цитировать |
| azamprod

Gold Member | # | Сообщение добавлено 10.07.2010 18:11:34 Был на mail.ru и The Bat, пробовал smtp.mail.ru заменять на mxs.mail.ru, письмо не приходит. Пока буду пробовать | | Сказать спасибо Ответить Цитировать |
| _ruzmaz_
Gold Member | # | Сообщение добавлено 10.07.2010 19:36:32 azamprod
письмо не приходит
а что прога-то говорит? | | Сказать спасибо Ответить Цитировать |
| azamprod

Gold Member | # | Сообщение добавлено 10.07.2010 20:01:59 _ruzmaz_
а что прога-то говорит?
Добавлено 07.11.2010 16:12:52 (через 120 дней 21 часов 11 минут 53 секунды )
Работает
#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#define BUFLEN 0x1000
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
hostent *d_addr;
char text[BUFLEN];
int main()
{
int n = 0;
// инициализируем сокеты
if(FAILED(WSAStartup(MAKEWORD(1, 1), &ws)))
{
printf("Error in WSAStartup(...)\n");
return 1;
}
// создаем сокет
s = socket(AF_INET, SOCK_STREAM, 0);
if(s == INVALID_SOCKET)
{
printf("Error in socket(...)\n");
return 1;
}
// получаем адрес сервера
d_addr = gethostbyname("smtp.mail.ru");
if(d_addr == NULL)
{
printf("Error in gethostbyname(...)\n");
return 1;
}
// заполняем параметры адреса
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(s, (sockaddr*)&addr, sizeof(addr))))
{
printf("Error in connect(...)\n");
return 1;
}
// ждем ответ от сервера
n = recv(s, text, BUFLEN - 1, 0);
text[n] = 0;
printf("recv - %s", text);
// приветствуем сервер
strcpy(text, "HELO smtp.mail.ru\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// ждем подтверждение от сервера
n = recv(s, text, BUFLEN - 1, 0);
if(n != SOCKET_ERROR)
text[n] = 0;
printf("recv - %s", text);
// начинаем отправлять конверт состоящий из полей
// MAIL FROM: и RCPT TO: После каждого поля ждем
// подтверждение
// сообщаем отправителя
strcpy(text, "MAIL FROM:<azamprod@mail.ru>\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// ждем подтверждение от сервера
n = recv(s, text, BUFLEN - 1, 0);
if(n != SOCKET_ERROR)
text[n] = 0;
printf("recv - %s", text);
// сообщаем получателя
strcpy(text, "RCPT TO:<azamprod@mail.ru>\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// ждем подтверждение от сервера
n = recv(s, text, BUFLEN - 1, 0);
if(n != SOCKET_ERROR)
text[n] = 0;
printf("recv - %s", text);
// подаем команду, что готовы начать передачу письма
strcpy(text, "DATA\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// ждем подтверждение от сервера
n = recv(s, text, BUFLEN - 1, 0);
if(n != SOCKET_ERROR)
text[n] = 0;
printf("recv - %s", text);
// передаем заголовок
// от кого письмо
strcpy(text, "from: <azamprod@mail.ru>\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// кому письмо
strcpy(text,"to: <azamprod@mail.ru>\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// тема письма
strcpy(text, "subject: Test\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
strcpy(text, "\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// текст письма
strcpy(text, "Это письмо test test\r\n");
send(s, text,strlen(text), 0);
printf("send - %s", text);
// говорим, что закончили
strcpy(text, ".\r\n");
send(s, text, strlen(text), 0);
printf("send - %s", text);
n = recv(s, text, BUFLEN - 1, 0);
if(n != SOCKET_ERROR)
text[n] = 0;
printf("recv - %s", text);
// прощаемся с сервером
strcpy(text, "QUIT");
send(s, text, strlen(text), 0);
printf("send - %s", text);
// закрываем сокет
closesocket(s);
getchar();
return 0;
}
| | Сказать спасибо Ответить Цитировать |
| Izon
Novice | # | Сообщение добавлено 15.11.2014 14:25:53 Что делать если выводит эту ошибку ?
C:\wq123\Makefile.win [Build Error] [Project1.exe] Error 1
| | Сказать спасибо Ответить Цитировать |
|
|