Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562

Как на c++ написать отправку письма на e-mail через внешний smtp сервер?

30.09.2011, 08:54. Показов 13783. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как на c++ написать отправку письма на e-mail через внешний smtp сервер? Обращение к мейлеру не предлагать, прога должна связаться с серваком и передать письмо самостоятельно. Задача: есть четыре параметра-указателя на z-терминальные строки:
C++
1
2
3
4
5
6
7
8
char *mail(*messge, *email, *login, *smtp, *password)
//*messge - указатель на html-код самого письма, вложений и рисунков оно не содержит.
//*email - указатель на e-mail адрес получателя
//*login - указатель на мой логин на smtp-сервере
//*smtp - указатель на адрес самого smtp-сервера
// *password - указатель на мой пароль на smtp-сервере
...
}
Требуется выполнить авторизацию на *smtp, используя *login и *password, отправить *messge на *email и отсоединиться. При неудаче вернуть указатель на z-терминальную строку с текстом сообщения об ошибке, иначе вернуть NULL.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.09.2011, 08:54
Ответы с готовыми решениями:

Привязать отправку письма через SMTP клиент к QProgressBar
Уважаемые, подкиньте идею: к чему привязать progressbar при отправке письма?

Как сделать отправку письма на почту с указанным e-mail?
Здравствуйте, форумчане. Есть элемент form с n-ным количеством форм. В одной из форм пользователь должен указать свой e-mail. Как сделать...

Отправка e-mail через SMTP-сервер
Доброго времени суток. У меня возникла проблема - скрипт не желает отправлять сообщение через SMTP. Использую сервер гугла. Сам...

41
30.09.2011, 09:11

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Как на c++ написать отправку письма на e-mail через внешний smtp сервер? Обращение к мейлеру не предлагать, прога должна связаться с серваком и передать письмо самостоятельно. Задача: есть четыре параметра-указателя на z-терминальные строки:
- посмотри сюда
e-mail + Unicode
Если то что тебе нужно или читай топик или в личке спрашивай
(с недавнего времени мне не разрешают здесь помогать)

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 09:16  [ТС]
Мне без MFC.

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если то что тебе нужно или читай топик или в личке спрашивай
(с недавнего времени мне не разрешают здесь помогать)
И где у тебя личка? А помошь может выражаться и в ссылке на обсуждение/туториал, названии книги (бумажной/электронной), не обязательно делать всё за маня.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.09.2011, 10:32
отправь сначала через telnet - там поймёшь
раньше на серверах не было защиты, можно было отправлять что угодно от кого угодно без всяких допольнительных действий
теперь же надо авторизоваться
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 10:35  [ТС]
Через телнет я уже пробовал. Не только не отправил, но даже не авторизовался. К тому же я не знаю, что этот телнет отправляет и как интерпретирует приём.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
30.09.2011, 10:39
Цитата Сообщение от taras atavin Посмотреть сообщение
Через телнет я уже пробовал. Не только не отправил, но даже не авторизовался. К тому же я не знаю, что этот телнет отправляет и как интерпретирует приём.
- поробуй так без авторизации коннектиться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// устанавливаем соединение
  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.(тут твой домен)\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: После каждого поля ждем
  // подтверждение
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 10:43  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- поробуй так без авторизации коннектиться
У меня нет адреса безоавторизатного smtp.

Добавлено через 53 секунды
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
sizeof (addr)
Какой тип имеет эта величина? И что это вообще? IP? А у меня мнемоадрес.

Добавлено через 48 секунд
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
s
Назначение этой величины?

Добавлено через 1 минуту
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
// начинаем отправлять конверт состоящий из полей
* // MAIL FROM: и RCPT TO: После каждого поля ждем
* // подтверждение
А как?
0
30.09.2011, 10:44

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
IP? А у меня мнемоадрес.
C++
1
2
3
4
5
6
// получаем адрес сервера
  d_addr = gethostbyname ("smtp.(твой домен)");
  if (d_addr==NULL)
  {
    printf("Error in gethostbyname(...)\n");
    return 1;  };
- уже тебе почти почтового клиента написал:D
Совсем забыл
C++
1
2
struct sockaddr_in addr;
addr.sin_addr.s_addr = *((unsigned long *) d_addr->h_addr);

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 10:48  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
recv
Где эта функция?

Добавлено через 3 минуты
Давай по-другому. smtp работает по udp, или по tcp?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
30.09.2011, 10:59
Цитата Сообщение от taras atavin Посмотреть сообщение
Давай по-другому. smtp работает по udp, или по tcp?
- TCP
Далее по книге
Для создания сокета используется системный вызов socket.

C++
1
s = socket(domain, type, protocol);
Этот вызов основывается на информации о коммуникационном домене и типе сокета. Для использования особенностей Internet, значения параметров должны быть следующими:

communication domain -
AF_INET (Internet протоколы). type of the socket - SOCK_STREAM; Этот тип обеспечивает последовательный, надежный, ориентированный на установление двусторонней связи поток байтов.
Выше был упомянут сокет с типом stream. Краткое описание других типов сокетов приведено ниже:
Datagram socket - поддерживает двусторонний поток данных. Не гарантируется, что этот поток будет последовательным, надежным, и что данные не будут дублироваться. Важной характеристикой данного сокета является то, что границы записи данных предопределены.
Raw socket - обеспечивает возможность пользовательского доступа к низлежащим коммуникационным протоколам, поддерживающим сокет-абстракции. Такие сокеты обычно являются датаграм- ориентированными.
Функция socket создает конечную точку для коммуникаций и возвращает файловый дескриптор, ссылающийся на сокет, или -1 в случае ошибки. Данный дескриптор используется в дальнейшем для установления связи.
Для создания сокета типа stream с протоколом TCP, обеспечивающим коммуникационную поддержку, вызов функции socket должен быть следующим:
C++
1
 s = socket(AF_INET, SOCK_STREAM, 0);
- у меня так
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
30.09.2011, 11:00
Цитата Сообщение от taras atavin
Через телнет я уже пробовал. Не только не отправил, но даже не авторизовался. К тому же я не знаю, что этот телнет отправляет и как интерпретирует приём.
вот пробуй, пока не получится
smtp - текстовый протокол
rfc. smtp (в конце есть пример сессии)
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 11:12  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include "winsock2.h"
...
char mail (*messge, *email, *login, *smtp, *password)
{
 char *result=NULL;
 WSADATA ws;
 SOCKET SmtpClientSocket;
 DWORD SmtpIp;
 hostent *hn;
 if (WSAStartup (0x202, &ws) != 0)
 {
  result=new car [22];
  *result='Н';
  *(result+1)='е';
  *(result+2)=' ';
  *(result+3)='м';
  *(result+4)='о';
  *(result+5)='г';
  *(result+6)='у';
  *(result+7)=' ';
  *(result+8)='с';
  *(result+9)='о';
  *(result+10)='з';
  *(result+11)='д';
  *(result+12)='а';
  *(result+13)='т';
  *(result+14)='ь';
  *(result+15)='с';
  *(result+16)='о';
  *(result+17)='к';
  *(result+18)='е';
  *(result+19)='т';
  *(result+20)='.';
  *(result+21)=(сhar)0;
  return result;
 }
 if (INVALID_SOCKET==(SmtpClientSocket=socket (AF_INET, SOCK_STREAM, 0) ) )
{
  result=new car [22];
  *result='Н';
  *(result+1)='е';
  *(result+2)=' ';
  *(result+3)='м';
  *(result+4)='о';
  *(result+5)='г';
  *(result+6)='у';
  *(result+7)=' ';
  *(result+8)='с';
  *(result+9)='о';
  *(result+10)='з';
  *(result+11)='д';
  *(result+12)='а';
  *(result+13)='т';
  *(result+14)='ь';
  *(result+15)='с';
  *(result+16)='о';
  *(result+17)='к';
  *(result+18)='е';
  *(result+19)='т';
  *(result+20)='.';
  *(result+21)=(сhar)0;
  return result;
 }
 SmtpIp=inet_addr(smtp);
 if (SmtpIp!=INADDR_NONE)
 {
  adr.sin_addr.S_un.S_addr=SmtpIp;
 }
 else
 {
  if (hn=gethostbyname(smtp))
  {
   ((unsigned long *)&adr.sin_addr)[0]=((unsigned long **)hn->h_addr_list)[0][0];
  }
  else
  {
   result=new car [25];
   *result='Н';
   *(result+1)='е';
   *(result+2)=' ';
   *(result+3)='п';
   *(result+4)='р';
   *(result+5)='а';
   *(result+6)='в';
   *(result+7)='и';
   *(result+8)='л';
   *(result+9)='ь';
   *(result+10)='н';
   *(result+11)='ы';
   *(result+12)='й';
   *(result+13)=' ';
   *(result+14)='а';
   *(result+15)='д';
   *(result+16)='р';
   *(result+17)='е';
   *(result+18)='с';
   *(result+19)=' ';
   *(result+20)='s';
   *(result+21)='m';
   *(result+22)='t';
   *(result+23)='p';
   *(result+24)=(сhar)0;
   closesocket(SmtpClientSocket);
   WSACleanup();
   return result;
  }
 }
 ...
 return result;
}
...
Добавлено через 1 минуту
Цитата Сообщение от accept Посмотреть сообщение
smtp - текстовый протокол
Спасибо.

Добавлено через 5 минут
Почему то телнет лезет на 23-й порт вместо 25-го.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 11:18  [ТС]
Надо было через пробел. EHLO принялось, но дальше в примере идёт MAIL FROM, а ничего не получается.
Миниатюры
Как на c++ написать отправку письма на e-mail через внешний smtp сервер?  
0
30.09.2011, 11:21

Не по теме:

Цитата Сообщение от taras atavin Посмотреть сообщение
Надо было через пробел. EHLO принялось, но дальше в примере идёт MAIL FROM, а ничего не получается.
- потому что ты AUTH от сервера не прошёл, вот он и фтуболит твою программу

0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 11:23  [ТС]
s:220 mail.ru ESMTP Sat, 15 Apr 2006 16:46:49 +0400
u:EHLO server
s:250-mx6.mail.ru Hello server [111.11.11.111]
s:250-SIZE 10485760
s:250-8BITMIME
s:250-AUTH PLAIN LOGIN
s:250 PIPELINING
u:AUTH LOGIN
s:334 VXNlcm5hbWu6
u:dGVzdF9fXzAwMDAz
.И что это значит?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
30.09.2011, 11:24
Цитата Сообщение от taras atavin Посмотреть сообщение
*result='Н'; *(result+1)='е'; *(result+2)=' '; *(result+3)='п'; *(result+4)='р'; *(result+5)='а'; *(result+6)='в'; *(result+7)='и'; *(result+8)='л'; *(result+9)='ь'; *(result+10)='н'; *(result+11)='ы'; *(result+12)='й'; *(result+13)=' '; *(result+14)='а'; *(result+15)='д'; *(result+16)='р'; *(result+17)='е'; *(result+18)='с'; *(result+19)=' '; *(result+20)='s'; *(result+21)='m'; *(result+22)='t'; *(result+23)='p'; *(result+24)=(сhar)0;
strcpy(result, "Не правильный адрес smtp Блеееаааа!");
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 11:24  [ТС]
следовательно логин и пароль надо отправлять, предварительно зашифровав их в Base64.
Как это делается?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
30.09.2011, 11:30
Цитата Сообщение от taras atavin Посмотреть сообщение
s:334 VXNlcm5hbWu6
u:dGVzdF9fXzAwMDAz
s:334 Usernamk�
u:test___00003
0
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
30.09.2011, 11:31
Цитата Сообщение от taras atavin Посмотреть сообщение
Как это делается?
http://base64.ru/
ну a вообще есть сторонние библиотеки для работы с base64
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
30.09.2011, 11:32  [ТС]
А как кодировать раскодировать этот Base64?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.09.2011, 11:32
Помогаю со студенческими работами здесь

VBS Отправка e-mail через SMTP-сервер - VBScript/JScript/WSH/WMI/HTA
Помогите, при запуске скрипта возникает ошибка Option Explicit 'Содание объекта CDO Dim objmes Set...

Как настроить SMTP сервер? Письма не отправляются..
Установил IIS 5.0 сервер, поставляемый вместе с W2k pro. Не могу отправить письмо с моего SMTP сервера. Может кто подскажет?

Выполнить отправку сообщения используя SMTP сервер
Доброго времени суток. Подскажите пожалуйста как можно реализовать простейшую отправку сообщения с помощью SMPT сервера через LabVIEW не...

Как сделать отправку красивого ответного письма через форму обратной связи?
Здравствуйте, Волнует вопрос, не могу найти ответ. Почему письмо приходит в виде обычного текста объяснять не нужно, т.к. сам это знаю....

Отправленные по SMTP протоколу на адреса mail.ru письма попадают в спам
Люди, помогите! Может кто подскажет что делать. С корпоративной почты все письма отправленные по SMTP протоколу на адреса mail.ru попадают...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
PowerShell Snippets
iNNOKENTIY21 11.11.2025
Модуль PowerShell 5. 1+ : Snippets. psm1 У меня модуль расположен в пользовательской папке модулей, по умолчанию: \Documents\WindowsPowerShell\Modules\Snippets\ А в самом низу файла-профиля. . .
PowerShell и онлайн сервисы. Валюта (floatrates.com руб.)
iNNOKENTIY21 11.11.2025
PowerShell функция floatrates-rub Примеры вызова: # Указанная валюта 'EUR' floatrates-rub -Code 'EUR' # Список имеющихся кодов валют floatrates-rub -Available function floatrates-rub {
PowerShell и онлайн сервисы. Погода (RP5.ru)
iNNOKENTIY21 11.11.2025
PowerShell функция Get-WeatherRP5rss для получения погоды с сервиса RP5 Примеры вызова Get-WeatherRP5rss с указанием id 5484 — Москва (восток, Измайлово) и переносом строки:. . .
PowerShell и онлайн сервисы. Погода (wttr)
iNNOKENTIY21 11.11.2025
PowerShell Функция для получения погоды с сервиса wttr Примеры вызова: Погода в городе Омск с прогнозом на день, можно изменить прогноз на более дней, для этого надо поменять запрос:. . .
PowerShell и онлайн сервисы. Валюта (ЦБР)
iNNOKENTIY21 11.11.2025
# Получение курса валют function cbr (] $Valutes = @('USD', 'EUR', 'CNY')) { $url = 'https:/ / www. cbr-xml-daily. ru/ daily_json. js' $data = Invoke-RestMethod -Uri $url $esc = 27 . . .
И решил я переделать этот ноут в машину для распределенных вычислений
Programma_Boinc 09.11.2025
И решил я переделать этот ноут в машину для распределенных вычислений Всем привет. А вот мой компьютер, переделанный из ноутбука. Был у меня ноут асус 2011 года. Со временем корпус превратился. . .
Мысли в слух
kumehtar 07.11.2025
Заметил среди людей, что по-настоящему верная дружба бывает между теми, с кем нечего делить.
Новая зверюга
volvo 07.11.2025
Подарок на Хеллоуин, и теперь у нас кроме Tuxedo Cat есть еще и щенок далматинца: Хочу еще Симбу взять, очень нравится. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru