Главная->Уроки по php->Отправка SMS при помощи PHP
Отправка SMS при помощи PHP
В наше время SMS широко применяются в веб-технологиях. Их используют для того, чтобы сообщить клиентам о свежих новостях, событиях и продуктах. Именно поэтому растёт рост разработчиков, которые интересуются данным инструментом. В этом уроке мы рассмотрим фундаментальные основы отправки текстовых сообщений при помощи PHP. Вступление Для того, чтобы отправить SMS через PHP не нужно много трудиться. Ниже вы можете увидеть схему, которая показывает весь процесс отправки текстового сообщения с веб-приложения на беспроводное устройство. Начинаем разбор: Текстовое сообщение сжимается веб-приложением, которое находится на HTTP сервере и после этого отправляется через Интернет (облачко) как email сообщение; Short Message Service Gateway (SMS Gateway) получает сообщение и конвертирует его из email сообщения в SMS сообщение; Впоследствии Short Message Service Center (SMSC), который по сути является роутером для мобильных устройств принимает сообщение; В конце концов, сообщение приходит к получателю по беспроводной сети; Большинство беспроводных сетей имеют в наличии инструмент, который преобразовывает email сообщения в SMS. Для разработчиков это является бесплатным, а для конечных получателей не всегда, т.к. им может прийти счёт за не сетевое сообщение. Email в SMS Для того, чтобы превратить email сообщение в SMS, вам понадобятся 2 вещи: Номер телефона или ID телефонного устройства на которое вы будете отправлять сообщение; Домен беспроводной сети (их можно найти тут) Оно может выглядеть приблизительно так: [email protected] phoneNumber это номер телефона на который будет отправлен SMS. domainName.com - адрес SMS Gateway (системы, через которую будет отослан ваш смс); Для того, чтобы отправить SMS мистеру Example, вам необходимо в графе получателя в вашем почтовом клиенте написать [email protected] и отправить письмо. Оно будет доставлено на номер +1 (385) 555-0168 через беспроводную сеть Verizon. К примеру, я пошлю сообщение самому себе через Gmail: Когда я получу сообщение оно будет выглядеть следующим образом: Функция mail() Давайте двигаться дальше. Для отправки SMS сообщений мы можем использовать всеми известную функцию mail(), которая имеет следующую сигнатуру: bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) Тут вы можете узнать о ней больше. $to это получатель текстового сообщения. Валидные данные: [email protected] [email protected], [email protected] User <[email protected]> User1 <[email protected]>, User2 <[email protected]> $subject это тема сообщения, которая в общих чертах описывает содержание письма. Для SMS она не требуется; $message это само сообщение, которое будет доставлено. Согласно PHP документации каждая строка сообщения должна заканчиваться символом (\n) и не должна быть длиннее 70 символов; Переделаем наш пример: 1 mail( '[email protected]', '', 'Testing' ); Тестируем Давайте же проведём тест и убедимся, что через функцию mail() можно отправлять SMS сообщения. Используем следующий код: 1 <?php 2 var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) 3 ?> Сообщение, которое пришло на мой мобильный телефон выглядит так: Как вы видите, сообщение пришло через систему Gmail. Это произошло из-за того, что я выставил соответствующие настройки для отправки сообщений с локальной машины. Добавляем Юзабилити Структура Теперь я хочу предложить вам создать небольшую форму для отправки SMS с сайта. Она имеет следующую структуру: 01 <!DOCTYPE html> 02 <head> 03 <meta charset="utf-8" /> 04 </head> 05 <body> 06 <div id="container"> 07 <h1>Sending SMS with PHP</h1> 08 <form action="" method="post"> 09 <ul> 10 <li> 11 <label for="phoneNumber">Phone Number</label> 12 <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> 13 <li> 14 <label for="carrier">Carrier</label> 15 <input type="text" name="carrier" id="carrier" /> 16 </li> 17 <li> 18 <label for="smsMessage">Message</label> 19 <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> 20 </li> 21 <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> 22 </ul> 23 </form> 24 </div> 25 </body> 26 </html> Стиль Давайте немного её оформим: 01 body { 02 margin: 0; 03 padding: 3em 0; 04 color: #fff; 05 background: #0080d2; 06 font-family: Georgia, Times New Roman, serif; 07 } 08 09 #container { 10 width: 600px; 11 background: #fff; 12 color: #555; 13 border: 3px solid #ccc; 14 -webkit-border-radius: 10px; 15 -moz-border-radius: 10px; 16 -ms-border-radius: 10px; 17 border-radius: 10px; 18 border-top: 3px solid #ddd; 19 padding: 1em 2em; 20 margin: 0 auto; 21 -webkit-box-shadow: 3px 7px 5px #000; 22 -moz-box-shadow: 3px 7px 5px #000; 23 -ms-box-shadow: 3px 7px 5px #000; 24 box-shadow: 3px 7px 5px #000; 25 } 26 27 ul { 28 list-style: none; 29 padding: 0; 30 } 31 32 ul > li { 33 padding: 0.12em 1em 34 } 35 36 label { 37 display: block; 38 float: left; 39 width: 130px; 40 } 41 42 input, textarea { 43 font-family: Georgia, Serif; 44 } Вот что у нас получилось: Пишем скрипт Это сама сложная часть данного урока. Прошу внимания: 01 <?php 02 if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { 03 if ( 04 isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && 05 !empty( $_REQUEST['phoneNumber'] ) && 06 !empty( $_REQUEST['carrier'] ) 07 ) { 08 $message = wordwrap( $_REQUEST['smsMessage'], 70 ); 09 $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; 10 $result = @mail( $to, '', $message ); 11 print 'Сообщение было отослано ' . $to; 12 } else { 13 print 'Заполните все поля.'; 14 } 15 } 16 ?> В первую очередь скрипт проверяет была ли отправлена информация; Если да, то он проверяет наличие phoneNumber, carrier и smsMessage. Это полезно когда на странице больше чем одна форма; Если phoneNumber, carrier, smsMessage доступны, а phoneNumber и carrier не пусты, то мы можем отправлять сообщение; В сообщении не должны быть строки, превышающие 70 символов. Для разбиения сообщения на строки мы можем использовать функцию wordwrap; phoneNumber и carrier конкатенируются для того, чтобы сформировать адрес получателя; Если данные не прошли валидацию, то скрипт выдаст сообщение “Заполните все поля”; В конце концов функция mail вернёт нам истину или ложь. Результат мы помещаем в переменную $result для дальнейшей проверки. Запомните, что mail() возвращает результат отправки сообщения и всё. Дошло письмо или нет - остаётся неизвестным. Финальный код 01 <?php 02 03 if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { 04 if ( 05 isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && 06 !empty( $_REQUEST['phoneNumber'] ) && 07 !empty( $_REQUEST['carrier'] ) 08 ) { 09 $message = wordwrap( $_REQUEST['smsMessage'], 70 ); 10 $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; 11 $result = @mail( $to, '', $message ); 12 print 'Сообщение было отослано ' . $to; 13 } else { 14 print 'Заполните все поля.'; 15 } 16 } 17 18 ?> 19 <!DOCTYPE html> 20 <head> 21 <meta charset="utf-8" /> 22 <style> 23 body { 24 margin: 0; 25 padding: 3em 0; 26 color: #fff; 27 background: #0080d2; 28 font-family: Georgia, Times New Roman, serif; 29 } 30 31 #container { 32 width: 600px; 33 background: #fff; 34 color: #555; 35 border: 3px solid #ccc; 36 -webkit-border-radius: 10px; 37 -moz-border-radius: 10px; 38 -ms-border-radius: 10px; 39 border-radius: 10px; 40 border-top: 3px solid #ddd; 41 padding: 1em 2em; 42 margin: 0 auto; 43 -webkit-box-shadow: 3px 7px 5px #000; 44 -moz-box-shadow: 3px 7px 5px #000; 45 -ms-box-shadow: 3px 7px 5px #000; 46 box-shadow: 3px 7px 5px #000; 47 } 48 49 ul { 50 list-style: none; 51 padding: 0; 52 } 53 54 ul > li { 55 padding: 0.12em 1em 56 } 57 58 label { 59 display: block; 60 float: left; 61 width: 130px; 62 } 63 64 input, textarea { 65 font-family: Georgia, Serif; 66 } 67 </style> 68 </head> 69 <body> 70 <div id="container"> 71 <h1>Sending SMS with PHP</h1> 72 <form action="" method="post"> 73 <ul> 74 <li> 75 <label for="phoneNumber">Phone Number</label> 76 <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> 77 <li> 78 <label for="carrier">Carrier</label> 79 <input type="text" name="carrier" id="carrier" /> 80 </li> 81 <li> 82 <label for="smsMessage">Message</label> 83 <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> 84 </li> 85 <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> 86 </ul> 87 </form> 88 </div> 89 </body> 90 </html> Проблемы, которые могли у вас возникнуть Ошибки на локальном хосте Для того, чтобы пользоваться функцией mail у вас должен быть настроен локальный почтовый сервер. Если он у вас есть, то отправка сообщения произойдёт успешно. Если нет, то вы получите сообщение типа этого: Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in C:\wamp\www\sms\mail-test.php … для того, чтобы всё заработало, вам необходимо поставить mail сервер, но это не входит в рамки данного урока. Если у вас на локальной машине установлен XAMPP http://www.apachefriends.org/en/xampp.html, то вы с лёгкостью исправите ситуацию. Если же у вас WAMP, MAMP, LAMP, SAMP или OAMP, попробуйте установить Mercury Mail PHPMailer Для того, чтобы не возиться с локальным почтовым сервером, я предлагаю воспользоваться PHPMailer-ом http://phpmailer.worxware.com/. Ниже я приведу пример подключения PHPMailer-а к Gmail SMTP серверу, через который вы сможете отправлять сообщения. Данный код надо просто заинклудить в ваш скрипт: 01 require 'class.phpmailer.php'; 02 03 // Создаём объект класса 04 $mail = new PHPMailer(); 05 06 // Настройка SMTP 07 $mail->IsSMTP(); // Настройка SMTP подключения 08 $mail->SMTPDebug = 2; // Вывод отладочной информации 09 $mail->SMTPAuth = true; // Подключение к SMTP требует авторизацию 10 $mail->SMTPSecure = "tls"; // Подключаемся, используя TLS 11 $mail->Host = "smtp.gmail.com"; 12 $mail->Port = 587; 13 $mail->Encoding = '7bit'; 14 15 // Авторизация 16 $mail->Username = "[email protected]"; // Логин 17 $mail->Password = "password"; // Пароль 18 19 // Проверка 20 $mail->Subject = "Testing"; // Тема 21 $mail->Body = "Testing"; // Сообщение 22 23 // Отправка 24 $mail->AddAddress( "##########@vtext.com" ); // Получатель 25 var_dump( $mail->send() ); // Отправить! Данный код должен вывести что-то подобное: В вашем случае может быть придётся поиграться с настройками. Если вы планируете использовать Gmail, то эта информация будет вам полезна. Вывод Конечно, существуют и другие техники отправки текстовых сообщений. Этот способ подойдёт тем, кто будет отправлять не больше 1000 SMS в месяц. Альтернативы данной системы: Использование SMS Gateway Provider; Через Google можно много такого найти; SMS gateway providers предоставляют специальные API, которые будут использованы для отправки SMS через их веб-сервера; Можете подобрать специальный пакет, который будет удовлетворять ваши SMS потребности; Вы можете арендовать короткие номера; Использование GSM модема: Это более дорогой вариант, т.к. придётся покупать специальный модем и заключать контракт с какой-то беспроводной сетью; Вам так же придётся использовать Hayes-команды; Использование прямого подключения к беспроводной сети, потребует от вас заключение контракта и целую кучу денег. Я надеюсь у меня получилось осветить тему отправки SMS сообщений через PHP. Надеюсь урок вам понравился. Спасибо за внимание.