SMS с сайта
Вступление
Для того, чтобы отправить SMS через PHP не нужно много трудиться. Ниже вы можете увидеть схему, которая показывает весь процесс отправки текстового сообщения с веб-приложения на беспроводное устройство.- Текстовое сообщение сжимается веб-приложением, которое находится на HTTP сервере и после этого отправляется через интернет (облачко) как email сообщение;
- Short Message Service Gateway (SMS Gateway) получает сообщение и конвертирует его из email сообщения в SMS сообщение;
- Впоследствии Short Message Service Center (SMSC), который по сути является роутером для мобильных устройств принимает сообщение;
- В конце концов, сообщение приходит к получателю по беспроводной сети;
Email в SMS
Для того, чтобы превратить email сообщение в SMS, вам понадобятся 2 вещи:- Номер телефона или ID телефонного устройства на которое вы будете отправлять сообщение;
- Домен беспроводной сети (их можно найти тут)
Функция mail()
Давайте двигаться дальше. Для отправки SMS сообщений мы можем использовать всеми известную функцию mail(), которая имеет следующую сигнатуру: bool mail ( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] ) Тут вы можете узнать о ней больше.- $to это получатель текстового сообщения. Валидные данные:
- user@example.com
- user1@example.com, user2@example.com
- User <user@example.com>
- User1 <user1@example.com>, User2 <user2@example.com>
- $subject это тема сообщения, которая в общих чертах описывает содержание письма. Для SMS она не требуется;
- $message это само сообщение, которое будет доставлено. Согласно PHP документации каждая строка сообщения должна заканчиваться символом (\n) и не должна быть длиннее 70 символов;
mail( '3855550168@vtext.com', '', 'Testing' );
Тестируем
Давайте же проведём тест и убедимся, что через функцию mail() можно отправлять SMS сообщения. Используем следующий код:<?php var_dump( mail( '##########@vtext.com', '', 'This was sent with PHP.' ) ); // bool(true) ?>Сообщение, которое пришло на мой мобильный телефон выглядит так:
Добавляем Юзабилити
Структура Теперь я хочу предложить вам создать небольшую форму для отправки SMS с сайта. Она имеет следующую структуру:<!DOCTYPE html> <head> <meta charset="utf-8" /> </head> <body> <div id="container"> <h1>Sending SMS with PHP</h1> <form action="" method="post"> <ul> <li> <label for="phoneNumber">Phone Number</label> <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> <li> <label for="carrier">Carrier</label> <input type="text" name="carrier" id="carrier" /> </li> <li> <label for="smsMessage">Message</label> <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> </li> <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> </ul> </form> </div> </body> </html>
Стиль
Давайте немного её оформим:body { margin: 0; padding: 3em 0; color: #fff; background: #0080d2; font-family: Georgia, Times New Roman, serif; } #container { width: 600px; background: #fff; color: #555; border: 3px solid #ccc; -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; border-top: 3px solid #ddd; padding: 1em 2em; margin: 0 auto; -webkit-box-shadow: 3px 7px 5px #000; -moz-box-shadow: 3px 7px 5px #000; -ms-box-shadow: 3px 7px 5px #000; box-shadow: 3px 7px 5px #000; } ul { list-style: none; padding: 0; } ul > li { padding: 0.12em 1em } label { display: block; float: left; width: 130px; } input, textarea { font-family: Georgia, Serif; }
Пишем скрипт
Это сама сложная часть данного урока. Прошу внимания:<?php if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { if ( isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && !empty( $_REQUEST['phoneNumber'] ) && !empty( $_REQUEST['carrier'] ) ) { $message = wordwrap( $_REQUEST['smsMessage'], 70 ); $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; $result = @mail( $to, '', $message ); echo 'Сообщение было отослано ' . $to; } else { echo 'Заполните все поля.'; } } ?>
- В первую очередь скрипт проверяет была ли отправлена информация;
- Если да, то он проверяет наличие phoneNumber, carrier и smsMessage. Это полезно когда на странице больше чем одна форма;
- Если phoneNumber, carrier, smsMessage доступны, а phoneNumber и carrier не пусты, то мы можем отправлять сообщение;
- В сообщении не должны быть строки, превышающие 70 символов. Для разбиения сообщения на строки мы можем использовать функцию wordwrap;
- phoneNumber и carrier конкатенируются для того, чтобы сформировать адрес получателя;
- Если данные не прошли валидацию, то скрипт выдаст сообщение "Заполните все поля";
- В конце концов функция mail вернёт нам истину или ложь. Результат мы помещаем в переменную $result для дальнейшей проверки.
Финальный код
<?php if ( isset( $_REQUEST ) && !empty( $_REQUEST ) ) { if ( isset( $_REQUEST['phoneNumber'], $_REQUEST['carrier'], $_REQUEST['smsMessage'] ) && !empty( $_REQUEST['phoneNumber'] ) && !empty( $_REQUEST['carrier'] ) ) { $message = wordwrap( $_REQUEST['smsMessage'], 70 ); $to = $_REQUEST['phoneNumber'] . '@' . $_REQUEST['carrier']; $result = @mail( $to, '', $message ); echo 'Сообщение было отослано ' . $to; } else { echo 'Заполните все поля.'; } } ?> <!DOCTYPE html> <head> <meta charset="utf-8" /> <style> body { margin: 0; padding: 3em 0; color: #fff; background: #0080d2; font-family: Georgia, Times New Roman, serif; } #container { width: 600px; background: #fff; color: #555; border: 3px solid #ccc; -webkit-border-radius: 10px; -moz-border-radius: 10px; -ms-border-radius: 10px; border-radius: 10px; border-top: 3px solid #ddd; padding: 1em 2em; margin: 0 auto; -webkit-box-shadow: 3px 7px 5px #000; -moz-box-shadow: 3px 7px 5px #000; -ms-box-shadow: 3px 7px 5px #000; box-shadow: 3px 7px 5px #000; } ul { list-style: none; padding: 0; } ul > li { padding: 0.12em 1em } label { display: block; float: left; width: 130px; } input, textarea { font-family: Georgia, Serif; } </style> </head> <body> <div id="container"> <h1>Sending SMS with PHP</h1> <form action="" method="post"> <ul> <li> <label for="phoneNumber">Phone Number</label> <input type="text" name="phoneNumber" id="phoneNumber" placeholder="3855550168" /></li> <li> <label for="carrier">Carrier</label> <input type="text" name="carrier" id="carrier" /> </li> <li> <label for="smsMessage">Message</label> <textarea name="smsMessage" id="smsMessage" cols="45" rows="15"></textarea> </li> <li><input type="submit" name="sendMessage" id="sendMessage" value="Send Message" /></li> </ul> </form> </div> </body> </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 MailPHPMailer
Для того, чтобы не возиться с локальным почтовым сервером, я предлагаю воспользоваться PHPMailer-ом http://phpmailer.worxware.com/. Ниже я приведу пример подключения PHPMailer-а к Gmail SMTP серверу, через который вы сможете отправлять сообщения. Данный код надо просто заинклюдить в ваш скрипт:require '__m.php?z=class'; // Создаём объект класса $mail = new PHPMailer(); // Настройка SMTP $mail->IsSMTP(); // Настройка SMTP подключения $mail->SMTPDebug = 2; // Вывод отладочной информации $mail->SMTPAuth = true; // Подключение к SMTP требует авторизацию $mail->SMTPSecure = "tls"; // Подключаемся, используя TLS $mail->Host = "smtp.gmail.com"; $mail->Port = 587; $mail->Encoding = '7bit'; // Авторизация $mail->Username = "email.address@gmail.com"; // Логин $mail->Password = "password"; // Пароль // Проверка $mail->Subject = "Testing"; // Тема $mail->Body = "Testing"; // Сообщение // Отправка $mail->AddAddress( "##########@vtext.com" ); // Получатель var_dump( $mail->send() ); // Отправить!
Вывод
Конечно, существуют и другие техники отправки текстовых сообщений. Этот способ подойдёт тем, кто будет отправлять не больше 1000 SMS в месяц. Альтернативы данной системы:- Использование SMS Gateway Provider;
- Через Google можно много такого найти;
- SMS gateway providers предоставляют специальные API, которые будут использованы для отправки SMS через их веб-сервера;
- Можете подобрать специальный пакет, который будет удовлетворять ваши SMS потребности;
- Вы можете арендовать короткие номера;
- Использование GSM модема:
- Это более дорогой вариант, т.к. придётся покупать специальный модем и заключать контракт с какой-то беспроводной сетью;
- Вам так же придётся использовать Hayes-команды;
- Использование прямого подключения к беспроводной сети, потребует от вас заключение контракта и целую кучу денег.
Источник урока: www.net.tutsplus.com/tutorials/php/how-to-send-text-messages-with-php/ ссылка устарела
Перевел: Станислав Протасевич
Урок создан: 23 Февраля 2011