Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: отправка на почтовый адрес  (Прочитано 40544 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« : 04-02-2008 05:50 » 

Нужно из своей программы отправить данные (строку текста) на определённый почтовый адрес

как это делается ?
Записан

zubr
Гость
« Ответ #1 : 04-02-2008 08:11 » 

1. Открываешь сокет - функция socket
2. Создаешь соединение с почтовым сервером - функция connect
3. По протоколу SMTP отправляешь строку аутентификации (для разных почтовых серверов она может отличаться, можешь посмотреть лог-файл своей почтовой программы) функцией send.
4. Вызываешь функцию recv для получения ответа.
5. Получив ответ сервера, анализируешь его (протокол SMTP). Если ошибки не выдается, отправляешь твою строку функцией send.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #2 : 04-02-2008 08:45 » 

спасибо, попробую, вроде в теории пока всё понятно
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #3 : 04-02-2008 09:42 » 

http://netcode.ru/cpp/?lang=&katID=19&skatID=163&artID=4991
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 04-02-2008 10:03 » 

Джон, я так понимаю, намякиваешь на использование класа CMapiMessage ?
Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 04-02-2008 10:06 » 

Алексей1153++, конечно надо API юзать - MAPI. SMTP - довольно навороченный протокол.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #6 : 04-02-2008 10:09 » 

так я ж нисколько не против - я просто так с ходу не нашёл ) Щас помацаем CMapiMessage
Записан

zubr
Гость
« Ответ #7 : 04-02-2008 10:40 » 

Алексей1153++, конечно надо API юзать - MAPI. SMTP - довольно навороченный протокол.
Что уж там такого навороченного, я с ним за 2 часа разобрался. Тем более берешь лог-файл OutLook - вот тебе готовый протокол.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 04-02-2008 10:45 » 

zubr, был бы у меня такой лог ))) Да и некогда отлаживать...  Ну эт ладно.

Джон, нету описания этого класса в msdn - я так понимаю, он кем то левым написан, так вот, кто такие:
Цитата
The To: Recipients
The CC: Recipients
The BCC Recipients

(только To Recipients понятно)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 04-02-2008 11:01 » 

и что задают флажки
Resolve
Interactive
Shared
?

в функции
BOOL CMapiSession::Logon(const CString& sProfileName, const CString& sPassword, CWnd* pParentWnd)

что есть ProfileName и какой именно пароль ?
« Последнее редактирование: 04-02-2008 11:11 от Алексей1153++ » Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #10 : 04-02-2008 11:40 » 

Джон, нету описания этого класса в msdn

Блииин, как всё запущено... Ага Если бы это был родной класс, я бы наерное ссылку на MSDN дал или?

Цитата
- я так понимаю, он кем то левым написан

Строчка "Автор: P.J.Naughter" как-то невольно наталкивает на эту мысль. Ага

Смотри тут http://www.naughter.com/ и в коде, это же рабочий проект для примера.


Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #11 : 04-02-2008 11:43 » 

Цитата
The enclosed zip file contains the source code and a simple test program to exercise all of the functions the classes provide.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #12 : 04-02-2008 11:48 » 

рабочий пример пытается отправлять через outlook - а нафига мне это ? ))
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 04-02-2008 12:15 » 

пробую через сокет
Код:
CString txt;

for(;;)
{
CAsyncSocket s;
if(!s.Create(0,SOCK_STREAM,0))break;
s.Connect("smtp.yandex.ru",25);

BYTE p[1000];
s.Receive(p,1000);

txt="HELO yandex.ru";
s.Send((const char*)txt,txt.GetLength());

::memset(p,0,1000);
s.Receive(p,1000);

break;
}


после коннекта прилетает строка
220 Yandex ESMTP (NO UCE)(NO UBE) server ready at Mon, 4 Feb 2008 15:12:21 +0300

а после посылки "HELO yandex.ru" - тишина , что тут я напортачил опять ?
« Последнее редактирование: 04-02-2008 12:17 от Алексей1153++ » Записан

RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 04-02-2008 12:34 » 

Алексей1153++, конечно надо API юзать - MAPI. SMTP - довольно навороченный протокол.
Что уж там такого навороченного, я с ним за 2 часа разобрался. Тем более берешь лог-файл OutLook - вот тебе готовый протокол.

Логика работы существенно меняется от настроек SMTP-сервера, от поддерживаемых им ф-ий. Потому проще пользоваться API, чем городить свое.


Леш, CC - кому слать копию, BCC - тоже самое, но "скрытая копия".
« Последнее редактирование: 04-02-2008 12:39 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #15 : 04-02-2008 18:04 » 

Алексей1153++, настрой Outlook, отправь какое нить почтовое сообщение и посмотри, что у него в логе, сразу все проблемы решишь.
Вот моя строка аутенфикации при отправке на сервер почтового сообщения с файлом в аттачменте:
s:='EHLO 12345'+#13+#10+'AUTH LOGIN'+#13+#10+'rt96ghn='+#13+#10+'c2hnmkjerl=='+
  #13+#10+'MAIL FROM:blabla@mail.ru'+#13+#10+'RCPT TO:blabla@tut.by'+#13+#10+
  'DATA'+#13+#10+'From: <blabla@mail.ru>'+#13+#10+'To: <blabla@tut.by>'+#13+#10+
  'subject:Trn'+#13+#10+'MIME-Version: 1.0'+#13+#10;
З.Ы. Естественно строка изменена.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 04-02-2008 18:13 » 

настройки узнаем, как они выглядят то ? ) Задача, в общем то, такая - когда на путьл приходит сообщение (тревожное) , хозяину объекта должно посылаться смс на телефон. Смс решено отправлять через почтовый сервис оператора (неважно какого - нужные настройки пробьём) . Вот отсюда ноги растут.
Класс, который показал Джон, отправляет через outlook - а как без посредника то отправить ?
Аттач отправлять не требуется - чисто смс.

zubr, завтра попробую. А сейчас вопросик:
Цитата
:='EHLO 12345'

- опечатка или именно EHLO ? А то в мсдн я нашёл именно как HELO (см. код выше) и так я и пытался , может поэтому мне сервер не отвечал ?
Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 04-02-2008 18:34 » 

Алексей1153++, именно! не ошибка
http://cr.yp.to/smtp/client.html
« Последнее редактирование: 04-02-2008 18:41 от Sla » Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 04-02-2008 18:42 » 

понятненько
« Последнее редактирование: 04-02-2008 18:50 от Алексей1153++ » Записан

zubr
Гость
« Ответ #19 : 04-02-2008 19:11 » 

Если надо SMS посылать, то зачем через почту. Можно напрямую через GSM-модем. Или через веб-форму. В аттач выкладываю пример с CodeProject как посылать смс через вебформу, а вообще пошарься на Code Project - уверен, найдешь готовые примеры и отправки почты и отправки напрямую смс через GSM-модем.

Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 05-02-2008 05:18 » 

zubr, нет, требование - именно через почту
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 05-02-2008 05:55 » 

сдвиги кое какие есть, чёть позже отпишусь, а чичас такой вопрос - почему в ответе то
250 smtp6 . yandex . ru  ,  Hello 12345
то
250 smtp7 . yandex . ru  ,  Hello 12345

(а ещё - на месте 12345 что именно нужно ставить ?)
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #22 : 05-02-2008 06:24 » 

zubr, а там, где у тебя написано в примере

'AUTH LOGIN'+#13+#10+'rt96ghn='+#13+#10+'c2hnmkjerl=='+

что куда подставить надо , я так понимаю

rt96ghn - почтовый логин
c2hnmkjerl - почтовый пароль
?

пробую подставлять - приходит строка типа

220 Yandex ESMTP (NO UCE)(NO UBE) server ready at Tue, 5 Feb 2008 09:20:41 +0300
250 smtp8.yandex.ru Hello 12345
334 ghfftdxfhbjh
334 khbhfctfchgb
535 Authentication Failed
Записан

zubr
Гость
« Ответ #23 : 05-02-2008 07:55 » 

Цитата
что куда подставить надо , я так понимаю

rt96ghn - почтовый логин
c2hnmkjerl - почтовый пароль
Они зашифрованы. Какой механизм шифрации, честно говоря я не заморачивался, когда делал подобную программку. Просто настроил Outlook, важно в настройках указать создание лог-файла (меню Сервис->Параметры->закладка Обслуживание->чекбокс Почта). Все, что тебе надо будет - увидишь в лог-файле.
Цитата
а ещё - на месте 12345 что именно нужно ставить ?
Насколько я помню, что хочешь, никакого значения это не имеет.
Вот мой дельфийский код обмена сообщениями с почтовым сервером:
Код:
s:='EHLO 12345'+#13+#10+'AUTH LOGIN'+#13+#10+'rt96ghn='+#13+#10+'c2hnmkjerl=='+
  #13+#10+'MAIL FROM:blabla@mail.ru'+#13+#10+'RCPT TO:blabla@tut.by'+#13+#10+
  'DATA'+#13+#10+'From: <blabla@mail.ru>'+#13+#10+'To: <blabla@tut.by>'+#13+#10+
  'subject:Trn'+#13+#10+'MIME-Version: 1.0'+#13+#10;

 bf:=PChar(s);
 len:=send(sock, @bf^, Length(s), 0);
 If len<>Length(s) then
 begin
  Disconnect(sock);
  exit;
 end;

 GetMem(buf, 1000);
 While True do
 begin
  ZeroMemory(buf, 1000);
  recv(sock, @buf^, 1000, 0);
  s:=string(buf);
  If s='' then
  begin
   FreeMem(buf);
   Disconnect(sock);
   exit;
  end;
  If Pos('relaying authenticated', s)<>0 then
  begin
   break;
  end;
  If (Pos('421', s)<>0) or (Pos('450', s)<>0) or (Pos('451', s)<>0) or
   (Pos('500', s)<>0) or (Pos('501', s)<>0) or (Pos('502', s)<>0) or
   (Pos('503', s)<>0) or (Pos('504', s)<>0) or (Pos('554', s)<>0) or
   (Pos('550', s)<>0) or (Pos('553', s)<>0) or (Pos('551', s)<>0) or
   (Pos('573', s)<>0) then
  begin
   FreeMem(buf);
   Disconnect(sock);
   exit;
  end;
 end;
 FreeMem(buf);

 If not SendFile(filename, sock) then
 begin
  Disconnect(sock);
  exit;
 end;
 s:=#13+#10+#13+#10+#13+#10+'.'+#13+#10+'QUIT';
 bf:=PChar(s);
 len:=send(sock, @bf^, Length(s), 0);
 If len<>Length(s) then
 begin
  Disconnect(sock);
  exit;
 end;

 GetMem(buf, 1000);
 While True do
 begin
  ZeroMemory(buf, 1000);
  recv(sock, @buf^, 1000, 0);
  s:=string(buf);
  If s='' then
  begin
   FreeMem(buf);
   Disconnect(sock);
   exit;
  end;
  If Pos('message accepted for delivery', s)<>0 then
  begin
   //MessageBox(0, PChar(filename+' отправлено'), '', MB_OK+MB_ICONERROR);
   break;
  end;
  If (Pos('421', s)<>0) or (Pos('450', s)<>0) or (Pos('451', s)<>0) or
   (Pos('500', s)<>0) or (Pos('501', s)<>0) or (Pos('502', s)<>0) or
   (Pos('503', s)<>0) or (Pos('504', s)<>0) or (Pos('554', s)<>0) or
   (Pos('550', s)<>0) or (Pos('553', s)<>0) or (Pos('551', s)<>0) or
   (Pos('573', s)<>0) then
  begin
   FreeMem(buf);
   Disconnect(sock);
   exit;
  end;
 end;
 FreeMem(buf);
 Disconnect(sock);
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #24 : 05-02-2008 09:02 » 

zubr, нету там такой вкладки , хм...  Где должен лежать файл лога?
настроил я это уё***ще оутлук , попал на 10 метров трафика - а пользы никакой )))

в общем, насколько я понял, осталось только узнать, как шифруется пароль и логин
« Последнее редактирование: 05-02-2008 09:09 от Алексей1153++ » Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #25 : 05-02-2008 09:57 » 

да, всё дело было в шифрации, поставил the bat! , логи там есть - всё скатал оттуда и отправилось на ура )

Теперь бы узнать, что за алгоритмы используются при шифровании, и везде ли они одинаковые используются ?
Записан

zubr
Гость
« Ответ #26 : 05-02-2008 10:14 » 

Цитата
Теперь бы узнать, что за алгоритмы используются при шифровании, и везде ли они одинаковые используются ?
Не обязательно. Отправляй письма через свой почтовый сервер, да и все. Не, ну если время есть, то конечно интересно было бы. Поделись инфой тогда, если выяснишь.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 05-02-2008 10:23 » 

Леха, пожалей свое время Улыбаюсь - пиши на API!

Zubr, еще раз покритикую твой подход:

1. EHLO. Сервер может не работать с расширенным протоколом. Он отклонит вход. Надо будет войти еще раз, но с HELO.
2. После EHLO/HELO должна стоять идентификация клиента, а не произвольный текст!!! Для серверов тут ставят их доменное имя, для клиентов - email.
3. Методы аутентификации. Basic _может_ не быть! Также может потребоваться "сперва POP3 логин, потом SMTP отсылка".
4. Существуют и более сложные механизмы, ориентированные на борьбу со спамерами.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
zubr
Гость
« Ответ #28 : 05-02-2008 10:31 » 

RXL, так он уже все написал и в принципе свою задачу решил. Решение данной задачи заключается в использовании лога почтовой программы, конечно не универсальное решение, но проблему отправки почты через свой (известный) почтовый сервер решает.
Не спорю, через MAPI делать красивее и универсальнее.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #29 : 05-02-2008 10:33 » 

RXL, так вот чёта так проще оказалось ) Всего то - открыть сокет и одну строку отправить. Ну а если в апи шифровалка знаешь, где лежит - гавары Улыбаюсь)
Записан

Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines