Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Работа с электронной почтой через C++

Автор: zavilov
Дата сообщения: 06.05.2008 20:52
Начал писать программу, которая должна получать определенную текстовую строку по сети, а затем рассылать ее в электронных письмах на определенный список адресов. Может кто-нибудь посоветовать или дать ссылки на статьи о том, как осуществить отправку писем с помощью С++. Пишу программу в Visual C++ 6.0. Можно ли для этих целей как-нибудь использовать Outlook? Заранее спасибо.
Автор: Tantos
Дата сообщения: 07.05.2008 01:48
См. MSDN по MAPI.
Автор: zavilov
Дата сообщения: 08.05.2008 17:41
Tantos
спасибо за совет, но я решил написать свой собственный smtp-клиент. Мне это показалось проще, чем разбираться в MAPI.
Поискав на форумах и прочитав соответствующие RFC, написал след. код:
WSADATA ws;
SOCKET s;
struct sockaddr_in addr;
hostent *d_addr;
char text[1024];



if (FAILED (WSAStartup (MAKEWORD( 1,1 ), &ws)))
{
MessageBox(0, "wsa", "Error", 0);
return 1; }
s = socket (AF_INET, SOCK_STREAM, 0);
if (s == INVALID_SOCKET)
{
MessageBox(0, "socket", "Error", 0);
return 1; }
d_addr = gethostbyname ("smtp.mail.ru");
if (d_addr==NULL)
{
MessageBox(0, "addr", "Error", 0);
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))))
{
MessageBox(0, "Connect", "Error", 0);
return 1; }
recv(s,text,sizeof(text),0);
if(sizeof(text)<=0)
{
     MessageBox(0, "step 1 failed", "Error", 0);

}
//отправляем команду HELO серверу
strcpy(text,"HELO smtp.mail.ru\r\n");
send(s,text,strlen(text),0);
// принимаем ответ
recv(s,text,sizeof(text),0);
if(sizeof(text)<=0)
{MessageBox(0, "step 2 failed", "Error", 0);}
strcpy(text,"MAIL FROM:мой ящик@mail.ru\r\n");
//отправляем команду MAIL FROM серверу
send(s,text,strlen(text),0);
// принимаем ответ
recv(s,text,sizeof(text),0);
if(sizeof(text)<=0)
{MessageBox(0, "step 3 failed", "Error", 0);}
Sleep(100);
strcpy(text,"RCPT TO:нужный ящик@mail.ru\r\n");
//отправляем команду RCPT TO: серверу
send(s,text,strlen(text),0);
recv(s,text,sizeof(text),0);
if(sizeof(text)<=0)
{MessageBox(0, "step 4 failed", "Error", 0);}
strcpy(text,"DATA\r\n");
send(s,text,strlen(text),0);
recv(s,text,sizeof(text),0);
strcpy(text,"FROM:мой ящик@inbox.ru");
send(s,text,strlen(text),0);
strcpy(text,"TO:нужный ящик@mail.ru");
send(s,text,strlen(text),0);
strcpy(text,"SUBJECT: test\r\n");
send(s,text,strlen(text),0);
strcpy(text,"Hi!\nIt is a message for you\n");
send(s,text,strlen(text),0);


// aiai?ei, ?oi caeii?eee
strcpy(text,"\r\n.\r\n");
send(s,text,strlen(text),0);
printf("send - %s", text);
recv(s,text,sizeof(text),0);


// i?iuaainy n na?aa?ii
strcpy(text,"QUIT");
send(s,text,strlen(text),0);


//cae?uaaai nieao
closesocket(s);
Однако, после того, как мой клиент посылает серверу команду DATA, я получаю ответ о необходимости авторизации. Можно ли как-нибудь отправить сообщение без авторизации? Дело в том, что в моем приложении в качестве отправителя должен быть указан любой возможный адрес, а с механизмом аутентификации работать раньше не приходилось.
Автор: Viverra
Дата сообщения: 09.05.2008 14:26
Примерный механизм аутентификации:

Код:
EHLO
AUTH LOGIN
имя пользователя в BASE 64
пароль пользователя в BASE 64
Автор: zavilov
Дата сообщения: 15.05.2008 22:02
Спасибо всем, кто откликнулся. Почитал RFC и написал нужную программу.

Страницы: 1

Предыдущая тема: сравнение чисел Fortran


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.