Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > C++Builder Приём-передача SMS по SMTP протоколу.


Автор: Control 30.12.2005, 00:27
Всем привет ! Люди, пожалуйсто помогите разобратьсяв следующем :

Мне нужно написать программу, которая будит принимать отправляемые с оператора мобильной связи письма по SMTP протоколу, и после определённой обработки отправлять их ему обратно по тому-же каналу. Писать собираюсь на C++ Builder 6.

Но если честно, я ещё ниразу не работал с сетью и почтой. И имею довольно поверхностные знания в этой сфере.

По этому если вам не трудно, немогли-бы вы мне немного помочь разобраться с этим smile
Принцип работы самого протокола примерно ясен, налажевается 2х сторонняя связь между клиентом и сервером, клиент подаёт запросы, сервер пассивно на них отвечает. Я видил комманды типо HELO... но это всё как-то слишком низкоуровнево. Ведь есть уже готовые компоненты вроде idSMTP в INDY можно ли его использовать для этой цели ? Если да, то как его использовать, и если не трудно кто-нибудь мог бы скинуть пример его использования и доккументацию на русском языке ? smile

1) И ещё один вопорс : Если я буду отправлять почту на сервер этого мобильного оператора, я ведь должен делать это с уже имеющегося где-то почтового адреса, который физически существует и доступен ? Или это может быть любой фиктивный адрес, который может не существовать вовсе ?

2) И принимать почту с сервера того оператора, я тем-более должен буду на существующий адрес ? Иначе, как- же я смогу её принять и обработать ?

3) Тогда получается, что мне нужно будит создать для этого свой, собственный почтовый сервер ? А как это зделать ?

4) Или я смогу производить все операции через любой "Почтовик" используя его как посредника ? Например если у меня есть ящик зарегестрированный на mail.ru, я смогу получать все письма от оператора на него и обрабатывать их своей программой ? А что если он переполнится, или скажем если на него будит в день приходить по 300-500 писем, мне же его закроют, или запретят приём писем с IP адреса оператора сочтя эти письма за SPAM.

Подскажите пожалуйсто, как можно это всё организовать, и если не трудно, выложите пару примеров по 2х сторонней рассылке почты.



За ранее благодарю smile
С УВАЖЕНИЕМ
Control






Автор: Aleksandor 30.12.2005, 10:17
>Мне нужно написать программу, которая будит принимать отправляемые с оператора >мобильной связи письма по SMTP протоколу, и после определённой обработки отправлять их >ему обратно по тому-же каналу. Писать собираюсь на C++ Builder 6.

А что, существуют такие операторы предоставляющие (бесплатный?) шлюз к электронной почте (SMS->email)? Или там обычный почтовый сервак стоит?

Забирать письма ты можешь (по протоколу POP3) с сервера оператора, а чтобы отослать письма(по протоколу SMTP) нужен SMTP сервер - твоего провайдера или любой другой, но не на твоей машине. Кстати бывает что провайдеры в целях борьбы со спамом не разрешают пользоваться чужими SMTP серверами, только их собственным.

Автор: Control 30.12.2005, 19:41
Цитата(Aleksandor @ 30.12.2005, 10:17)
А что, существуют такие операторы предоставляющие (бесплатный?) шлюз к электронной почте (SMS->email)? Или там обычный почтовый сервак стоит ?

Да нет, в общем суть в следующем :

Оператор мобильной связи выделяет мне платный фиксированный номер. Далее каким-то образом, обрабатывает все входящие на данный номер sms сообщения и отправляет их содержимое мне ( как они сказали ) по протоколу SMTP. Только вот куда ? Все технические данные мне ещё только предстаит от них получить.

А может быть такое, что адресатом "приёмника" будит шлюз на ихнем же хосте ? То-есть они выделят мне какой-то адрес, на который их сервар будит сгружать все адресованные мне sms в виде почты, и дадут мне полный доступ к этому адресу. Следовательно отсылать письма на Их сервер, я буду с Их же клиента. Тогда получится, что весь транспорт данных будит осуществляться таким образом :

[email protected] <--> [email protected] ?

Я так понимаю, что у них там не просто "почтовик" стоит.

Кто-нибудь знает, КАК ЭТО ВСЁ РАБОТАТЬ ДОЛЖНО ? Буду очень признателен, ежели кто вразумит. smile smile

Автор: Aleksandor 30.12.2005, 21:00
Ну хорошо, значит шлюз они вам предоставили и будут отправлять sms на ваш почтовый ящик.
Таким образом читать вы их будете по протоколу POP3 а отправлять обратно по SMTP. Получается обычный почтовый клиент, но с возможностью какой-то дополнительной обработки данных smile Интересно какой, если не секрет?

Еще вариант - поставить у себя сервер SMTP "на прием" и клиент SMTP "на передачу", но это если имеется статический IP адрес и постоянное подключение к инету.

Автор: Control 3.1.2006, 18:59
Цитата(Aleksandor @ 30.12.2005, 20:00)
Получается обычный почтовый клиент, но с возможностью какой-то дополнительной обработки данных smile  Интересно какой, если не секрет ?


smile

Ну к примеру, пусть это будит услуга по информированию клиента (отправителя sms на мой номер) о курсах валют, или прогнозе погоды на завтра. Соответственно если запрос на обе эти услуги будут поступать на однин и тот-же тел. номер (который я орендую у оператора), моя программа должна будит при получении письма определить что именно хочет знать отправитель, инфо по погоде или по валюте ? Для этого, придётся использовать "Ключевые слова" допустим на погоду пусть будит WTR_MOSKOW. Где WTR - тип запрашиваемой услуги, а MOSKOW город по которому необходимо предоставить отвечающую на услугу информацию. Тоже-самое будит и на валюту, к примеру такое содержание sms : CURR_USD,RUR,LVL... будит соответствовать типу услуги Currency Rate а USD,RUR,LVL типу валют по которым нужно возвратить информацию. Ну и соответственно нужно будит выдрать из поступившего письма номер отправителя, чтоб ответить на его запрос, и занести в базу, если он подписался на ежедневную рассылку к примеру.

Aleksandor уважительная просьба, не могли бы Вы кинуть простенький пример по приёму-передаче писем между двумя адресатаи. По содержанию примерно токого рода : ввожу адрес почты, и программа постоянно следит о поступлении на него новых писем с другово известного адреса, как только с него пришло письмо, в Мемо автоматически вывести его содержимое. Или если не трудно, разъясните пожалуйсто, как это нужно организовать. smile Но лучше конечно пример. smile

С Уважением Control.

Автор: Aleksandor 3.1.2006, 19:50
Мне кажется в Вашем случае, если есть возможность постоянного подключения к провайдеру и статический IP адрес (у нас в Москве это можно организовать в СТРИМ за $25/мес) то лучше написать серверную часть SMTP клиента, не полный SMTP сервер, а только код необходимый для приема сообщений от оператора. Вторая часть - это обычный почтовый клиент отсылающий письма на SMTP сервер оператора после обработки.

Во втором случае (если используется внешний POP сервер) то все как в стандартной почтовой проге - пусть она соединяется с сервером каждые 1-2 минуты и забирает почту. Юзайте в Яндексе описание протоколов SMTP и POP3 - протоколы очень простые smile

Автор: Control 3.1.2006, 20:57
Цитата(Aleksandor @ 3.1.2006, 18:50)
SMTP и POP3 - протоколы очень простые smile


А можно для этих целей использовать Indy компоненты C++ Builder 6 ? Но я видил в Delphi 7 - Indy SMTP Client и Indy SMTP Server, в то время, как в C++Builder 6 только один компонент idSMTP. Или он может выполнять функции и клиента и сервера ?

Может есть где простенький, но наглядный пример smile Я просто впервые работаю с сетью и протоколами smile

Автор: Control 4.1.2006, 01:03
Вот, накидал ТАКОЙ код, использовал компоненты с закладок Indy : IdSMTP и IdMessage :
Код

//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  IdMessage1->Body->Assign(Memo1->Lines);
  IdMessage1->From->Text = "[email protected]"; 
  IdMessage1->Subject  = "Mail From Control"; 
//IdMessage1->charset = "ISO-8859-1";
//IdMessage1->charset = "US-ASCII";
  IdMessage1->Recipients->EMailAddresses = "[email protected]"; 
  IdMessage1->Priority = TIdMessagePriority(mpHighest); 
  IdMessage1->CCList->EMailAddresses = "[email protected]";
// IdMessage1->BccList->EMailAddresses = ReadIni("smtp","FromAdress","Options.ini"); 

 IdSMTP1->Host = "mail.yahoo.com";
 IdSMTP1->UserId = "user";
 IdSMTP1->Password = "enigma";
 IdSMTP1->Port = 25;
 IdSMTP1->MailAgent = "Test TidSMTP"; 
 IdSMTP1->AuthenticationType = atLogin;
//idSMTP1.AuthenticationType := atNone;

try
   {
    try
       {
          if (IdSMTP1->Connected()) IdSMTP1->Disconnect(); 
              IdSMTP1->Connect(); 
              IdSMTP1->Send(IdMessage1);
       }
       catch (Exception &exception)
            {
             IdSMTP1->Disconnect();
             MessageDlg("Application, may not connected", mtError, TMsgDlgButtons() << mbYes, 0);
             Abort;
            }

             // My Code Here
    }
     catch (Exception &exception)
          {
           Application->ShowException(&exception);
           IdSMTP1->Disconnect();
          }
}
//---------------------------------------------------------------------------

Но почему-то ничего не передаётся, долго думает, а потом выдаёт вот такое уведомление о произведённой ошибке :
Цитата
Project Project1.exe raised exception class EIdSocketError with message 'Socket Error # 10060 Connection timed out.'

и за ним
Цитата
Project Project1.exe raised exception class EIdSocketError with message 'Socket Error # 10057 Connection timed out.'


Указывал в хосте и mail.yahoo.com и smtp.yahoo.com всё равно одно и то-же происходит. Пожалуйсто помогите разобратья. smile


Автор: Control 5.1.2006, 20:01
Ну, может кто сможет ответить на мой вопрос ? Если конечно не затруднит.

Автор: L0n3R4ng3r 13.4.2006, 13:38
скорей всего поблема в следущем:
На многих смтп серверах стоит защита от спама тоесть стоит аутенфикация по юзеру + иногда с помощью как-нибуть алгоритма шифрования, может стоит там копать. Наверное для таких целей действительно прийдеться ставит свой смтп сервер.

Автор: КУБ 29.9.2006, 23:06
Цитата(Control @  4.1.2006,  01:03 Найти цитируемый пост)
использовал компоненты с закладок Indy : IdSMTP и IdMessage 


А что "IdMessage" есть такой компонент на вкладке? smile  Что то ненайду

Автор: Alca 31.8.2009, 14:40
Цитата

А что "IdMessage" есть такой компонент на вкладке?   Что то ненайду

Есть, вкладка Инди

Добавлено через 2 минуты и 28 секунд
Код

 IdSMTP1->UserId = "user";
 IdSMTP1->Password = "enigma"; 

Логин и пароль может в Бэйз64 конвертнуть?



Автор: mrbrooks 31.8.2009, 14:47
 smile 
smile Alca, на некро потянуло?

Автор: Олег2005 31.8.2009, 16:48
Нда.......
что, удалять? smile 

Автор: Alca 31.8.2009, 17:56
mrbrooks, дату провтыкал

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)