С постепенным падением цен на услуги мобильной связи, «трубу» может позволить себе завести даже студент. Однако после месяца эйфории и наслаждения собственной крутизной неожиданно понимаешь, что простой стипендии и подработок явно не хватает для более или менее комфортного общения с друзьями. Некоторые особо шустрые умудряются передавать свои мысли товарищу за бесплатные несколько секунд, однако всем ясно, что это не выход.

Решение напрашивалось само собой. Посетив сайты наиболее популярных в моем городе компаний «Киевстар», UMC и Golden Telecom, я обнаружил весьма интересные разделы, посвященные отправке SMS-сообщений на мобилки через Глобальную Сеть. «Вот то, что мне надо» — подумал я и немедленно уселся за Delphi.

Технология отправки сообщений через Интернет была довольно проста: заполнив поля на соответствующей страничке сайта, пользователь фактически отправлял обычное письмо e-mail, адрес которого определялся таким образом:

38<префикс_оператора><номер_абонента>@<почтовый_сервер_оператора>

Мне предстояло написать программу, которая, в зависимости от выбранного оператора, отправляла бы e-mail сообщение по тому или иному адресу. Конечно, категория мобильности в этом случае распространяется лишь на моего друга, у которого при себе телефон — я-то ведь должен буду сидеть дома за компьютером. Но чем не пожертвуешь, стремясь сэкономить!

«Как же можно сэкономить с помощью твоей программы?» — спросите. Очень просто. Клиентам «Киевстар», например, отправка сообщения обходится в 0.33 грн. Нашей же программе (на ПК с Windows 9x и 28.8-Кбит/c модемом) для отправки сообщения потребуется около 15-25 секунд интернет-времени, что даже в сумме с повременкой за телефон составит не более 0.1 грн в бизнес-время. Это почти в 3 раза дешевле обычного SMS. Немного проигрывая в мобильности связи, мы здорово выигрываем в ее цене!

Итак, если я вас убедил, пора приступать. На пустой форме создадим объекты ComboBox для выбора оператора, кнопку Button1 для непосредственной отправки письма, NmSmtp для взаимодействия с почтовым сервером. Также нам понадобится Memo для ввода текста письма (текст не должен содержать форматирования) и целая куча Edit`ов (для ввода номера абонента, темы письма, обратного адреса и smtp-сервера, через который, собственно, будут уходить сообщения). Интерфейсная часть программы почти готова.

Теперь пришло время для написания кода.

Сначала пользователь должен будет выбрать оператора связи из списка ComboBox1.

В качестве примера составим наш список следующим образом: Киевстар Ace&Base, Киевстар Контракт, UMC, Golden Telecom. Естественно, вы можете добавить сюда и других операторов мобильной связи, пользующихся уважением в вашей местности :-). Пишем процедуру выбора:

procedure TForm1.ComboBox1Change(Sender: TObject); begin if ComboBox1.ItemIndex=0 then Nomer.Text:='38067'; if ComboBox1.ItemIndex=1 then Nomer.Text:='38067'; if ComboBox1.ItemIndex=2 then Nomer.Text:='38050'; if ComboBox1.ItemIndex=3 then Nomer.Text:='38044'; end;

Как видим, в зависимости от выбора пользователя программа записывает в поле для указания номера абонента (у меня это Nomer) префикс номера соответствующей сети. После этого лишь остается вручную дополнить номер.

Немаловажная деталь: у большинства операторов мобильной связи SMS-сообщение должно содержать не более 120-160 символов, причем сюда входят и текст послания, и тема, и обратный адрес. Поэтому наша программа должна сама предупреждать многословного пользователя об окончании лимита символов. А сделаем мы это с помощью еще одного объекта Edit1 (для вывода информации об оставшихся символах) и объекта Timer1 (для регулярного обновления этой информации):

procedure TForm1.Timer1Timer(Sender: TObject); var sum,str :integer; begin Sum:=0; for str:= 0 to Memo1.Lines.Count-1 do Sum:=Sum+length(Memo1.Lines.Strings[str]); if sum>94 then Edit1.Color:=clYellow; if sum>104 then Edit1.Color:=clRed; if sum<=94 then Edit1.Color:=clWindow; Edit1.Text:=IntToStr(120-sum); end;

Объясняю работу этого довольно простого алгоритма. Мы объявляем две переменные для суммы символов и для пересчета строк. Сумме присваивается значение 0. После этого сканируем построчно поле для ввода текста сообщения (Memo1) и к сумме добавляем длину текущей строки.

Теперь допустим, что средняя длина SMS-сообщения без темы и обратного адреса равна 120 символам. При достижении количества символов 95 окошко Edit1 окрасится в предупреждающий желтый цвет, а при достижении 105 — в красный. Не забудем в свойствах объекта Memo1 указать максимальную длину текста 120 символов (Memo1.MaxLength:=120;). Сделать это лучше в окне Object Inspector. Максимальную длину темы сообщения тоже лучше указать — пусть она будет в пределах 10-20 символов.

После всех операций в Edit1 записывается количество еще доступных для ввода символов.

Вот, в принципе, и вся основная часть программы. Теперь нам лишь осталось написать код для отправки сообщения. Вот как выглядит исходник процедуры нажатия на кнопку отправки:

TForm1.Button1Click(Sender:Tobject); begin NMSMTP1.PostMessage.FromAddress:=replyemail.text; // Укажем ответный адрес, он будет виден абоненту при получении сообщения NMSMTP1.PostMessage.Subject:=Subj.Text; // Укажем тему сообщения NMSMTP1.PostMessage.Body.Clear; // Очистим тело сообщения NMSMTP1.PostMessage.Body.AddStrings(Memo1.Lines); // Запишем в тело письма текст из объекта Memo {Дальше проверяем, какого оператора выбрал пользователь, и в зависимости от этого к номеру абонента добавляем «собачку» и имя почтового сервера оператора} if ComboBox1.ItemIndex=0 then Edit8.Text:=Nomer.Text+'@2sms.kyivstar.net'; // для абонентов Ace&Base if ComboBox1.ItemIndex=1 then Edit8.Text:=Nomer.Text+'@sms.kyivstar.net'; // для контрактных абонентов if ComboBox1.ItemIndex=2 then Edit8.Text:=Nomer.Text+'@sms.umc.com.ua'; // для клиентов UMC if ComboBox1.ItemIndex=3 then Edit8.Text:=Nomer.Text+'@sms.goldentele.com'; // для клиентов Golden Telecom NMSMTP1.PostMessage.ToAddress.Add(Edit8.Text); NMSMTP1.Host:=smtp.Text; NMSMTP1.Port:=25; // порт для отправки почты NMSMTP1.Connect; NMSMTP1.SendMail; NMSMTP1.Disconnect; ShowMessage('Сообщение было успешно отправлено на номер '+Nomer.Text); end;

Комментарий: replyemail, subj, smtp и Edit8 — объекты TEdit, соответственно, для указания обратного адреса, темы сообщения, адреса почтового сервера и для формирования окончательного адреса, на который уйдет наше SMS.

После этого можно украсить программу наворотами для собственного удобства — например, приспособить ее для массовой рассылки SMS друзьям или клиентам.

В общем, удачи вам, а также смелых и компилирующихся :-) идей!